ทำไมโปรแกรมเมอร์ Java ชอบตั้งชื่อตัวแปร“ clazz”? [ปิด]


156

ฉันเคยเห็นรหัสจำนวนมากที่มีการประกาศเช่นClass clazzนี้มาจากที่ใด นี่เป็นการประชุมบางประเภทหรือเปล่า? ฉันคิดว่า 'clazz' ไม่ใช่คำภาษาอังกฤษไม่มีความหมายเลยโปรแกรมเมอร์หลายคนสามารถตั้งชื่อผิดโดยบังเอิญได้อย่างไร


36
อย่าลืมคลาส!
Peter Recore

24
@ Peter: จุดที่ดีนั่นคือ klassic
ประธานาธิบดีเจมส์เค. โพลค์

13
Aleksey Shipilevได้เสนอให้ใช้сlassตัวสะกดแบบ Cyrillic сแทน
Stuart Marks

12
@ StuartMarks ฉันปฏิเสธข้อเสนอนั้น ไม่เป็นไร
Goran Vasic

16
ในอังกฤษเราใช้คำว่า 'clarse'
John Gowers

คำตอบ:


173

clazzถูกใช้ใน Java แทนคำว่า "class" ที่สงวนไว้ตั้งแต่ JDK 1.0 "class" คือสิ่งที่คุณต้องการ แต่การย่อหรือแทรกขยะ ("a", "the", "_", ฯลฯ ) จะช่วยลดความคมชัด clazzแค่พูดว่าคลาส "ผู้พูดภาษาอังกฤษ" ระหว่างประเทศ (ผู้อ่านทั้งภาษาอังกฤษแบบอังกฤษและแบบอเมริกัน) ใช้ในการเปลี่ยน 's' และ 'z'

ตั้งแต่ Java ได้เปิดเผยแหล่งที่มาและวัฒนธรรมที่เหมาะสมตั้งแต่เริ่มต้นรหัส Java และแบบฝึกหัดที่คุ้มค่าจึงเลือกใช้วิธีการเดียวกัน นั่นเป็นหนึ่งในสิ่งที่ยอดเยี่ยมเกี่ยวกับระบบนิเวศของ Java ซึ่งฉันคิดว่าเป็นส่วนสำคัญของความสำเร็จ


82
เป็นการยากที่จะยอมรับว่า "clazz" ชัดเจนยิ่งกว่า "_class" หรือ "myClass" หากฉันเห็นรหัส "_class" ความตั้งใจจะชัดเจนกว่าคำที่ไม่ใช่คำที่ส่งฉันมายัง Google (และไปที่หน้านี้)
uscjeremy

@uscjeremy: โดยส่วนตัวแล้วฉันชอบการใช้เครื่องหมายขีดล่างเพื่อมีตัวระบุที่แตกต่างกันในกรณีเท่านั้น เมื่อฉันออกแบบภาษาฉันจะเป็นลูกผสมของกฎตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ - เล็ก: ตัวระบุใด ๆ ที่สามารถใช้ในปลอกเดิมเท่านั้น แต่การประกาศตัวระบุใด ๆ จะซ่อนตัวบ่งชี้ที่มีอยู่ก่อนซึ่ง แตกต่างกันเฉพาะในกล่อง มีการFooกำหนดไว้ที่ระดับขอบเขตและfooที่ขอบเขตท้องถิ่นตัวแปรควรจะเป็นกฎหมาย this.Fooแต่การอ้างอิงถึงตัวแปรชั้นขอบเขตภายในขอบเขตของท้องถิ่นควรจะต้องมี กฎดังกล่าวจะ ...
supercat

