มีการใช้ตัวแปรหนึ่งตัวอักษรใน 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
เป็นรายการx
sและอื่น ๆ
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 อาจเป็นเรื่องธรรมดาอยู่แล้ว แต่โดยทั่วไปไม่ตั้งชื่อตัวแปรของคุณว่ามีความหมาย