เหตุผลที่ใช้ตัวพิมพ์เล็กสำหรับคำแรกในตัวแปรโลคัล (เช่น employeeCount, firstName) คืออะไร


20

ฉันใช้การวิพากษ์วิจารณ์อย่างมากจากโปรแกรมเมอร์คนอื่น ๆ เนื่องจากฉันใช้ตัวเรือนที่เหมาะสมกับตัวแปรทั้งหมดของฉัน ยกตัวอย่างเช่นโปรแกรมเมอร์ของคุณโดยทั่วไปจะใช้employeeCountชื่อตัวแปร EmployeeCountแต่ฉันจะใช้ ฉันใช้ตัวเครื่องที่เหมาะสมสำหรับทุกอย่างไม่ว่าจะเป็นวิธีที่เป็นโมฆะวิธีคืนค่าตัวแปรคุณสมบัติหรือค่าคงที่ ฉันยังทำตามอนุสัญญานี้ใน Javascript สิ่งสุดท้ายที่ทำให้เกิดความสับสนวุ่นวายของคนจริงๆ

เหตุผลทั่วไปที่กำหนดว่าทำไมฉันไม่ควรทำตามกรอบ "ที่ไม่ได้มาตรฐาน" นี้เป็นเพราะกรณีที่เหมาะสมควรถูกสงวนไว้สำหรับคุณสมบัติและวิธีการโมฆะ int employeeCount = getEmployeeCount()ตัวแปรท้องถิ่นและวิธีการที่ส่งกลับค่าควรมีคำแรกเป็นตัวพิมพ์เล็กเช่น

อย่างไรก็ตามฉันไม่เข้าใจว่าทำไม

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

นับตั้งแต่วันแรกของการเขียนโปรแกรมแมโคร Excel 97 กับ Office IDE ฉันไม่เคยต้องการรูปแบบการเขียนเพื่อบอกฉันว่ามีบางสิ่งที่เป็นตัวแปรหรือคุณสมบัติในตัวเครื่องหรือไม่ นี่เป็นเพราะฉันมักจะใช้รูปแบบการตั้งชื่อที่ใช้งานง่ายมาก ตัวอย่างเช่นGetNuggetCount()แนะนำวิธีการที่จะไปที่ไหนสักแห่งและนับจำนวนนักเก็ตทั้งหมด SetNuggetCount(x)แนะนำว่าคุณกำลังกำหนดค่าใหม่ให้กับจำนวนนักเก็ต NuggetCountโดยตัวมันเองแนะนำคุณสมบัติหรือตัวแปรท้องถิ่นที่เป็นเพียงการเก็บค่า สำหรับคนสุดท้ายนั้นอาจถูกล่อลวงให้พูดว่า "อ้าฮ่า! นั่นคือคำถามทรัพย์สินหรือตัวแปร? เพื่อที่ฉันจะตอบด้วย "มันเป็นเรื่องสำคัญจริง ๆ ?"

ดังนั้นนี่คือ tl; dr ;: อะไรคือวัตถุประสงค์เหตุผลเหตุผลที่ไม่มีเหตุผลในการใช้ตัวพิมพ์เล็กสำหรับคำแรกในตัวแปรหรือวิธีการส่งคืนของคุณ

แก้ไข: สำหรับ MainMa

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

public void ComputeMetrics()
{
    const int MaxSnapshots = 20;

    var Snapshots = this.LiveMeasurements.IsEnabled ?
        this.GrabSnapshots(MaxSnapshots, this.cache) :
        this.LoadFromMemoryStorage();

    if (!Snapshots.Any())
    {
        this.Report(LogMessage.SnapshotsAreEmpty);
        return;
    }

    var MeasurementCount = Measurements.Count();
    this.Chart.Initialize((count + 1) * 2);

    foreach (var s in Snapshots)
    {
        this.Chart.AppendSnapshot(s);
    }
}

7
หากพวกเขาเป็นตัวพิมพ์ใหญ่จะมีคนอื่นถามว่าทำไมพวกเขาไม่ได้เป็นตัวพิมพ์เล็ก ...
m3th0dman