@uscjeremy: ... ในความคิดของฉันรวมข้อดีของภาษาที่อ่อนไหวและไม่ใช่กรณีเล็ก ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ภาษามีประโยชน์ที่การอ่านออกเสียงของชื่อตัวระบุ "foo" จะไม่ต้องคลุมเครือโดยไม่ต้องพูดว่า "ตัวพิมพ์ใหญ่ foo" หรือ "ตัวพิมพ์เล็ก foo" แต่ไม่มีเหตุผลจริงที่ทำให้ตัวระบุสะกดsomeThingในบางสถานที่sOmEtHiNgในคนอื่น ๆ
supercat

1
@supercat The Unicode หมวดหมู่ทั่วไปของเครื่องหมายวรรคตอนคือสิ่งที่ฉันกำลังหาอยู่ unicode.org/faq/punctuation_symbols.html / ฉันจะไม่ออกแบบ C # ใน Java คุณจะได้รับวิธีการที่เรียกว่าfnordและเขตข้อมูลที่เรียกว่าfnordไม่มีปัญหาใด ๆ ตัวพิมพ์ใหญ่หรือคำที่ไร้สาระ ฉันคิดว่ามันจะเพียงพอเป็นตัวอย่างเคาน์เตอร์
Tom Hawtin - tackline

3
@uscjeremy ยากที่จะยอมรับว่า "clazz" ชัดเจนกว่า "_class" หรือ "myClass" - จริง อย่างไรก็ตามการใช้ "_class" จะไม่เป็นตัวเลือกเพราะมันเห็นได้ชัดว่าขัดแย้งกับอนุสัญญา Java การตั้งชื่อ
MC Emperor

73

classเพราะพวกเขาไม่สามารถใช้คำว่าพวกเขาต้องการที่จะใช้ซึ่งเป็น มันถูกสงวนไว้


2
ใช่ฉันรู้ แต่ฉันคิดว่าการสะกดคำให้ถูกต้องจะมีความหมายมากกว่า
Sawyer

22
@Tony - คุณจะพูดว่า "คุณรู้" ได้อย่างไรและเรียกร้องให้สะกดชื่อตัวแปรในความคิดเห็นเดียวกันได้อย่างไร พวกเขาเป็นพิเศษร่วมกัน
duffymo

3
@Tony คุณไม่สามารถตั้งชื่อตัวแปร "class" ได้มันเป็นคำที่สงวนไว้
Steve Kuo

6
@duffymo: มันเป็นเรื่องตลกฉันรู้ว่าชั้นเป็นคำที่สงวนไว้และแน่นอนฉันต้องการชื่อตัวแปรถูกสะกดถูกต้องทำไมพวกเขาเป็นพิเศษร่วมกัน ?? คุณต้องเรียกมันว่า 'คลาส' หรือไม่?
Sawyer

13
ฉันเดาโทนี่ต้องการตัวแปรที่จะตั้งชื่อสิ่งที่อธิบายมากกว่าแค่ "ชั้นเรียน" ตัวอย่างเช่น "x" อาจกล่าวได้ว่าสะกดถูกต้องแล้ว แต่ไม่ได้หมายความว่า "numberOfComments" มากนัก
Peter Recore

17

เป็นเพราะ 'คลาส' เป็นคำหลักที่สงวนไว้ดังนั้นจึงClass classไม่ได้รับอนุญาต ดังนั้นคุณจะเห็นหรือClass clazzClass cls


7
ฉันไม่สามารถนึกถึงเหตุผลที่จะตั้งชื่อคลาสได้Classเนื่องจากมีคลาสจำนวนมากในโปรเจ็กต์ใดก็ตามที่เรียกคลาสคลาสดูเหมือนไม่มีประโยชน์ ฉันยังไม่สามารถคิดเหตุผลที่จะเรียกตัวแปรที่class...
Blindy

8
คุณไม่ได้ตั้งชื่อคลาสว่าเป็น java API
Sawyer

3
@Blindy: แล้ว java.lang.Class ล่ะ? คุณไม่มีทางเลือกมากนัก
Dan Dyer

