มีการใช้ตัวแปรหนึ่งตัวอักษรใน Java หรือไม่? ในตัวอย่างโค้ดหรือแบบฝึกหัดคุณมักจะเห็นมัน ฉันไม่สามารถจินตนาการได้ว่ามีการใช้งานสิ่งเหล่านี้เพราะมันทำให้โค้ดอ่านยากขึ้นและฉันไม่เคยเห็นมันถูกใช้ในภาษาการเขียนโปรแกรมอื่น!
มีการใช้ตัวแปรหนึ่งตัวอักษรใน Java หรือไม่? ในตัวอย่างโค้ดหรือแบบฝึกหัดคุณมักจะเห็นมัน ฉันไม่สามารถจินตนาการได้ว่ามีการใช้งานสิ่งเหล่านี้เพราะมันทำให้โค้ดอ่านยากขึ้นและฉันไม่เคยเห็นมันถูกใช้ในภาษาการเขียนโปรแกรมอื่น!
คำตอบ:
การตั้งชื่อให้ถูกต้องเป็นเรื่องยาก ยากมาก. หากคุณมองไปทางอื่นคุณสามารถใช้สิ่งนี้เพื่อหมายความว่าสิ่งที่ตั้งชื่ออย่างถูกต้องมีความสำคัญ (ไม่เช่นนั้นทำไมคุณต้องใช้ความพยายามในการตั้งชื่อ)
แต่บางครั้งชื่อของสิ่งต่าง ๆ ก็ไม่สำคัญ นั่นเป็นเหตุผลที่เรามีสิ่งต่าง ๆ เช่นฟังก์ชั่นที่ไม่ระบุชื่อ ("lambdas") ตัวอย่างเช่น: เพราะบางครั้งมันก็ไม่คุ้มค่าที่จะตั้งชื่อสิ่งของ
มีตัวอย่างมากมายที่ชื่อตัวแปรตัวอักษร (หรือสั้นมาก) เหมาะสม:
i, j, k, lดัชนีห่วงkและvสำหรับคีย์และค่าในแผนที่nสำหรับตัวเลข (เช่นในMath.abs(n))a, b, cสำหรับวัตถุพล (เช่นในmax(a, b))eสำหรับองค์ประกอบในfor eachลูปทั่วไปf สำหรับฟังก์ชันในฟังก์ชันลำดับสูงกว่าp สำหรับฟังก์ชันเพรดิเคตในตัวกรองT, T1, T2... สำหรับตัวแปรประเภทE สำหรับตัวแปรประเภทที่เป็นตัวแทนประเภทองค์ประกอบของคอลเลกชันR สำหรับตัวแปรประเภทที่แสดงถึงประเภทผลลัพธ์ของฟังก์ชันexสำหรับข้อยกเว้นในcatchข้อop สำหรับการดำเนินการในแผนที่หรือพับsเพื่อระบุพหูพจน์เช่นการสะสม (เช่นnsการรวบรวมตัวเลขxsและysการรวบรวมวัตถุทั่วไปสองชุดโดยพลการ)ฉันไม่เคยเห็นพวกมันถูกใช้ในภาษาการเขียนโปรแกรมอื่นเลย!
พวกมันเป็นเรื่องธรรมดามากในทุกภาษาที่ฉันรู้ (และน่าจะเป็นในภาษาที่ฉันไม่รู้) Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle D, Go, C ++, C คุณตั้งชื่อมัน
kและlในดัชนีห่วงที่ไกลเกินไป(คุณไม่ควรมีที่ลูปซ้อนกันมากจะเริ่มต้นด้วย; สารสกัดจากพวกเขาไปยังฟังก์ชั่น) โดยส่วนตัวฉันไม่เคยใช้ตัวแปร 1 ตัวอักษรมากกว่าหนึ่งตัวต่อฟังก์ชั่น แต่ฉันถ่ายภาพเป็น 0
lหรือlenจะใช้สำหรับความยาวและarrสำหรับอาร์เรย์ (เช่นfor(var i=0; l=arr.length; i<l; i++)) นอกจากนี้fnอาจใช้แทนfเมื่อคุณอ้างถึงฟังก์ชั่น
ถ้าลูปของคุณไม่ทำอะไรนอกจากใช้ตัวแปรในการนับ
for(int i = 0; i < 10; i++) {
System.out.println("Stop it! I really mean it!!");
}
ใช่แล้วนี่คือชื่อที่ดีที่สุดที่คุณสามารถใช้ได้ สิ่งใดที่ไม่สามารถทำให้ความหมายชัดเจนขึ้นอีกต่อไป แต่ใช้เวลาอ่านนานกว่านั้นมาก
หากใช้ตัวแปรภายในลูปชื่อที่มีความหมายจะมีประโยชน์
for(int door = 0; door < 3; door++) {
int reward = gauge(door);
if(reward > max) {
max = reward;
best = door;
}
}
หากตัวแปรของคุณถูกใช้ทั้งเมธอดชื่อของมันควรจะยาวกว่า ถ้ามันใช้ทั้งคลาสชื่อของมันจะอธิบายตัวเองได้ดีกว่ามิฉะนั้นมันจะลดความชัดเจนของโค้ดของคุณ
กล่าวโดยย่อขอบเขตของตัวแปรที่ใหญ่กว่ายิ่งชื่อมีความยาวเท่าใด
indexเมื่อวนซ้ำอาร์เรย์ตัวอย่างเช่น
iนั้นคำที่เหมาะสมที่มีความหมายที่ถูกต้องคือ "ดัชนีที่คุณไม่จำเป็นต้องกังวลมากเกินไป" แต่ฉันคิดว่ามันเป็นเรื่องของความคุ้นเคย ถ้าคุณอ่านมาก Haskell คุณจะกลายเป็นที่คุ้นเคยกับการอ่านmเป็นmonad , fเป็นfunctor , xเป็นวัตถุบาง , xsเป็นรายการxsและอื่น ๆ
iคือ "ชื่อที่ดีที่สุดที่คุณสามารถใช้" สำหรับลูปที่ใช้ตัวแปรเพื่อการนับเท่านั้น ในกรณีนี้ฉันอยากจะcountใช้ชื่อตัวแปร: เข้าใจได้ง่ายกว่า หรือfor (int count = 0; count < 10; count++) while (count--)
การอ่านโค้ดในคำตอบของ Kilian ฉันไม่คิดว่า "มีลูปและมีตัวแปรและมันมีประเภท int และมีชื่อและชื่อคือ i และมันถูกกำหนดค่าเริ่มต้นเป็น 0 .. " ฉันแค่คิดว่า "วน ... " ที่จุดสามจุดยืนสำหรับรายละเอียดที่ไม่สำคัญที่ฉันไม่ได้คิด ในใจโปรแกรมเมอร์ของฉันตัวแปรนั้นไม่มีอยู่จริงมันเป็นเพียงสิ่งประดิษฐ์ที่ฉันต้องพิมพ์เช่น for (;;) {} ที่ทำให้เป็นลูป
เนื่องจากตัวแปรนั้นไม่มีอยู่ในใจของฉันทำไมฉันต้องตั้งชื่อให้เกินความจำเป็นจริงๆ?
iแต่_สำหรับตัวแปรที่ไม่มีความหมายอย่างชัดเจน แต่ไม่ใช่ทุกคนที่คุ้นเคยกับ Prolog และอาจสร้างความสนใจมากกว่าที่จะลบออก
_จะเป็นตัวระบุทางกฎหมายเหมือนกับที่อื่น ๆ ก็ตามมีการเปลี่ยนแปลงล่าสุดที่ตัวแปรโลคอลที่ไม่ได้ใช้ชื่อ_(หรือเริ่มต้นด้วย_) ไม่ได้สร้างคำเตือน "ตัวแปรที่ไม่ได้ใช้ในท้องถิ่น" แม้ว่า Ruby จะเตือนพวกเขา
หากคุณอ้างถึงตัวอักษร i, j, k เป็นดัชนีภายในลูปนั่นเป็นวิธีปฏิบัติทั่วไปใน Java และภาษาโปรแกรมอื่น ๆ แม้ว่ามันอาจจะดีกว่าที่จะใช้ a สำหรับแต่ละลักษณะวนเช่น
for(User user: users) {
doSomethingWithTheUser(user);
}
แทน
for(int i=0; i<users.size(); i++) {
doSomethingWithTheUser(users.get(i));
}
ใน Java รูปแบบของการวนซ้ำนั้นเพิ่งถูกนำมาใช้อย่างเป็นธรรม นั่นอาจเป็นสาเหตุที่ทำให้คุณสังเกตเห็น Java มากขึ้นเนื่องจากการวนรอบดัชนีที่ใช้เป็นวิธีที่ใช้กันทั่วไปมากที่สุดในการวนซ้ำอาร์เรย์หรือรายการ
มีอีกหลายกรณีที่ตัวอักษรเดียวอาจเหมาะสมเช่นเมื่อใช้ฟังก์ชันทางคณิตศาสตร์ที่ตัวอักษรเดียวเช่น n, x หรือ y อาจเป็นเรื่องธรรมดาอยู่แล้ว แต่โดยทั่วไปไม่ตั้งชื่อตัวแปรของคุณว่ามีความหมาย