อนุสัญญาการตั้งชื่อตัวแปร? [ปิด]


11

ฉันเพิ่งเริ่มใช้ ReSharper (สำหรับ C #) และฉันชอบโปรแกรมค้นหารหัสกลิ่นมันแสดงให้ฉันเห็นบางอย่างเกี่ยวกับการเขียนของฉันที่ฉันต้องการแก้ไขเมื่อนานมาแล้ว (หลักการตั้งชื่อตัวแปรส่วนใหญ่)

มันทำให้ฉันพิจารณาอนุสัญญาการตั้งชื่อของฉันอีกครั้งสำหรับวิธีการและตัวแปรอินสแตนซ์ ReSharper แนะนำว่าตัวแปรอินสแตนซ์นั้นเป็นตัวพิมพ์เล็กอูฐและเริ่มต้นด้วยเครื่องหมายขีดล่าง ในขณะที่ฉันตั้งใจจะทำให้ตัวแปรท้องถิ่นทั้งหมดของฉันลดขนาดอูฐ แต่จำเป็นต้องเน้นหรือไม่ คุณรู้สึกสบายไหม ฉันไม่ชอบอนุสัญญานี้ แต่ฉันยังไม่ได้ลองเลยคุณคิดยังไง?

สิ่งที่สองที่กระตุ้นให้ฉันประเมินใหม่คือข้อกำหนดการตั้งชื่อของฉันสำหรับตัวจัดการเหตุการณ์ GUI ฉันมักจะใช้มาตรฐาน VS ของ ControlName_Action และการควบคุมของฉันมักจะใช้สัญกรณ์ฮังการี (เป็นคำต่อท้ายเพื่อช่วยชี้แจงในรหัสสิ่งที่ผู้ใช้มองเห็นและสิ่งที่ไม่เมื่อจัดการกับตัวแปรที่มีชื่อคล้ายกัน) ดังนั้นฉันจึงจบลงด้วย OK_btn_Click ( ) คุณมีความเห็นอย่างไรต่อเรื่องนี้ ฉันควรยอมแพ้กับการประชุม ReSharper หรือมีตัวเลือกอื่น ๆ ที่ใช้ได้อย่างเท่าเทียมกัน?

คำตอบ:


19

คุณสามารถแก้ไข ReSharper เพื่อใช้รูปแบบการประชุมที่คุณใช้ มันค่อนข้างยืดหยุ่นรวมถึงการปรับแต่งตัวจัดการเหตุการณ์ฟิลด์คุณสมบัติวิธีการที่มีระดับการเข้าถึงต่างๆเป็นต้น

อย่าปล่อยให้เครื่องมือกำหนดมาตรฐานของคุณ - ใช้เพื่อบังคับใช้ของคุณเอง

อัปเดต: ต้องบอกว่าในที่ทำงานเราใช้กรณีอูฐที่ลดลงส่วนใหญ่สำหรับสิ่งที่เป็นส่วนตัวมากที่สุด - ตัวแปรเขตข้อมูลและข้อโต้แย้ง กรณีอูฐตอนบนสำหรับชื่อเมธอดค่าคงที่และคุณสมบัติ ตัวจัดการเหตุการณ์ถูกตั้งชื่อตามการกระทำที่พวกเขานำเสนอแทนที่จะเป็นสิ่งที่เฉพาะเจาะจงกับตัวควบคุม - เช่น HandleCustomerContinue แทนที่จะเป็น HandleContinueButtonClick ฉันลองใช้รูปแบบเริ่มต้น ReSharper สักพักแล้วและก็ไม่ได้สนใจอะไรฉันไม่ได้ยุ่งกับเรื่องนี้เลย


แน่นอนว่าฉันชอบวิธีที่ช่วยให้ฉันเก็บตัวแปรท้องถิ่นของฉันไว้ในการตรวจสอบ แต่ฉันอยากรู้ว่ามาตรฐานของคนอื่นโดยเฉพาะอย่างยิ่งเมื่อพูดถึงตัวจัดการเหตุการณ์
Ziv

ยุติธรรมพอฉันได้แก้ไขเพื่อให้รายละเอียดเพิ่มเติมประสบการณ์ส่วนตัว
mjhilton

11
+1 สำหรับ "อย่าปล่อยให้เครื่องมือกำหนดมาตรฐานของคุณ"
techie007

"อย่าปล่อยให้เครื่องมือกำหนดมาตรฐานของคุณ" เพิ่งกลายมาเป็นหนึ่งในราคาที่ฉันโปรดปรานตลอดกาล
seggy

18

ด้วยความเคารพ

แต่ขีดเส้นใต้จำเป็นหรือไม่? คุณรู้สึกสบายไหม

สิ่งหนึ่งที่ฉันชอบมากเกี่ยวกับการใช้ขีดเส้นใต้คือการลดการใช้ "นี่" ลงอย่างมาก

พิจารณา:

public void Invoke(int size) {
    _size = size;
}

คุณจะต้องเขียน:

public void Invoke(int size) {
    this.size = size;
}

ซึ่งอาจแนะนำข้อผิดพลาดเล็กน้อยของ:

public void Invoke(int size) {
    size = size;    // urgh ... no this! 
}

นอกจากนี้การทำให้โค้ดสมบูรณ์นั้นสะอาดกว่าเพราะเพียงแค่ขีดเส้นใต้คุณจะได้รับรายการของฟิลด์ส่วนตัวเท่านั้นในขณะที่ "นี่" คุณจะได้รับรายชื่อของทุกสิ่ง

ด้วยความเคารพ

มักใช้สัญกรณ์ฮังการี

แนวทางการออกแบบกรอบการทำงาน: อนุสัญญา Idoms และรูปแบบสำหรับไลบรารี. NET ที่ใช้ซ้ำได้กล่าวว่า:

อย่าใช้สัญกรณ์ฮังการี

ออกจากห้องเล็ก ๆ เพื่อคลุมเครือ :)


