คุณจะทำอย่างไรเมื่อการประชุมการตั้งชื่อของคุณขัดแย้งกับภาษาของคุณ?


14

โอเคนี่เป็นหนึ่งในสิ่งเล็ก ๆ น้อย ๆ เหล่านั้นที่บั๊กฉันเสมอ ฉันมักจะไม่ย่อตัวระบุและเพียงครั้งเดียวที่ฉันใช้ตัวระบุสั้น ๆ (เช่นi) สำหรับการวนซ้ำแน่น มันทำให้ฉันหงุดหงิดเมื่อฉันทำงานใน C ++ และฉันมีตัวแปรที่ต้องมีชื่อoperatorหรือclassและฉันต้องแก้ไขมันหรือใช้ตัวย่อเพราะมันจบลงด้วยการยื่นออกมา Caveat: สิ่งนี้อาจเกิดขึ้นกับฉันอย่างไม่เป็นสัดส่วนบ่อยครั้งเนื่องจากฉันทำงานเป็นอย่างมากในการออกแบบภาษาโปรแกรมโดยที่วัตถุโดเมนอาจสะท้อนแนวคิดในภาษาโฮสต์และทำให้เกิดการปะทะกันโดยไม่ตั้งใจ

คุณจะจัดการกับสิ่งนี้อย่างไร ย่อ? ( op) สะกดผิด? ( klass) มีอะไรอีกไหม ( operator_)


7
นอกเหนือจากการกำหนดชื่อบางทีเราควรพิจารณาเปลี่ยนอนุสัญญาการตั้งชื่อของเรา ขออภัยในความชัดเจน
Chris

1
@Chris: คุณไม่สามารถเชื่อถือโปรแกรมเมอร์ได้ตระหนักถึงความชัดเจน! (แม้ว่าในกรณีนี้ฉันมี)
Jon Purdy

7
หากมีเหตุผลใดที่ชอบชอบ$varไวยากรณ์ของ PHP นี่คือมัน
Joey Adams

3
@ โจอดัมส์: ฉันยิ้มสั้น ๆ เมื่อฉันเห็นคำถามนี้และจดจำคำถามทุบตี PHP ทั้งหมดที่ลอยไปรอบ ๆ SE
Chris

3
เห็นได้ชัดว่าเปลี่ยนรหัสต้นฉบับภาษาเพื่อให้อนุสัญญาการตั้งชื่อของฉัน สิ่งนี้ยังมีประโยชน์ในการ "ปกป้อง" รหัสของฉันเนื่องจากมันจะรัน / คอมไพล์เฉพาะกับล่าม / คอมไพเลอร์ของฉันเท่านั้น
dietbuddha

คำตอบ:


21
  1. ยอมรับว่าคุณอาจต้องทำการเปลี่ยนแปลงเล็กน้อยในแบบแผนการตั้งชื่อของคุณเช่นการเพิ่มตัวพิมพ์ใหญ่ จะดีกว่าที่จะยอมรับสิ่งนี้โดยเร็วที่สุดเพื่อให้โค้ดที่ตามมาทั้งหมดสอดคล้องกัน

  2. พิจารณาความเฉพาะเจาะจงมากขึ้น คำหลักมีแนวโน้มที่ค่อนข้างกว้างดังนั้นการ จำกัด ให้แคบclassลงdemonstrationClassไม่เพียง แต่แก้ไขปัญหาเท่านั้น แต่ยังช่วยให้อ่านง่าย


10

ไม่ใช่สิ่งที่ฉันได้พบ แต่ถ้าฉันได้รับในสถานการณ์เช่นนี้ฉันจะพยายามแก้ไขด้วยตัวเลือกต่อไปนี้ตามลำดับ

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

1
ฉันไม่เห็นสิ่งผิดปกติกับชื่อที่แตกต่างกันเฉพาะในกรณีโดยเฉพาะอย่างยิ่งในรายการอาร์กิวเมนต์ที่พารามิเตอร์ชนิดที่เป็นconst Foo&ไม่ได้มีชื่อเต็ม ๆ ที่เหมาะสมอื่น ๆ fooกว่า ได้รับมันอาจจะดีกว่าที่จะให้Fooชื่อที่มีความหมายมากกว่าfooถ้ามันอาศัยอยู่ในร่างกายของฟังก์ชั่นและมีจุดประสงค์เฉพาะน้อยกว่า
Jon Purdy