11
มันจะไม่ดีถ้า IDE ที่ทรงพลังของเราทุกคนมีปลั๊กอินที่แมปการตั้งค่าส่วนตัวของเราสำหรับปัญหาโวหารเช่นนี้และทำให้เราสามารถใช้มันได้ แต่เบื้องหลังสำหรับไฟล์ต้นฉบับ "รุ่นจริง" ความหมายของ "project's" style semantic มันเป็นปัญหาทางภาพทั้งหมดจนกว่าคุณจะต้องตรวจสอบเวอร์ชันไฟล์อย่างเป็นทางการ แค่ฝันถึง ...
Sassafras_wot

59
น่าเสียดายสำหรับคุณเหตุผลที่แท้จริงและถูกต้องคือ "เพราะเป็นมาตรฐาน" มันจ่ายให้กับคนในทีมเดียวกันเพื่อให้เป็นไปตามมาตรฐานรูปแบบรหัสเดียวกัน หากคุณไม่ทราบสาเหตุคุณอาจถามคำถามอื่น: "ทำไมมาตรฐานจึงมีประโยชน์"
Andres F.

3
ฉันมักจะสันนิษฐานว่านักพัฒนาซอฟต์แวร์ตัดสินโดย camelCase เพราะมันดูเหมือน kewl ไม่มีเหตุผล 'วัตถุประสงค์' สำหรับ CamelCase เป็นตัวเองเหนือ PascalCase ฉันพบ PascalCase (เหมือนตัวอย่างของคุณ) ที่จะอ่านได้ง่ายขึ้นและใช้ในสถานที่อื่น ๆ นอกเหนือจาก JavaScript ที่ฉันเก็บไว้กับ camelCase ดังนั้นฉันจึงไม่พลาดการเชิญปาร์ตี้
GrandmasterB

7
วิจัยข้อดีของการมีรูปแบบการเข้ารหัสแบบมาตรฐานมันไม่สำคัญว่ามาตรฐานจะเป็นอะไร
Mr.Mindor

คำตอบ:


88

หลักการตั้งชื่อนั้นมักถูกใช้เมื่อผู้คนต้องการให้ตัวแปรมีชื่อเดียวกับชนิดของมัน ตัวอย่างเช่น:

Employee employee;

บางภาษาบังคับใช้ตัวพิมพ์ใหญ่ด้วยซ้ำ ป้องกันการนี้ต้องใช้ชื่อตัวแปรที่น่ารำคาญเหมือนMyEmployee, CurrentEmployee, EmployeeVarฯลฯ คุณมักจะสามารถบอกได้ว่าสิ่งที่เป็นชนิดหรือตัวแปรเพียงจากทุน ที่ช่วยป้องกันความสับสนในสถานการณ์เช่น:

employee.function(); // instance method
Employee.function(); // static method

นอกจากนี้ในภาษาอังกฤษคำนามไม่ได้เป็นตัวพิมพ์ใหญ่ดังนั้นคุณจึงไม่สามารถเรียกร้องการใช้อักษรตัวพิมพ์ใหญ่ของคุณได้ว่า "เหมาะสม"

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


1
โปรดทราบว่าปัญหายังคงมีอยู่ในภาษาที่ใช้โดย OP เนื่องจากคุณสมบัติเป็นตัวพิมพ์ใหญ่ (แน่นอนคุณสมบัติสามารถนำหน้าด้วยthis.ซึ่งหลีกเลี่ยงความสับสน; ตัวแปรท้องถิ่นไม่สามารถมีคำนำหน้าดังกล่าว)
Arseni Mourzenko

1
@ Oscilatingcretin เรียกว่า PascalCase
Mr.Mindor

21
Employee Employeeทำงาน Employee employeeแต่ผมจะเถียงว่ามันมากขึ้นทำให้เกิดความสับสนในการอ่านของมนุษย์มากกว่า หลังดูเหมือนสองสิ่งที่แตกต่าง ครั้งแรกที่ดูเหมือนซ้ำซ้อนไม่จำเป็น
เจมี่ F