พูดอย่างเคร่งครัดถ้าคุณทำตามแนวทางการออกแบบกรอบมันระบุว่าตัวแปรที่ถูกส่งผ่านไปยังวิธีการสาธารณะควรอยู่ในเมืองหลวงเช่นกันนอกจากชื่อวิธีการ :)
ผ่าตัด Coder

pzycoman ... คุณช่วยชี้ฉันไปที่ที่มันบอกว่า ดูอย่างรวดเร็วและฉันไม่สามารถค้นหาการอ้างอิงถึงการใช้ตัวพิมพ์ใหญ่ในตัวแปรที่ส่งผ่านไปยังวิธีสาธารณะ แต่ตัวอย่างเช่นใน P 118 ของรุ่นที่สองมีตัวอย่างของวิธีการที่สาธารณะไม่ได้ใช้ตัวพิมพ์ใหญ่ แต่เป็นตัวพิมพ์เล็ก "โมฆะสาธารณะเขียน (ค่า uint);"
Dakotah North

10
ในกรณีที่มีการปะทะกันชื่อฉันจะบอกว่าอยู่ไกลชัดเจนกว่าthis.size _sizeการใช้ชื่อ underscored ไม่ได้ป้องกันข้อผิดพลาดเล็กน้อยคุณยังสามารถกำหนดขนาดให้กับตัวเองได้ แต่หวังว่าคอมไพเลอร์ของคุณจะบอกคุณ
edA-qa mort-ora-y

2
แน่นอนว่าคุณสามารถกำหนดบางสิ่งให้ตัวเองได้เสมอ ความแตกต่างที่สำคัญระหว่างthis.sizeและ_sizeคือความสอดคล้อง ด้วยthis.sizeคือมันเป็นตัวเลือก ตัวอย่างเช่นหากมีเขตข้อมูลส่วนตัวอื่นที่เรียกว่าnameไม่จำเป็นต้องใช้this.nameในรหัสฉันสามารถใช้งานได้ง่ายnameโดยไม่ต้องมีการปะทะกัน เพราะthisบางครั้งสามารถใช้งานได้และไม่ใช่เวลาอื่นคือสาเหตุที่การใช้งานthisด้อยกว่า ในทางตรงกันข้ามไม่มีความกำกวมกับ_...
ดาโกต้าเหนือ

2
อืม ... ทำไมคนยังคงใช้เครื่องหมายขีดล่างเป็นภาษาที่ให้วิธีที่ดีกว่า
Rig

8

ความสอดคล้องเป็นกุญแจสำคัญจริงๆ นั่นและความชัดเจนนั่นคือไม่เป็นความลับหรือพยายามที่จะบันทึกการพิมพ์โดยการย่อทุกอย่าง Intellisense เป็นตัวช่วยการพิมพ์ของคุณไม่ใช่ชื่อที่คลุมเครือ (แต่สั้น!)


2
+1: เลือกการประชุมและทำตาม สิ่งใดที่จะทำ (ยกเว้น Systems Hungarian)
Donal Fellows