@ จอน - ฉันเห็นด้วยแม้ว่าโดยส่วนตัวแล้วฉันมักจะใช้คำนำหน้า "p_", "l_" และ "m_" แทนการใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ฉันยอมรับการประชุมนั้นเพราะมีปัญหาชื่อที่มีชื่อเหมือนกันทั้งหมด การประชุมที่คุณใช้เพื่อจัดการกับเรื่องนี้ส่วนใหญ่ไม่เกี่ยวข้องตราบใดที่คุณใช้มันอย่างสม่ำเสมอในบริบทใด ๆ โดยเฉพาะอย่างยิ่ง - วิธีการที่แตกต่างกันกรณีที่มีการใช้อย่างกว้างขวางพอที่นักพัฒนาส่วนใหญ่ควรรับรู้
Steve314

@ จอน - ความคิดเห็นนั้นอ่านว่าฉันเลือกที่จะใช้การประชุมเฉพาะเมื่อฉันมีปัญหาชื่อเดียวกันซึ่งไม่ใช่สิ่งที่ฉันหมายถึง ประเด็นบริบทเกี่ยวข้องกับภาษาโครงการ ฯลฯ อนุสัญญาได้รับการออกแบบเพื่อให้ปัญหาไม่เกิดขึ้นเมื่อใดก็ตามที่เกิดขึ้น
Steve314

@ Steve314: ฉันได้รับความหมายของคุณจากความคิดเห็นแรก ฉันไม่ได้ติดอยู่เหมือนที่มักจะรู้สึกใกล้ชิดกับ Systems Hungarian เพียงเล็กน้อยเพื่อความสะดวกสบายของฉัน
Jon Purdy

@ จอน: มันไม่ใช่กฎที่ฉันใช้อย่างเคร่งครัด แต่ฉันพบว่ามันง่ายกว่าที่จะทำผิดพลาดหากตัวระบุสองตัวแตกต่างกันในกรณีเท่านั้น ข้อผิดพลาดบางส่วนจะถูกรวบรวมโดยคอมไพเลอร์ซึ่งบางตัวหาได้ยากกว่ามาก (โดยเฉพาะถ้าตัวระบุสองตัวตั้งชื่อสิ่งเดียวกัน) ฉันชอบที่จะมีกฎทั่วไปหนึ่งข้อโดยมีข้อยกเว้นเป็นกรณี ๆ ไปกว่ากฎเต็มเล่มที่ครอบคลุมทุกกรณีที่เป็นไปได้
Bart van Ingen Schenau

6

ภาษาชนะ; คุณไม่สามารถเอาชนะผู้แปลได้ (ไม่สนใจสิ่งที่น่ารังเกียจเช่น PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF ENDแต่ PL / 1 จะไม่ทำให้คุณต้องถามคำถามตั้งแต่แรก) โดยทั่วไปคุณต้องปฏิบัติตามกฎของภาษาและคุณต้องหาทางเลือกอื่นสำหรับคำสำคัญของภาษาสำหรับการใช้งานของคุณเองหรือค้นหาภาษาอื่น

ดังนั้นยกเว้นในสถานการณ์ที่ผิดปกติมากคุณปรับตัวเข้ากับภาษาไม่ใช่ในทางกลับกัน


5

แทนที่จะย่อความยาวได้อย่างไร หากคุณใช้การสร้างคลาสในภาษา Foo แล้วจะใช้ FooClass และ foo_class อย่างไร (Modulo ไม่ว่าการตั้งค่าของคุณจะเป็นแบบใด)


คุณจะใส่คำนำหน้า "java" ในตัวระบุทุกตัวที่คุณใช้ในรหัส Java หรือไม่ และช่วยให้ไม่ได้กล่าวถึงปัญหาที่มีคำขึ้นต้น "C ++" ในทุกตัวระบุ ...
Steve314

@ Steve314 คุณจะไม่ใช้คำนำหน้าจาวาในโค้ด java คุณจะใช้คำนำหน้าจาวาในโค้ด c ++ ที่ใช้คอมไพเลอร์ java นอกจากนี้คุณจะใช้งานได้ก็ต่อเมื่อตัวระบุที่เหลือเป็นคำหลัก
Winston Ewert

ตกลง - คุณหมายถึงการเพิ่มความยาวโดยทั่วไป สำหรับแอปพลิเคชันที่แตกต่างกัน "class" อาจถูกเปลี่ยนชื่อเป็น "class_taught" หรือ "class_of_animal" หรือ "classiness_value" หรืออะไรก็ตาม ฉันเห็นด้วย - ฉันเพิ่งพบคอมไพเลอร์ที่ทำให้ตัวอย่างสับสน
Steve314

5