14
@oscilatingcretin ตรง: "ถือว่าผู้อ่านเข้าใจถึงกรอบการทำงาน ... " ฉันชอบอ่าน JavaScript, Java, C #, C ++ และอื่น ๆ และแปลรหัสในหัวของฉัน ฉันไม่ต้องการที่จะคิดต่อไปว่า "โอ้ผู้แปลภาษานี้สามารถจัดการกับxได้" ในขณะที่ฉันแค่พยายามที่จะรับความหมายของรหัส
เจมี่ F

1
โปรดทราบว่าemployee.function()อาจเป็นวิธีการคงที่หากภาษาอนุญาตให้เรียกใช้วิธีการคงที่จากวัตถุ (เช่น Java) คอมไพเลอร์ให้คำเตือน แต่อนุญาตให้ทำเช่นนั้นได้
Uooo

34

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

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

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

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

http://thecodelesscode.com/case/94


3
ฉันหวังว่าโปรแกรมเมอร์ส่วนใหญ่จะเป็นเหมือนคุณ หลายคนมีความสงสัยอย่างสงสัยและ / หรือดันทุรังเกี่ยวกับการทำตามมาตรฐานตัวเครื่องที่ฉันพูดถึง
oscilatingcretin

1
@ Schie เป็นเรื่องสำคัญหากคุณเป็นโปรแกรมเมอร์คนต่อไปที่จะทำงานในโครงการ
N4TKD

3
@oscilatingcretin คุณอาจจะรู้สึกหลงใหลและ / หรือเชื่อมั่นเมื่อคุณทำงานกับโค้ดที่เต็มไปvar m_someVariableID = GetVariableValueId()ด้วย โดยเฉพาะอย่างยิ่งถ้าคุณต้องทำโดยไม่มีการเติมข้อความอัตโนมัติสนับสนุน
Tacroy

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

2
@Schleis การปรับปรุงที่ดีฉันไม่เห็นด้วยมันเป็นเพียงเรื่องของสไตล์ แต่การประชุมและการประชุมกลายเป็นการประชุมด้วยเหตุผลที่ดีและควรปฏิบัติตาม ไม่ใช่ศาสนาและบางครั้งคุณต้องจากการประชุม แต่คุณควรมีเหตุผลที่ดี
N4TKD

25

1. ทำไมต้องมีมาตรฐาน

ท้ายที่สุดมันจะดีกว่าไหมถ้าให้ทุกคนเขียนรหัสตามความชอบส่วนตัวและหยุดพูดเรื่องมาตรฐานที่ดีกว่ากัน?

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

อะไรที่สามารถอ่านได้ระหว่างโค้ดสองชิ้นนี้

public void comp_metrics ()
{
  int Count;
  List<snapshot> measurements=fromMemoryStorage();
  if (_liveMeasurements.enabled)
    measurements = GrabSnapshots(20, _cache);
    if( !measurements.Any() ) {
        this.Report(LogMessage.Measurements_Are_Empty); return;
    }

    Count = measurements.Count ();

    this.Chart.initialize(( Count + 1 )*2);

    foreach(snapshot S in measurements) {
      this.Chart.append_Snapshot ( S );
    }
}

หรือ:

public void ComputeMetrics()
{
    const int MaxSnapshots = 20;

    var snapshots = this.liveMeasurements.isEnabled ?
        this.GrabSnapshots(MaxSnapshots, this.cache) :
        this.LoadFromMemoryStorage();

    if (!snapshots.Any())
    {
        this.Report(LogMessage.SnapshotsAreEmpty);
        return;
    }

    var count = measurements.Count();
    this.Chart.Initialize((count + 1) * 2);

    foreach (var s in snapshots)
    {
        this.Chart.AppendSnapshot(s);
    }
}

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

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

โดยการมีมาตรฐานที่เข้มงวดสม่ำเสมอทำให้อ่านรหัสได้ง่ายขึ้น