ความสอดคล้องไม่ใช่สิ่งเดียว ตัวอย่างเช่นใครบางคนสามารถเลือกการตั้งชื่อที่สอดคล้องกันสำหรับรหัสของตัวเอง แต่ถ้าการประชุมนั้นแตกต่างไปจากอนุสัญญาการตั้งชื่ออื่นแล้วเมื่อใช้ห้องสมุดอื่น ... จะมีความไม่สอดคล้องกันอย่างหลีกเลี่ยงไม่ได้ ตัวอย่างเช่นถ้าฉันเลือกที่จะใช้ข้อกำหนดการตั้งชื่อคุณสมบัติจาก C # ใน Java ฉันจะไม่สอดคล้องกับวิธีการเขียนโค้ดในระบบอื่น ๆ ทั้งหมด ฉันสามารถเขียนorder.Size()(ตรงข้ามกับorder.getSize()) แต่เนื่องจากห้องสมุดอื่น ๆ ใช้ getters และ setters รหัสของฉันจะไม่สอดคล้องกัน
Dakotah North

เห็นได้ชัดว่าควรมีบางความคิดที่ชาญฉลาดอยู่เบื้องหลังการประชุมใดก็ตามที่คนตัดสินใจที่จะใช้ แต่ความมั่นคงเป็นสิ่งที่สำคัญที่สุด
richard

@DakotahNorth - มันสมเหตุสมผลที่จะมีแบบบ้าน แต่นอกเหนือจากนั้นความสอดคล้องคือการพิจารณาที่สำคัญ ตราบใดที่การประชุมไม่ได้อยู่นอกกรอบเกินไปนักพัฒนาภายนอก / ใหม่สามารถหยิบขึ้นมาได้อย่างง่ายดาย แน่นอนมันคุ้มค่าที่จะเผยแพร่รูปแบบบ้านเพื่อลบความไม่แน่นอนออกไป
cjmUK

7

ใน C # เริ่มต้นการป้องกันหรือชื่อสาธารณะที่มีขีดล่างขัดต่อข้อกำหนดภาษาทั่วไป มันถูกต้องเฉพาะในกรณีที่สมาชิกส่วนตัว

จาก MSDN:

ในการโต้ตอบอย่างเต็มที่กับวัตถุอื่น ๆ โดยไม่คำนึงถึงภาษาที่พวกเขานำมาใช้วัตถุจะต้องเปิดเผยให้ผู้ที่โทรเท่านั้นที่มีคุณสมบัติที่ใช้ร่วมกันกับทุกภาษาที่พวกเขาต้องทำงานร่วมกันด้วย ด้วยเหตุผลนี้ Common Language Specification (CLS) ซึ่งเป็นชุดของคุณสมบัติภาษาพื้นฐานที่จำเป็นสำหรับแอพพลิเคชั่นจำนวนมากได้ถูกกำหนดไว้

ดู: http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx

ที่นี่คุณสามารถอ่านคำเตือนเกี่ยวกับขีดล่าง:

ชื่อองค์ประกอบที่ขึ้นต้นด้วยขีดล่าง (_) ไม่ได้เป็นส่วนหนึ่งของข้อกำหนดภาษาทั่วไป (CLS) ดังนั้นรหัสที่สอดคล้องกับ CLS จึงไม่สามารถใช้ส่วนประกอบที่กำหนดชื่อดังกล่าวได้ อย่างไรก็ตามขีดล่างในตำแหน่งอื่นใดในชื่อองค์ประกอบเป็นไปตาม CLS

ดู: http://msdn.microsoft.com/en-us/library/81ed9a62.aspx

สมาชิกที่ได้รับการป้องกันเป็นปัญหาเนื่องจากคุณสามารถสืบทอดจากชั้นเรียนที่เขียนในภาษาอื่น

แต่อาจไม่ใช่ปัญหาในกรณีของคุณหากคุณไม่ต้องการรหัสที่สอดคล้องกับ CLS


4

ฉันชอบขีดเส้นใต้ คุณรู้ได้อย่างรวดเร็วก่อนว่าตัวแปรเป็นสมาชิกในชั้นเรียนและส่วนตัว

แน่นอนว่า IDE สามารถบอกคุณได้ว่าเมื่อคุณวางเม้าส์ไว้เหนือเมาส์ แต่ไม่สามารถเอาชนะ "แวบแรก" ได้ คุณรู้ว่าสิ่งที่เป็นตัวแปรท้องถิ่นและตัวแปรสมาชิกด้วยตาของคุณคนเดียว ไม่จำเป็นต้องเลื่อนหรือเลื่อนเมาส์