14
@Blindy: มีคลาสที่เรียกว่า Class ซึ่งหมายถึงแล้วคลาสของวัตถุ เหตุผลที่สมบูรณ์แบบที่จะมีตัวแปรที่เรียกว่า 'คลาส' คือเมื่อคุณทำงานกับคลาสของวัตถุ (เช่นการค้นหาประเภทของวัตถุ)
สาธุคุณ Gonzo

3
ฉันจะพิจารณาข้อมูลClassInformationหรือClassMetadataหรือสิ่งที่คล้ายกัน ทุกชั้นเรียนเป็นชั้นเรียน แต่คุณไม่ได้ตั้งชื่อพวกเขาทั้งหมดClassคุณตั้งชื่อตามหน้าที่หลักของพวกเขา
Blindy

7

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

หากคุณรู้สึกว่าถูกบังคับคุณสามารถเขียน Java คอมไพเลอร์ของคุณเองเพื่อรวมกฎบริบทที่จะอนุญาตให้คุณใช้classเป็นชื่อตัวแปร แม้ว่าฉันคิดว่ามันจะเป็นการใช้เวลาของคุณให้ดีขึ้นเพื่อใช้clazzหรือklass- อาจเป็นผลดีต่อสุขภาพของคุณเช่นกัน


3
คำเกี่ยวกับการไร้ความสามารถ : Java ได้รับการออกแบบเป็นภาษาคำสงวน ภาษาที่ไม่ได้จองคำสามารถประสบความสำเร็จในการรวบรวมและงบเน้นไวยากรณ์เช่นถ้าแล้วถ้าอย่างนั้นอื่นอื่นแม้ (un) การอ่าน ดังนั้นคอมไพเลอร์จึงไม่สามารถ
usr-local-ΕΨΗΕΛΩΝ

4

สิ่งนี้มาจากไหน

ฉันเห็นมันครั้งแรกที่ puzzlers ของ Josh Bloch แต่ฉันค่อนข้างมั่นใจว่ามันถูกใช้ก่อนหน้านี้มากโดยนักพัฒนาอื่น ๆ Josh Bloch สร้างชื่อเสียงให้มากขึ้น


4

Java ไม่มีคุณสมบัติที่ช่วยให้คุณใช้คำหลักเป็นตัวระบุซึ่งแตกต่างจาก C # กับ@คำนำหน้า (เช่น@classเป็นตัวระบุที่ถูกต้อง)


2
นั่นคือตัวระบุอื่น classและ$classเป็นตัวระบุที่ถูกต้อง (แต่แตกต่างกัน) ใน JVM ไม่มีตัวระบุที่คุณสามารถเขียนในไฟล์ต้นฉบับ Java ที่แปลเป็น"class"ใน VM
finnw

2

มันเป็นเพียงคำภาษาอังกฤษที่ถูกแทนที่ (Equavalent) โดย Keyword Class Keyword เพื่อให้ผู้คนเข้าใจว่ามันเป็น Class และเกือบจะเป็นการเพิ่มความสามารถในการอ่านของประมวล

ไม่มีอะไรใหญ่ตรรกะเกี่ยวข้องในเรื่องนี้


2

การประกาศClass clazzเป็นที่นิยมในโลก Java แต่อาจไม่สะดวกสำหรับผู้มาใหม่และผู้ตรวจการสะกดคำ ฉันได้ยินบางคนพูดว่าควรหลีกเลี่ยงตามหลักการของความประหลาดใจน้อยที่สุดที่สุด

มันเป็นไปได้ที่จะบอกว่าClassวัตถุที่แสดงถึงประเภทของClass typeผมเองชอบที่จะประกาศตัวแปรเช่น


0

เราใช้ clazz เพราะ class เป็นส่วนหัวของประเภท ตัวอย่างเช่นคุณใช้คลาสที่นี่:

public class HelloWorld {

และที่นี่:

Object.class.getName();

น่าเสียดายที่เราต้องใช้ชื่ออื่นเช่น clazz


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.