2. ทำไมมาตรฐานของพวกเขาถึงดีกว่าที่ฉันคิดค้นในตอนนี้?

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

ตัวอย่าง: ใน บริษัท ของฉันฉันมีระเบียบแบบแผนเฉพาะสำหรับการตั้งชื่อคีย์และดัชนีต่างประเทศและดัชนีในฐานข้อมูล ชื่อเหล่านั้นมีลักษณะดังนี้:

  • [FK for Application: CreatedByApplicationId],
  • [IX for SessionIPAddress: SessionId] หรือ
  • [PK for RoleOfPassword: RoleId, PasswordId].

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

  • เมื่อฉันจะจ้าง DBA เขาจะถูกบังคับให้เรียนรู้ระเบียบใหม่แทนที่จะเริ่มทำงานทันที

  • ฉันไม่สามารถแบ่งปันรหัสบนอินเทอร์เน็ตได้อย่างที่เป็นอยู่: ชื่อที่ดูแปลก ๆ จะรบกวนผู้ที่จะอ่านรหัสของฉัน

  • ถ้าฉันนำรหัสจากภายนอกเพื่อใช้ด้วยตัวเองฉันจะถูกบังคับให้แก้ไขชื่อเพื่อให้เหมือนกัน

  • หากวันหนึ่งฉันตัดสินใจที่จะใช้มาตรฐานที่รู้จักกันดีฉันจะถูกบังคับให้ไปแก้ไขชื่อไม่กี่ร้อยชื่อ

3. แล้วการใช้อักษรตัวพิมพ์ใหญ่เป็นอย่างไร

คุณสมบัติมีขอบเขตหรือการมองเห็นที่ใหญ่กว่าเขตข้อมูลหรือตัวแปรท้องถิ่น การทำให้คุณสมบัติเริ่มต้นด้วยอักษรตัวใหญ่และฟิลด์และตัวแปร - โดยตัวเล็กจะไปในทิศทางนี้

หากคุณพิจารณา C # ลอจิกนี้สอดคล้องกันมากพอ

หากคุณพิจารณา Java วิธีการเริ่มต้นด้วยตัวอักษรขนาดเล็กซึ่งไม่เป็นไปตามตรรกะ

ไม่เลยไม่มีข้อพิสูจน์ที่ชัดเจนว่าการประชุมนี้ดีกว่าของคุณ เป็นเพียงการใช้ทั่วโลกและคุณไม่ได้ ไม่มีใครที่ดีกว่า

ใน JavaScript ฟังก์ชั่นเริ่มต้นด้วยตัวอักษรขนาดเล็กเว้นแต่พวกเขาต้องการnewก่อน มันจะไม่ดีกว่าวิธีอื่น ๆ หรือ อาจจะ. ความจริงก็คือว่าเป็นเวลาหลายปีที่นักพัฒนา JavaScript ใช้มาตรฐานนี้และไม่ใช่สิ่งที่ตรงกันข้าม เขียนซ้ำทุกเล่มและบังคับให้นักพัฒนาทุกคนเปลี่ยนสไตล์ตอนนี้จะซับซ้อนเล็กน้อย


1
ส่วนที่เกี่ยวกับโค้ดนั้นสามารถอ่านได้น้อยลงเพราะมันเป็นไปตามมาตรฐานที่แตกต่างกันเล็กน้อยฉันไม่เคยมีปัญหานั้น นอกจากว่าตัวแปรของใครบางคนจะถูกตั้งชื่อเช่นhookyDookyDooไม่มีการตั้งชื่อหรือการประชุมปลอกที่เบี่ยงเบนจากความสามารถในการอ่าน นอกจากนี้โปรดจำไว้ว่าฉันไม่ได้พูดว่าการประชุมของฉันคือ "ดีกว่า" เพราะมันไม่ได้นำสิ่งที่พิเศษมาที่ตาราง dev สุดท้ายนี้ผมไม่เข้าใจจุดของคุณ[คุณสมบัติมีขอบเขตขนาดใหญ่ ... ไปในทิศทางนี้] ขอบเขตเกี่ยวข้องกับกรอบการประชุมอย่างไร ไปในทิศทางใด?
oscilatingcretin