คุณสามารถใช้คำหลัก "this" แต่ _ สั้นกว่าเพื่อความสามารถในการสแกนแนวนอนที่ดีขึ้น โดยทั่วไปแล้วชื่อที่ต้องการอธิบายจะเป็นที่ต้องการ แต่เมื่อบางสิ่งบางอย่างเป็นแบบแผนที่จัดตั้งขึ้นจะดีกว่าถ้ามี 1 ตัวอักษร ตัวอย่างเช่นการใช้ตัวอักษร i เป็นดัชนีเมื่อวนลูปผ่านอาร์เรย์ เนื่องจากเป็นการประชุมที่กำหนดไว้ว่าฉันเป็นดัชนีคุณจะได้รับประโยชน์จากความสามารถในการสแกนโดยไม่ต้องสงสัยว่า "i" หมายถึงอะไร


1

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

  • ง่ายต่อการติดตั้ง (เพิ่งใช้ค่าเริ่มต้นแม้ฉันสามารถกด Enter ได้ 20 ครั้งและเริ่มเลย)
  • ข้อผิดพลาดมักจะทำงานจากการตั้งค่าเริ่มต้นมักจะกำหนดค่าความลับที่ฉันตั้งค่าที่ exposes ข้อบกพร่องเป็นครั้งแรก
  • ผู้จำหน่ายเครื่องมือโซ่อาจรู้มากกว่าฉันดังนั้นพวกเขาจึงทำแบบนั้นด้วยเหตุผล ฉันเป็นใครในการตัดสินใจว่าผู้เชี่ยวชาญผิด (ฉันพิจารณาผู้เชี่ยวชาญเพราะฉันซื้อเครื่องมือ)
  • คุณจะไม่ต้องปกป้องทางเลือกของผู้ขายโดยผู้จัดการ - "มันคือสิ่งที่พวกเขาแนะนำ"
  • ผู้ชายคนใหม่จะไม่ผิดพลาดคุณด้วย "ทำไม" และ "มันเป็นวิธีที่ดีกว่า" - เมื่อทุกคำตอบคือ "เพราะพวกเขาตัดสินใจ ... "

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

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


1

กฎสองข้อที่คุณถามถึงขีดล่างที่จุดเริ่มต้นของชื่อฟิลด์ส่วนตัวและชื่อเมธอดโดยทั่วไปถือว่าเป็นบรรทัดฐานในแวดวงการพัฒนา C # ด้วยการปรับให้เข้ากับอนุสัญญาเหล่านั้นโค้ดของคุณจะเข้าใจได้ง่ายขึ้นสำหรับนักพัฒนาคนอื่น ๆ เพราะนั่นเป็นกรอบความคิดที่พวกเขาคุ้นเคยกับการใช้งาน

ส่วนต่อท้ายของ Label, RadioButton ฯลฯ สำหรับการควบคุมของคุณโดยทั่วไปถือว่าเป็นบรรทัดฐานเช่นกัน บ่อยครั้งที่การควบคุมหลายอย่างจะมีอยู่สำหรับแนวคิดเดียว (เช่นป้ายกำกับและกล่องข้อความ) และคำต่อท้ายนี้ค่อนข้างมีประโยชน์ สัญกรณ์ฮังการีที่แท้จริงถูกทอดทิ้งมานานแล้วเพราะถูกทิ้งให้เป็นสิ่งที่ไม่ได้แสดงเจตนาดั้งเดิมซึ่งเป็นบริบทเกี่ยวกับตัวแปรไม่ใช่ชนิดขนาด ฯลฯ


1

ในกรณีของฉันการใช้ camelcase และขีดล่างช่วยให้มีชื่อตัวแปรอธิบาย (อ่าน: ยาว) และการเติมโค้ดให้สมบูรณ์ ฉันไม่แน่ใจว่าการเติมข้อความอัตโนมัติของ Visual Studio ทำงานอย่างไร แต่ใน QtCreator และในระดับที่น้อยกว่า Eclipse หนึ่งสามารถพิมพ์ได้

sDI

และมันขยายไปถึง

someDescriptiveIdentifier

บันทึกการพิมพ์เล็กน้อยในกรณีที่คุณมีชื่อเช่น

someDescriptiveName, someOtherDescriptiveName, someOtherButNotTheSameDescriptiveName

ซึ่งฉันมักจะผลิตเมื่ออยู่ใน "โหมดการตั้งชื่ออธิบาย"

การใช้เครื่องหมายขีดล่างฉันสามารถกำหนดชื่อที่ฉันต้องการเติมข้อความอัตโนมัติ

someDescriptiveIdentifier

หรือ

_someDescriptiveClassMember

หวังว่าคำอธิบายของฉันชัดเจนพอ :)

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