มีการสนับสนุนการใช้ตัวแปรหนึ่งตัวอักษรหรือไม่? [ปิด]


13

มีการใช้ตัวแปรหนึ่งตัวอักษรใน Java หรือไม่? ในตัวอย่างโค้ดหรือแบบฝึกหัดคุณมักจะเห็นมัน ฉันไม่สามารถจินตนาการได้ว่ามีการใช้งานสิ่งเหล่านี้เพราะมันทำให้โค้ดอ่านยากขึ้นและฉันไม่เคยเห็นมันถูกใช้ในภาษาการเขียนโปรแกรมอื่น!


3
ใช่และไม่. ขึ้นอยู่กับสถานการณ์โดยสมบูรณ์
ช่วยให้รอด




1
ไม่ทำให้อ่านรหัสยากขึ้น ตัวอย่างเช่นเมื่อคุณใช้โค้ดตามสมการทางคณิตศาสตร์มันมักจะเหมาะสมที่จะใช้ชื่อตัวแปรเดียวกับที่ใช้ในสมการ (ความคิดเห็นชี้กลับไปที่กระดาษ / ข้อความที่สมการเดิมที่จะพบหรือถ้าคุณชอบฉันบางครั้งคุณใส่รหัสน้ำยางสำหรับพวกเขา.)
jamesqf

คำตอบ:


32

การตั้งชื่อให้ถูกต้องเป็นเรื่องยาก ยากมาก. หากคุณมองไปทางอื่นคุณสามารถใช้สิ่งนี้เพื่อหมายความว่าสิ่งที่ตั้งชื่ออย่างถูกต้องมีความสำคัญ (ไม่เช่นนั้นทำไมคุณต้องใช้ความพยายามในการตั้งชื่อ)