23
@ Oscilatingcretin คำถามไม่ได้ว่าคุณเคยมีปัญหานั้นหรือไม่ก็เป็นว่าเพื่อนร่วมงานของคุณมี เห็นได้ชัดว่าพวกเขามีหรือพวกเขาจะไม่บ่น
Karl Bielefeldt

1
Re: การแก้ไขของคุณ: ตัวอย่างรหัสแรกของคุณแสดงให้เห็นถึงรหัสที่สร้างได้ไม่ดีและมีแนวโน้มที่จะเกิดภัยพิบัติ OP ของฉันไม่เกี่ยวกับรหัสที่สร้างมาไม่ดี มันเกี่ยวกับรหัสเดียวกันกับตัวอย่างที่สองของคุณ แต่เป็นแบบแผนที่แตกต่างกัน ฉันแก้ไขตัวอย่างรหัสที่สองของคุณและโพสต์ไว้ใน OP ด้วยการทำกรอบ โปรดแทนที่ด้วยตัวอย่างรหัสแรกของคุณโปรด
oscilatingcretin

5
@oscilatingcretin: ตัวอย่างรหัสแรกแสดงให้เห็นว่ารหัสที่สร้างไม่ดี แต่รหัสที่เขียนโดยทีมที่นักพัฒนาซอฟต์แวร์ทุกคนตามสไตล์ของเขาเอง สิ่งนี้เกิดขึ้นกับฐานโค๊ดมากเกินไปให้เวลาเพียงพอ (เช่นห้าปี) หมายเหตุ: คุณพลาด: "ความจริงก็คือว่ารหัสนี้ยังคงสามารถอ่านได้มากขึ้นด้วยวิธีนี้และจะยังคงถ้าพวกเขาใช้มาตรฐานที่แตกต่างกัน" ?
Arseni Mourzenko

6
@oscilatingcretin มีงานวิจัยมากมายที่แสดงถึงความสอดคล้องลดความพยายามในการรับรู้ที่จำเป็นในการทำความเข้าใจสิ่งที่คุณกำลังอ่าน สำหรับการร้อยแก้วปกติการสะกดที่ไม่ดีเครื่องหมายวรรคตอนที่ไม่ดีและไวยากรณ์ที่มีหมัดทำให้ทุกคนอ่านยากขึ้นไม่ว่าพวกเขาจะสังเกตเห็นว่ามีสติหรือไม่ก็ตาม รหัสนั้นยากที่จะอ่านโดยไม่ทำให้ยากขึ้น - การยึดมั่นใน "มาตรฐานทั่วไป" (สำหรับกองเทคโนโลยีที่คุณเลือก) เพิ่มความสอดคล้องโดยรวมและปลดปล่อยเซลล์ประสาทให้มีสมาธิกับธุรกิจสำคัญของสิ่งที่รหัสทำ มันถูกเขียน.
Bevan

10

ในทางเทคนิคแล้วมันไม่สำคัญ (หรืออย่างน้อยในภาษาส่วนใหญ่ก็ไม่ได้)

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

ไม่ใช่เพราะมันดีที่สุด แต่เป็นเพราะสิ่งที่ทุกคนใช้ หากคุณยึดติดกับมาตรฐานรหัสของคุณจะสอดคล้องกับรหัสอื่น ๆ ส่วนใหญ่ที่คุณจะใช้ในท้ายที่สุด - ห้องสมุดรหัสเพื่อนร่วมทีมภาษาในตัว การตั้งชื่อที่สอดคล้องกันเป็นอาวุธที่มีประสิทธิภาพอย่างหนึ่งเนื่องจากมันหมายความว่าเมื่อคุณเดาชื่อของบางอย่างคุณมักจะเดาถูก มันfile.SaveTo(), File.saveTo(), file.save_to(), FILE.save_to()? แบบแผนการตั้งชื่อจะบอกคุณ