ตัวย่อบางตัวที่ฉันใช้classเพื่อเรียงตามความถี่:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

ถ้าฉันรู้ว่าClassอินสแตนซ์ของคลาสแสดงถึงอะไรฉันอาจรวมไว้ในชื่อตัวแปร:

  • stringClass = Class.forName("java.lang.String");

ไม่เคยเห็น 'cls' มาก่อน ฉันส่วนใหญ่ใช้ aClass
Konstantin Petrukhnov

4

ใน C และ C ++ คำหลักเป็นตัวพิมพ์เล็กทั้งหมดและภาษานั้นเล็กและตัวพิมพ์เล็กดังนั้นให้กดปุ่ม Shift เป็นครั้งคราวและปัญหาจำนวนมากหายไป

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

นอกจากนี้การตั้งชื่ออนุสัญญาบางอย่างจำเป็นต้องสะท้อนถึงรูปแบบปกติของภาษาที่คุณใช้ดังนั้นฉันจะเขียน "myClass" ใน Java อย่างแน่นอนซึ่งฉันน่าจะเขียนว่า "My_Class" ใน C ++

โดยทั่วไปคุณไม่เพียง แต่เขียนคอมไพเลอร์ แต่สิ่งที่ผู้คนอ่านได้นั้นขึ้นอยู่กับบริบทและความคาดหวังที่เกี่ยวข้อง


3
แม้แต่ภาษาที่อ่อนไหวฉันก็รู้สึกว่ามีการผสมclassและClassอาจทำให้โค้ดอ่านไม่ได้
Karmastan

@Karmastan - อาจขึ้นอยู่กับว่าคุณใช้เวลาเท่าไรในการทำงานกับภาษาและอนุสัญญา โดยส่วนตัวแล้วตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก "C" เห็นได้ชัดเจนมาก - ฉันเห็นรูปแบบการใช้ตัวพิมพ์สำหรับตัวระบุแบบยาวเร็วกว่าที่ฉันจะอ่านได้
Steve314

3

ฉันไม่ได้พบเจอบ่อยครั้งนี้ แต่เมื่อฉันทำมันมีแนวโน้มที่จะไม่เป็นปัญหาเพราะฉันใช้ Delphi และช่วยให้คุณสามารถแก้ไขปัญหานี้ได้โดยการเพิ่มตัว & & ตัวระบุ ดังนั้น "class" ไม่ใช่ตัวระบุที่ถูกต้อง แต่ "& class" คือ


น่าสนใจ ฉันมีโปรแกรมสร้างรหัสที่อนุญาตให้ใช้ตัวอักษรสตริงทุกตัวระบุสามารถใช้งานได้ เดิมตัวระบุส่วนใหญ่สำหรับรหัสที่สร้างขึ้นถูกเขียนเป็นตัวอักษรสตริงเพื่อหลีกเลี่ยงความเสี่ยงของคำหลักที่ขัดแย้งกับ DSL (และคำหลักที่อุดมไปด้วย) ที่เพิ่มขึ้น ตอนนี้ตัวระบุจะใช้สำหรับชื่อส่วนใหญ่ (น่าแปลกใจว่าแหล่งข้อมูลนั้นอ่านได้มากขนาดไหน) แต่ตัวอักษรสตริงจะมีอยู่เสมอเป็นทางเลือก ฉันคิดว่ามันดีสำหรับการสร้างรหัส แต่การแก้ปัญหาคำหลักที่ขัดแย้งกันอาจเป็นความคิดที่ไม่ดีในภาษาที่ใช้โดยทั่วไป - แต่บางทีฉันผิด
Steve314

2

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


2
อย่าใช้คำว่า "ราบรื่น", "ไม่" หรือ "my" เป็นคำนำหน้า
Steven A. Lowe

2
อย่างแน่นอน ฉันลงคะแนน "Jon_Purdys_Carefully_Chosen_Identifier_Prefix_"
Steve314

1
@Steven: แม้เลวฉันเห็นa, anและtheใช้กับความถี่รบกวนโดยเริ่มต้นนักเรียน CS
Jon Purdy

1
@ จอน Purdy มันไม่ใช่ความผิดของเรา! ตำหนิอาจารย์ที่ตัดสินใจที่จะตั้งชื่ออินสแตนซ์ของพวกเขาจากคนชั้น aPerson()
Ben L

@ จอน: หลักการตั้งชื่อที่ฉันทำงานระบุว่าตัวแปรท้องถิ่นควรเริ่มต้นด้วยaตัวแปรวงที่มีวงแคบ: /
Matthieu M.

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