แต่บางครั้งชื่อของสิ่งต่าง ๆ ก็ไม่สำคัญ นั่นเป็นเหตุผลที่เรามีสิ่งต่าง ๆ เช่นฟังก์ชั่นที่ไม่ระบุชื่อ ("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 คุณตั้งชื่อมัน


5
-1 การใช้ชื่อตัวแปร 1 ตัวอักษรคือการเขียนโปรแกรมขี้เกียจ บางครั้งก็ไม่เป็นไรที่จะขี้เกียจ แต่ถ้าคุณได้รับขึ้นไปkและlในดัชนีห่วงที่ไกลเกินไป(คุณไม่ควรมีที่ลูปซ้อนกันมากจะเริ่มต้นด้วย; สารสกัดจากพวกเขาไปยังฟังก์ชั่น) โดยส่วนตัวฉันไม่เคยใช้ตัวแปร 1 ตัวอักษรมากกว่าหนึ่งตัวต่อฟังก์ชั่น แต่ฉันถ่ายภาพเป็น 0
BlueRaja - Danny Pflughoeft

นอกจากนี้lหรือlenจะใช้สำหรับความยาวและarrสำหรับอาร์เรย์ (เช่นfor(var i=0; l=arr.length; i<l; i++)) นอกจากนี้fnอาจใช้แทนfเมื่อคุณอ้างถึงฟังก์ชั่น
Ismael Miguel

4
@ BlueRaja-DannyPflughoeft ฉันชอบที่จะคิดว่ามันเป็นโปรแกรมที่มีประสิทธิภาพ Jorg อาจจะขยายตัวเมื่อตัวอักษรเดียวมีความเหมาะสมไม่เพียง แต่ที่จริงฉันคิดว่าโปรแกรมเมอร์ส่วนใหญ่วาดเส้นที่แตกต่างกัน สำหรับดัชนีลูปฉันสามารถยืนยันได้ว่าโค้ดใด ๆ ที่ดัชนีไม่ต้องการชื่อที่มีค่าความหมายนั้นง่ายพอที่จะพิสูจน์การซ้อนหลายระดับผ่านการแยกที่ไม่จำเป็น พวกเขายังสามารถนำมาใช้ในการวนลูปแยกต่างหากเพื่อหลีกเลี่ยงปัญหาการกำหนดขอบเขตไปได้ว่าเนลสันนำขึ้น
Lilienthal

2
@Lilienthal: รหัสควรมีประสิทธิภาพในการอ่านไม่ใช่ประสิทธิภาพในการเขียน โดยปกติแล้วพวกเขาจะเป็นสิ่งเดียวกัน แต่ไม่เสมอไปเช่นในกรณีนี้
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft ไม่ใช่ในทุกโปรแกรมไม่ แต่ฉันไม่เห็นอะไรผิดปกติกับคำแนะนำของ Jorg ดังที่Killianกล่าวไว้: "สิ่งใดที่ไม่สามารถทำให้ความหมายชัดเจนยิ่งขึ้นอีกต่อไป แต่ใช้เวลาในการอ่านนานกว่านี้" แต่นี่อาจเป็นเรื่องของความชอบส่วนตัวและสไตล์
Lilienthal

20

ถ้าลูปของคุณไม่ทำอะไรนอกจากใช้ตัวแปรในการนับ

  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เมื่อวนซ้ำอาร์เรย์ตัวอย่างเช่น
Michael

13
@Michael: ในความคิดของฉัน Programming Jargon เป็นภาษาของตัวเองมันไม่เหมาะสมกับภาษาอังกฤษ และในภาษาiนั้นคำที่เหมาะสมที่มีความหมายที่ถูกต้องคือ "ดัชนีที่คุณไม่จำเป็นต้องกังวลมากเกินไป" แต่ฉันคิดว่ามันเป็นเรื่องของความคุ้นเคย ถ้าคุณอ่านมาก Haskell คุณจะกลายเป็นที่คุ้นเคยกับการอ่านmเป็นmonad , fเป็นfunctor , xเป็นวัตถุบาง , xsเป็นรายการxsและอื่น ๆ
Jörg W Mittag

2
เป็นเพียงข้อแม้ที่ใหญ่มากจริงๆ ชื่อตัวแปรตัวอักษรเดียวนั้นใช้ได้ก็ต่อเมื่อภาษานั้นมีการกำหนดขอบเขตตัวแปรที่เหมาะสม คุณจะถามชัดเจนว่า 'ภาษาใดไม่มีการกำหนดขอบเขตที่เหมาะสม' ดีฉันใช้เวลาสามชั่วโมงเพื่อเรียนรู้ว่าจาวาสคริปต์ไม่ได้กำหนดขอบเขตตัวแปรในการวนรอบ FOR ลองใช้กับวงในภายในสำหรับวงโดยใช้ชื่อตัวแปรเดียวกัน มันจะระเบิดความคิดของคุณ
เนลสัน

@Nelson: คำถามนี้และคำตอบนี้เป็นเรื่องเกี่ยวกับ Java เห็นได้ชัดว่าภาษาที่แตกต่างกันอาจมีข้อพิจารณาแตกต่างกันบ้าง (JavaScript ไม่ใช่ภาษาเดียวกับ Java)
ruakh

ฉันทุกคนสำหรับชื่อตัวแปรตัวอักษรตัวเดียวเมื่อใดก็ตามที่เหมาะสมที่สุด แต่ฉันไม่เห็นด้วยนั่นiคือ "ชื่อที่ดีที่สุดที่คุณสามารถใช้" สำหรับลูปที่ใช้ตัวแปรเพื่อการนับเท่านั้น ในกรณีนี้ฉันอยากจะcountใช้ชื่อตัวแปร: เข้าใจได้ง่ายกว่า หรือfor (int count = 0; count < 10; count++) while (count--)
ทอดด์เลห์แมน

4

การอ่านโค้ดในคำตอบของ Kilian ฉันไม่คิดว่า "มีลูปและมีตัวแปรและมันมีประเภท int และมีชื่อและชื่อคือ i และมันถูกกำหนดค่าเริ่มต้นเป็น 0 .. " ฉันแค่คิดว่า "วน ... " ที่จุดสามจุดยืนสำหรับรายละเอียดที่ไม่สำคัญที่ฉันไม่ได้คิด ในใจโปรแกรมเมอร์ของฉันตัวแปรนั้นไม่มีอยู่จริงมันเป็นเพียงสิ่งประดิษฐ์ที่ฉันต้องพิมพ์เช่น for (;;) {} ที่ทำให้เป็นลูป

เนื่องจากตัวแปรนั้นไม่มีอยู่ในใจของฉันทำไมฉันต้องตั้งชื่อให้เกินความจำเป็นจริงๆ?


ฉันควรจะเพิ่มสิ่งนั้นในโครงสร้างแบบนั้นฉันมักจะไม่อยากใช้iแต่_สำหรับตัวแปรที่ไม่มีความหมายอย่างชัดเจน แต่ไม่ใช่ทุกคนที่คุ้นเคยกับ Prolog และอาจสร้างความสนใจมากกว่าที่จะลบออก
Kilian Foth

คุณต้องพิจารณาถึงวิธีการใช้ตัวแปรภายในลูปไม่ใช่เฉพาะในfor (...)ส่วนหัว

@KilianFoth: มันก็ใช้แบบนั้นใน Haskell, ML, F # และ Scala ฉันเชื่อ และใน Ruby แม้ว่า_จะเป็นตัวระบุทางกฎหมายเหมือนกับที่อื่น ๆ ก็ตามมีการเปลี่ยนแปลงล่าสุดที่ตัวแปรโลคอลที่ไม่ได้ใช้ชื่อ_(หรือเริ่มต้นด้วย_) ไม่ได้สร้างคำเตือน "ตัวแปรที่ไม่ได้ใช้ในท้องถิ่น" แม้ว่า Ruby จะเตือนพวกเขา
Jörg W Mittag

-1

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


5
"ใน Java รูปแบบของการวนซ้ำนั้นเพิ่งถูกนำมาใช้อย่างเป็นธรรมเมื่อเร็ว ๆ นี้" ... เหมือนเมื่อสิบปีก่อน? ( Java 5 ได้รับการปล่อยตัวในปี 2004 )
Meriton

1
ใช่ว่าค่อนข้างเร็ว ไม่ฉันไม่แก่ หุบปาก. เด็กเจ้ากรรมออกจากสนามหญ้าของฉัน ยังคงมีแอพพลิเคชั่น Java ดั้งเดิมจำนวนมากจากก่อนจาวา 5 และยิ่งโปรแกรมเมอร์ Java ที่เรียนภาษาบน Java 1.4 และปฏิเสธที่จะอัปเดตวิธีการที่พวกเขาทำสิ่งต่าง ๆ และยิ่งกว่านั้นตัวอย่างโค้ดออนไลน์ที่ย้อนกลับไปถึงต้นปี 2000 (ใช่แล้วเรามีอินเทอร์เน็ตย้อนกลับไปแล้วเราเพิ่งเรียกมันว่า Web 2.0)
Nick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.