การดำเนินการตามความชอบส่วนบุคคลของคุณในทุกภาษาที่คุณพบนั้นเป็นสิ่งที่อันตรายเป็นพิเศษเพราะประการแรกทุกภาษามีวัฒนธรรมของตัวเองและอนุสัญญาการตั้งชื่อมักจะขัด และที่สองมีความแตกต่างเล็กน้อยระหว่างภาษาที่เกี่ยวข้องกับการตั้งชื่อ

เพียงตัวอย่างเดียว: ใน C # ประเภทและตัวแปรอาศัยอยู่ในเนมสเปซที่แยกต่างหาก คอมไพเลอร์ฉลาดพอที่จะรู้ความแตกต่าง อย่างไรก็ตามใน C ชื่อทั้งสองชนิดใช้ชื่อ namespace ร่วมกันดังนั้นคุณจึงไม่สามารถมีประเภทและตัวแปรชื่อเดียวกันภายในขอบเขตเดียวกัน ด้วยเหตุนี้ C จึงจำเป็นต้องมีหลักการตั้งชื่อที่แยกประเภทจากตัวแปรในขณะที่ C # ไม่ได้


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

4
@oscilatingcretin เมื่อทุกคนใช้แบบแผนเดียวกันมันไม่ได้เพิ่มความซับซ้อนอย่างต่อเนื่องแบบแผนกลายเป็นส่วนหนึ่งของแบบจำลองจิตของคุณสำหรับภาษาที่มีปัญหาและลดการใช้ภาษานั้น สิ่งนี้สามารถพิสูจน์ได้และสามารถวัดได้
Mr.Mindor

ฉันจะลงคะแนนให้คุณ แต่ก่อนอื่นคุณบอกว่ามันไม่สำคัญแล้วคุณจะเขียนหลายย่อหน้าเพื่ออธิบายว่าทำไมมันถึงสำคัญ หากคุณลบ "มันไม่สำคัญ" ตอนแรกฉันจะโหวตให้คุณ
Tulains Córdova

10

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

ด้วย Intellisense ที่ทันสมัยสิ่งนี้มีความสำคัญน้อยลง แต่ก็ยังทำให้ฉันมีสถานที่สำคัญในขณะที่ฉันอ่านรหัสเพื่อทราบว่าฉันควรมองหาคำจำกัดความที่ใด

และความยุติธรรมของเรื่องนี้อาจเหลือจากสไตล์ที่แย่กว่าของฉันเมื่อหลายปีก่อนเมื่อวิธีการไม่น่าจะเหมาะกับหน้าจอเดียว


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

7

นี่ดูเหมือนคำถามเกี่ยวกับการประชุมมากกว่าการประชุมเฉพาะของคุณ

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

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

สำหรับการประชุมที่แท้จริงของคุณ CapitalCamelCase มักจะสงวนไว้สำหรับชื่อคลาส (หรือใน Javascript, constructors) หากฉันเห็นตัวแปรตัวพิมพ์ใหญ่การคาดเดาที่มีการศึกษาจะเป็นตัวกำหนดฉันจะต้องสร้างอินสแตนซ์ให้ใช้ หากผิดฉันจะโกรธว่ารหัสไม่ได้มาตรฐานชุมชน แม้กับภาษาอื่น ๆ ส่วนใหญ่ทุกคนที่มองมันเป็นครั้งแรกนั้นถูกเข้าใจผิดในทันที ฉันต้องการรหัสที่ชัดเจนไม่ทำให้เข้าใจผิด


"ถ้าฉันเห็นตัวแปรตัวพิมพ์ใหญ่การคาดเดาที่มีการศึกษาจะเป็นการกำหนดฉันจะต้องยกตัวอย่างให้มันใช้" ฉันไม่เข้าใจ. การเห็นตัวแปรตัวพิมพ์ใหญ่ทำให้คุณคิดว่าคุณจำเป็นต้องสร้างอินสแตนซ์ก่อนใช้งานอย่างไร เพราะมันดูเหมือนชื่อคลาส? ดังนั้นคุณไม่ทราบความแตกต่างระหว่างMyClass MyClass = nullและclass MyClass { }?
oscilatingcretin

3
ใช่ฉันเห็นความแตกต่าง มีการประชุมเพื่อป้องกันความกำกวม var car = new Car();ตามบรรทัดสุดท้ายของฉัน - ทำไมไม่ทำให้ชัดเจน?
Adrian Schneider

3
@ Oscilatingcretin มีความแตกต่างแน่นอน แต่สมองของมนุษย์ได้รับประโยชน์จากการชี้นำภาพที่ parser คอมพิวเตอร์ไม่ต้องการ ดูเหมือนว่าคุณกำลังตั้งคำถามถึงความต้องการอนุสัญญา / มาตรฐาน ... ซึ่งถูกต้องหากคำถามที่แตกต่างจากที่คุณถาม
Andres F.

2

"เพราะกรณีที่เหมาะสมควรถูกสงวนไว้สำหรับคุณสมบัติและวิธีการโมฆะตัวแปรท้องถิ่นและวิธีการที่ส่งกลับค่าควรมีคำแรกเป็นตัวพิมพ์เล็ก" และเพราะมันเป็นแบบแผนมาตรฐาน

โปรแกรมเมอร์คนอื่น ๆ กำลังดึงโค้ดของคุณขึ้นมาในตอนนี้และคิดว่านี่เป็นคุณสมบัติและมันเป็นตัวแปรเฉพาะที่ทำให้คุณทำงานหนักขึ้น


1
คุณอ่านคำถามของฉันเต็มหรือไม่ ลองดูในช่วงท้ายที่ผมกล่าวว่า:NuggetCount all by itself suggests a property or local variable that is simply holding a value. To that last one, one may be tempted to say, "Ah ha! That is the question. Property or variable? WHICH IS IT?" To that, I'd reply with, "Does it really matter?"
oscilatingcretin

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

2
@ Oscilatingcretin ฉันคิดว่าความคับข้องใจที่คุณเห็นกับคนที่ตอบคำถามแตกต่างกันเล็กน้อยกว่าที่คุณถามเป็นหลักฐานของความสับสนที่สามารถเกิดขึ้นได้เมื่อคุณหยุดการประชุมที่ยอมรับ
Mr.Mindor

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

5
@ Oscilatingcretin ใช่! แน่นอน! ฉันเชื่อถือได้ว่าสิ่งที่พวกเขาเขียนนั้นปฏิบัติตามอนุสัญญาและดำเนินการไปตามนั้น ฉันเชื่อว่าพวกเขากำลังทำงานเป็นส่วนหนึ่งของทีมและฉันสามารถเก็บเกี่ยวผลประโยชน์จากการใช้แบบแผนนั้น (รู้ว่า nuggetCount เป็นอะไรคร่าว ๆ ) หากพวกเขาทำไม่ได้ฉันอาจทำในสิ่งที่เพื่อนร่วมงานของคุณทำไป และฉันเสียเวลามากขึ้นในครั้งต่อไปที่ฉันต้องติดตามพวกเขาโดยไม่เชื่อใจ หากไม่ปฏิบัติตามอนุสัญญาพวกเขาสร้างรหัสที่อ่านได้น้อยลงและบำรุงรักษาได้น้อยลง คุณมีเหตุผลที่อยากจะร่วมการประชุมหรือไม่?
Mr.Mindor

0

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

เส้นจะเบลอเล็กน้อยเมื่อจัดการกับสิ่งต่าง ๆ เช่นการป้องกันหรือออกหรือบางสิ่งบางอย่าง


-2

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

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


-2

สำหรับฉันมันลงมาที่ความคาดหวัง

เมื่อฉันอ่านโค้ดส่วนใหญ่ฉันคาดหวังว่าทุกอย่างที่ขึ้นต้นด้วย a lowerCaseจะเป็นตัวแปรโลคอลหรือฟังก์ชั่น (ใน C # ที่จะเป็นแค่ตัวแปร) หากฉันเห็นตัวแปรท้องถิ่นProperCaseฉันอาจจะสะดุดและสับสนในขณะที่คิดว่าเป็นชื่อคลาสหรือทรัพย์สินหรืออย่างอื่น นั่นจะทำให้ฉันอ่านรหัสอีกครั้งและจะรบกวนฉัน

นั่นเป็นสิ่งที่เกิดขึ้นในกรณีของคุณ

นอกจากนี้ยังสะดวกที่จะบอกได้ว่าบทบาทของตัวแปรเล่นเพียงแค่ดูที่อักษรตัวแรกและหลีกเลี่ยงการปะทะกันระหว่างชื่ออินสแตนซ์และชื่อคลาส


-3

ตัวพิมพ์เล็กควรใช้กับตัวแปรในตัวเครื่องเพื่อให้ง่ายต่อการพิมพ์ (ปุ่ม speed / no shift) ใช้ตัวพิมพ์ใหญ่เพื่อช่วยในการอ่านโดยแยกคำภายในชื่อ รหัสที่มีชื่อตัวแปรโลคัลคำเดียว (ซึ่งควรเป็นเรื่องธรรมดา) นั้นรวดเร็วและง่ายต่อการพิมพ์ การใช้ตัวพิมพ์ใหญ่สำหรับแต่ละคำใหม่ในชื่อนั้นก็เร็วกว่า (และใช้พื้นที่น้อยกว่า) ด้วยการใช้เครื่องหมายขีดล่างที่เพิ่มอักขระอื่น - ซึ่งเป็นที่รู้จักกันในชื่อของอูฐ


ฉันคิดว่านี่เป็นคำตอบที่ดีมากและฉันไม่เข้าใจการลงคะแนน มันเป็นคำตอบที่สมเหตุสมผล - ขึ้นอยู่กับข้อเท็จจริงตามที่ OP ร้องขอ หากคุณลงคะแนนโปรดอธิบายตัวเอง ปุ่ม Shift กดไปทั่วสถานที่นั้นมีขนาดใหญ่มาก ลองคิดดูว่าเกือบทุกคำที่คุณพิมพ์ในรหัสของคุณจะเริ่ม PascalCase และสำหรับแต่ละคำคุณจะต้องกดปุ่ม Shift อีกครั้ง หากคุณต้องการความเรียบง่ายและมีประสิทธิภาพเหมาะสมที่จะลบการกดปุ่ม Shift ที่ไม่จำเป็นออกไป และการพูดอย่างมีเหตุผลคุณจะต้องทำงานได้อย่างมีประสิทธิภาพมากขึ้นซึ่งในที่ที่ฉันยืนอยู่นั่นหมายถึงการกดปุ่มน้อย ทำไมกดเพิ่มเติม
AIon

-3

ฉันเห็นด้วยกับ OP ที่นี่ camelCase ดูผิดไป ฉันเห็นด้วยกับความจริงที่ว่าเป็นมาตรฐานและเราต้องยึดติดกับมาตรฐานเดียวกันหรืออะไรคือจุดที่มีมาตรฐาน นอกจากนี้ยังทำให้รู้สึกว่า PascalCaps ถูกนำมาใช้สำหรับวิธีการอื่น ๆ และ camelCase สำหรับตัวแปรของคุณเอง ฯลฯ เป็นวิธีการที่แตกต่างกันเมื่อไม่ได้ใช้ IDE ที่วิธีการสีสำหรับคุณ

ในการรับมันฉันมักจะนำหน้าชื่อวัตถุของฉันด้วยประเภทของวัตถุที่เป็น ดังนั้นถ้ามันเป็นตัวแปรสตริงฉันเรียก strMyVariable ถ้ามันเป็นวัตถุบางอย่างฉันเรียกมันว่า objMyObject เป็นต้นด้วยวิธีนี้มันเริ่มต้นด้วยตัวพิมพ์เล็กตามมาตรฐานและมันดูถูกต้อง


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