มีข้อแก้ตัวสำหรับชื่อตัวแปรสั้น ๆ หรือไม่?


140

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

ตัวอย่างเช่นฉันอ่านโค้ดบางตัวที่อัพเดตนิยามของผิวหน้าออปติคัล ตัวแปรที่ตั้งไว้ที่จุดเริ่มต้นมีดังนี้:

double dR, dCV, dK, dDin, dDout, dRin, dRout
dR = Convert.ToDouble(_tblAsphere.Rows[0].ItemArray.GetValue(1));
dCV = convert.ToDouble(_tblAsphere.Rows[1].ItemArray.GetValue(1));
... and so on

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

dR = radius
dCV = curvature
dK = conic constant
dDin = inner aperture
dDout = outer aperture
dRin = inner radius
dRout = outer radius

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


98
สำหรับฉันแล้วปรากฏว่าในกรณีเฉพาะเหล่านั้นเป็นชื่อตัวแปรที่คัดลอกโดยตรงจากสูตรคณิตศาสตร์แบบยาว
Dave Nay

1
ข้อแก้ตัวเดียวที่ฉันจะยอมรับก็คือ"เพื่อนของฉันบอกว่ามันโอเคหลังจากตรวจสอบรหัส"
gnat

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

3
ระบุใด ๆ ที่เป็นชื่อหลังจาก Donkey Kong dK = conic constantได้รับการอนุมัติ:
โทมัส Eding

8
ในทางกลับกันเราอาจถามว่าการเพิกเฉยของเขตข้อมูลโดเมนนั้นสมเหตุสมผลหรือไม่ ในท้ายที่สุดมันขึ้นอยู่กับบริบท
Daniel C. Sobral

คำตอบ:


234

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

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

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


17
และถ้าไม่มีนักฟิสิกส์หรือนักคณิตศาสตร์ในทีม? รหัสถูกทิ้งให้ฉันเป็นหลัก ส่วนใหญ่ไม่มีเอกสาร มันจะมากขึ้นยากที่จะอ่านชื่อที่สื่อความหมาย?
KChaloux

127
+1 มันไม่สมเหตุสมผลที่จะคาดหวังว่าโปรแกรมเมอร์จะเข้าใจโดเมนที่เขาใช้งานในทางกลับกันงานทางคณิตศาสตร์ตัวแปรมักจะถูกกำหนดไว้ในที่ที่สะดวก ในรหัสเช่นนี้ฉันคาดหวังความคิดเห็นที่โดดเด่นแสดงแบบยาว
Karl Bielefeldt

15
+1: สิ่งที่คุณพูดโดยทั่วไปคือโปรแกรมเมอร์ที่เข้าใจโดเมนที่พวกเขากำลังทำงานอยู่จะเข้าใจชื่อตัวแปร สิ่งนี้จะเหมือนกันในหลาย ๆ โครงการแม้จะมีชื่อตัวแปรที่ยาวกว่า เช่น. ตัวแปรที่มีชื่อcolumnในเกมกลยุทธ์ทางทหารน่าจะหมายถึงบางสิ่งที่แตกต่างจากซอฟต์แวร์สร้างแผนภูมิ
Steven Evers

23
ในการเขียนโปรแกรมทางการแพทย์คุณมักจะพบคำศัพท์ที่ยังคงอยู่ในขอบเขตการเขียนโปรแกรม ตัวอย่างเช่นจักษุวิทยาคุณจะเห็น OU, OD และ OS สิ่งเหล่านี้แสดงว่าตาใดเช่น ouSphere อาจอ้างอิงองค์ประกอบ 'ทรงกลม' ของใบสั่งยาแว่นตาสำหรับตาขวา คุณจะเป็นโปรแกรมเมอร์ที่ดีขึ้นถ้าคุณเข้าใจโดเมนธุรกิจที่คุณเขียนโปรแกรม
เรียกเก็บเงิน

11
+1 สำหรับการสังเกตชื่อสั้น ๆ ที่ตรงกับชื่อในสมการและสูตรจากเอกสารและข้อความ เมื่อฉันทำเช่นนั้นฉันได้รวมความคิดเห็นเกี่ยวกับตำแหน่งที่จะค้นหาเนื้อหาอ้างอิงดั้งเดิม
Jay Elston

89

ตัวแปรที่มีช่วงอายุสั้น ๆ ควรตั้งชื่อในไม่ช้า for(int arrayCounter = 0; arrayCounter < 10; arrayCounter++) { ...ตัวอย่างเช่นคุณไม่ได้เขียน คุณใช้for(int i ...แทน

โดยทั่วไปแล้วกฎของหัวแม่มืออาจกล่าวได้ว่าขอบเขตตัวแปรที่สั้นลงควรมีชื่อที่สั้นกว่า เคาน์เตอร์ห่วงมักจะมีตัวอักษรเดียวเท่านั้นพูดi, และj kตัวแปรท้องถิ่นเป็นสิ่งที่ชอบbaseหรือและfrom ตัวแปรทั่วโลกแล้วค่อนข้างซับซ้อนมากขึ้นเช่นtoEntityTablePointer

บางทีกฎเช่นนี้ไม่ได้ถูกติดตามด้วย codebase ที่คุณทำงานด้วย มันเป็นเหตุผลที่ดีสำหรับการทำ refactoring บ้าง!


14
i, j และ k สำหรับดัชนีอาเรย์แสดงถึงประเพณีที่ย้อนกลับไปที่ Fortran อย่างน้อยที่สุด โปรแกรมเมอร์ที่เคารพตนเองจะคุ้นเคยกับการประชุมนี้
Dominic Cronin

7
ฉันมักจะไม่ได้เขียนi, j, kผมเขียนสิ่งที่ต้องการpersonPosแล้วเพราะฉันจะไม่ลืมสิ่งที่ฉันทำซ้ำขึ้นและสิ่งที่ดัชนีหมาย
Malcolm

18
-1 ฉันจะใช้ชื่อยาวสำหรับการทำซ้ำดัชนีอาร์เรย์ แต่ฉันให้พวกเขามีชื่อที่มีความหมายแทนการที่ชัดเจนและความหมาย arrayCounterทำให้การอ่านรหัสง่ายขึ้นและอย่างน้อยที่สุดคุณก็ช่วยคุณไม่ให้กระทืบทั่วเคาน์เตอร์ด้านนอกเมื่อคุณคัดลอก / วางลูปอื่นภายในวงนี้
Oleg V. Volkov

3
ตัวนับเป็นคำนามหรือคำคุณศัพท์ นับเป็นคำนามหรือคำกริยา แน่นอนฉันจะยังคงไม่เรียกสิ่งที่arrayCounterผมต้องการใช้personIndexหรือrowหรือสิ่งที่อธิบายสิ่งที่ฉันกำลังมองหาที่
Wayne Werner

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

48

ปัญหาเกี่ยวกับรหัสไม่ใช่ชื่อสั้น ๆ แต่เป็นการขาดความคิดเห็นซึ่งจะอธิบายตัวย่อหรือชี้ไปที่เนื้อหาที่เป็นประโยชน์เกี่ยวกับสูตรที่ได้รับตัวแปร

รหัสจะถือว่าความคุ้นเคยกับโดเมนปัญหา

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

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


ท้ายที่สุดก็ไปกับอะไรแบบนี้
KChaloux

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

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

19

สำหรับตัวแปรบางตัวที่เป็นที่รู้จักกันดีในโดเมนปัญหา - เช่นกรณีที่คุณมีที่นี่ - ชื่อตัวแปรตัวย่อนั้นสมเหตุสมผล ถ้าผมทำงานเกี่ยวกับเกมที่ผมต้องการหน่วยงานเกมของฉันจะมีตัวแปรตำแหน่งxและyไม่ได้และhorizontalPosition verticalPositionในทำนองเดียวกันเคาน์เตอร์วงที่ไม่ได้มีความหมายใด ๆ ที่นอกเหนือจากการจัดทำดัชนีผมคาดว่าจะเห็นi, ,jk


ฉันขอยืนยันว่า cv, din, และ dout ไม่ชัดเจนในทันที ฉันจะไม่โต้แย้งเกี่ยวกับ x และ y เนื่องจากการมองว่าพิกัดคาร์ทีเซียนนั้นใช้ได้กับหลาย ๆ สาขาและได้รับการสอนให้ทุกคนในโรงเรียนมัธยมและมัธยมปลาย
KChaloux

1
และxและyในขณะที่ร่วมกันไม่ได้ดำเนินการที่สำคัญโดยปริยายเช่นที่ต้นกำเนิดใน.
รอสส์แพตเตอร์สัน

3
@RossPatterson: อย่างไรก็ตามมีบริบทจำนวนมากที่ไม่สำคัญ ตัวอย่างเช่นพิจารณาการวนซ้ำเช่นfor (x,y) in list_of_coordinates: print x,y: ต้นกำเนิดไม่สำคัญโดยเฉพาะเมื่อพยายามทำความเข้าใจโค้ด
Bryan Oakley

16

อ้างอิงถึง "Clean Code":

ชื่อตัวแปรควร:

  • จงแสดงเจตนา
  • หลีกเลี่ยงการบิดเบือนข้อมูล
  • สร้างความแตกต่างที่มีความหมาย
  • ออกเสียงได้
  • ค้นหาได้

ข้อยกเว้นเป็นสุภาษิตที่i,j,k,m,nใช้ในการวนรอบ

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

นอกจากนี้เนื่องจากทุกวิธีต้องสั้นโดยใช้ส่วนนำหน้าเพื่อระบุว่าขอบเขตหรือประเภทไม่ได้ใช้งานอีกต่อไป

ชื่อนี้ดีกว่า:

radius
curvature
conicConstant
innerAperture
outerAperture
innerRadius
outerRadius

ผู้วิจารณ์กล่าวว่าสิ่งนี้ซับซ้อนเกินไปกับชื่อตัวแปรแบบยาว:

ป้อนคำอธิบายรูปภาพที่นี่

ชื่อตัวแปรสั้น ๆ ไม่ได้ทำให้ง่ายอย่างใดอย่างหนึ่ง:

fnZR = (r^2/fnR(1+Math.sqrt((1+k) * (r^2/R^2)))) + a[1]*r^2 + a[1]*r^4 + a[1]*r^6 ...;

คำตอบคือชื่อยาวและผลลัพธ์ระดับกลางจนกระทั่งคุณได้คำตอบในตอนท้าย:

thisNiceThing =  ( thisOKThing / thisGreatThing ) + thisAwsomeThing;

26
ตัวแปรเหล่านี้อาจถูกใช้ในสูตรทางคณิตศาสตร์ในรหัส สูตรทางคณิตศาสตร์มีมากง่ายต่อการอ่านที่มีชื่อตัวแปรสั้น ฉันใช้ชื่อตัวแปรแบบยาวในรหัสส่วนใหญ่ แต่คณิตศาสตร์ดีกว่าด้วยชื่อตัวแปรแบบสั้น ตัวอย่างสุ่ม: พิจารณาว่านานนี้จะมีชื่อตัวแปรยาว
MarkJ

@ MarkJ คุณพูดถูก
Tulains Córdova

1
ผลลัพธ์ระดับกลางมีประโยชน์เพิ่มเติมในการลดและแยกข้อผิดพลาดในการเขียนโปรแกรม สมองของเราสามารถประมวลผลข้อมูลได้ครั้งละหลายชิ้นเท่านั้นและมันก็ยากที่จะสังเกตเห็นข้อผิดพลาดในบางสิ่งเช่นfnZR = (r^2/fnR(1+Math.sqrt((1+k)) * (r^2/R^2))) + a[1]*r^2 + a[1]*r^4 + a[1]*r^6 ...;
eyelidlessness

1
มันไม่ใช่เรื่องยากหากเป็นขนมปังและเนยของคุณ
Radu

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

8

มีสองเหตุผลที่ดีที่จะไม่เปลี่ยนชื่อตัวแปรในรหัสดั้งเดิม

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

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


7
ถูกต้องแน่นอน แต่ความเสี่ยงของการขาดความเข้าใจนั้นยิ่งใหญ่กว่ามาก
Ross Patterson

2
คุณมีปัญหาใหญ่ขึ้นหากเครื่องมือของคุณไม่สามารถจัดการกับปัญหาง่าย ๆ เช่นเดียวกับที่คุณกล่าวถึง
AndSoYouCode

คำตอบ (1) การครอบคลุมการทดสอบอัตโนมัติที่สมเหตุสมผลและการห่อหุ้มสติ (2) ความชำนาญพร้อมการควบคุมเวอร์ชัน
Adamantish

5

มีเหตุผลที่ดีที่จะตั้งชื่อตัวแปรด้วยวิธีนี้หรือไม่หรือฉันเป็นธรรมในการอัปเดตให้เป็นชื่อที่อธิบายเพิ่มเติมเมื่อฉันเจอพวกเขา?

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

dDin better than dDinnerAperture
dDout better than dDouterAperture

... ถ้าฉันใช้มันในการคำนวณที่ซับซ้อนนาน ๆ การแสดงออกทางคณิตศาสตร์ที่เล็กลงมักจะง่ายกว่าที่จะเห็นทุกสิ่งในครั้งเดียว แม้ว่าจะเป็นอย่างนั้นก็ตามพวกเขาอาจจะดีกว่าในฐานะ dIn และ dOut ดังนั้นจึงไม่มีซ้ำ D ที่อาจนำไปสู่การพิมพ์ผิดที่ง่าย

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


7
อย่างน้อยที่สุดฉันก็กำจัดสัญกรณ์ระบบฮังการี ...
KChaloux

4
ผู้นำdคือชาวฮังการี? dx^2/dx = 2xฉันคิดว่ามันเป็นแคลคูลัสในขณะที่ใน
Shannon Severance

7
ถ้าฉันเห็นdDinnerApertureด้วยตัวเองฉันจะอ่านมันว่า "Dinner Aperture" และสงสัยว่ามันเป็นแค่วิธีตลก ๆ ในการพูดว่า "ปากของคุณ" ไม่เคยเป็นแฟนตัวยงของ "ตัวอักษรพิมพ์ใหญ่ตามด้วยตัวพิมพ์เล็ก" ในบางครั้งทำให้สับสนมาก
Darrel Hoffman

2
+1 นี่คือคำตอบ สูตรคณิตศาสตร์ที่มีความยาวมากง่ายต่อการอ่านที่มีชื่อตัวแปรสั้น ตัวแปรเหล่านี้อาจถูกใช้ในสูตรทางคณิตศาสตร์ในรหัส สูตรทางคณิตศาสตร์มีมากง่ายต่อการอ่านที่มีชื่อตัวแปรสั้น ฉันใช้ชื่อตัวแปรแบบยาวในรหัสส่วนใหญ่ แต่คณิตศาสตร์ดีกว่าด้วยชื่อตัวแปรแบบสั้น ตัวอย่างสุ่ม: พิจารณาว่านานนี้จะมีชื่อตัวแปรยาว
MarkJ

1
@ShannonSeverance ฉันเห็นด้วยกับคุณ มาจากภูมิหลังทางวิศวกรรม d ควรถูกสงวนไว้สำหรับแคลคูลัสอย่างแน่นอนเมื่อใช้ชื่อตัวแปรในแง่คณิตศาสตร์ (ตามที่ได้กล่าวไว้ที่นี่)
CodeMonkey

4

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

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

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

เพื่อสร้างคลาส Sundialนี้ฉันอาจจะอ้างถึงทรัพยากรครึ่งโหล, Astronomy Almanac, และตัวอย่างจากภาษาอื่น ๆ (PHP, Java, C ฯลฯ )

ในเกือบทั้งหมดนี้พวกเขาใช้ตัวย่อเหมือนกันซึ่งบนใบหน้าของมันไม่มีความหมายอะไรเลย

K, T, EPS, deltaPsi, eot, LM,RA

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

julianTime, nutationOfEclipticalLongitudeExpressedInDegrees, equationOfTime, ,longitudeMeanrightAscension

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


1

มีอย่างแน่นอน; บ่อยครั้งที่ชื่อตัวแปรแบบสั้นเป็นสิ่งที่จำเป็น

ในกรณีของฉันฉันใช้การนำทางจุดอ้างอิงในคลาส Robotics อาวุโสของฉันและเราตั้งโปรแกรมหุ่นยนต์ของเราใน KISS-C เราต้องการตัวแปรสำหรับพิกัดปัจจุบันและปลายทาง (x, y), ระยะทาง (x, y), ส่วนหัวปัจจุบันและปลายทางรวมถึงมุมเลี้ยว

โดยเฉพาะอย่างยิ่งในกรณีของพิกัด x และ y ชื่อตัวแปรแบบยาวนั้นไม่จำเป็นอย่างสมบูรณ์และชื่อเช่น xC (ปัจจุบัน x), yD (ปลายทาง y) และ pD (ปลายทาง phi) พอเพียงและเข้าใจง่ายที่สุด ในกรณีนี้.

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


0

มีเหตุผลที่ดีที่จะตั้งชื่อตัวแปรด้วยวิธีนี้หรือไม่หรือฉันเป็นธรรมในการอัปเดตให้เป็นชื่อที่อธิบายเพิ่มเติมเมื่อฉันเจอพวกเขา?

โดยปกติแล้วอัลกอริทึมที่ซับซ้อนถูกนำมาใช้ใน matlab (หรือภาษาที่คล้ายกัน) สิ่งที่ฉันได้เห็นคือคนที่รับช่วงชื่อตัวแปร ด้วยวิธีนี้มันง่ายที่จะเปรียบเทียบการใช้งาน

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

คู่มือการเข้ารหัสปกติทั้งหมดบอกว่าอย่าตั้งชื่อตัวแปรด้วยตัวอักษรตัวแรกที่แทนประเภท (เช่นในกรณีของคุณ) เพราะมันง่ายในการเรียกดูรหัสใน IDE ที่ทันสมัยทั้งหมด


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

0

ฉันคิดว่าเหตุผลสำหรับชื่อตัวแปรนั้นสั้นพอสมควร

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

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

เมื่อทำการสแกนผ่านซอร์สโค้ดจำนวนมากสิ่งนี้สามารถให้ประสิทธิภาพที่ดีได้

นอกจากนี้มันยังช่วยโปรแกรมเมอร์ที่ขี้เกียจพิมพ์ชื่อสั้น ๆ เหล่านี้เมื่อเขียนโค้ด

แน่นอน "ชวเลข" เหล่านี้ทั้งหมดคาดว่าจะแสดงอยู่ในตำแหน่งมาตรฐานในซอร์สโค้ด


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

0

หากต้องการจัดวางสิ่งที่ @ zxcdw พูดด้วยวิธีที่แตกต่างกันเล็กน้อยและทำอย่างละเอียดในแง่ของวิธีการ:

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

นี่คือรหัสชนิดที่คุณต้องการเขียน: นี่คือรหัสที่มีจำนวน จำกัด และง่ายต่อการย้าย

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

ตอนนี้ด้วยชื่อฟังก์ชั่นการอธิบายที่เหมาะสม (อย่างละเอียดหากจำเป็น!) เราจะลดโอกาสในการตีความชื่อตัวแปรที่ย่อให้สั้นลงเนื่องจากขอบเขตมีขนาดเล็กมาก


-1

ชื่อตัวแปรควรมีความหมายมากที่สุดเพื่อช่วยในการอ่านโปรแกรม คุณประสบด้วยตัวคุณเอง: คุณมีปัญหามากมายในการระบุว่าโปรแกรมทำอะไรเนื่องจากการตั้งชื่อไม่ดี

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


6
โปรดทราบว่าint dummy_variable_for_for_loops;เป็นคำอธิบายที่เป็นไปได้
Kaz

4
-1 เพราะคำตอบนี้ทำให้เกิดความสับสน ครั้งแรกมันบอกว่าไม่มีเหตุผลที่ดีจากนั้นก็พูดจบว่าจริงๆแล้วมี คำตอบจะดีกว่าหากมีการใช้ถ้อยคำใหม่เพื่อไม่ให้ขัดแย้งกับตัวเอง
ไบรอัน Oakley

ฉันจะเปลี่ยนสิ่งนั้นเป็น "อธิบายตามที่จำเป็น " ถ้าชื่อสั้น ๆ ที่บ่งบอกถึงวัตถุประสงค์ของตัวแปรแล้วก็ตกลงที่จะใช้ชื่อสั้น
Maximus Minimus

-1

แน่นอนนี่คือสิ่งที่ // ความคิดเห็นมีไว้เพื่ออะไร?

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


-1

สำหรับอินเทอร์เฟซ (เช่นลายเซ็นเมธอดลายเซ็นฟังก์ชัน) ฉันมักจะแก้ปัญหานี้ได้โดยใส่คำอธิบายประกอบการประกาศพารามิเตอร์ สำหรับ C / C ++ นี่คือการตกแต่งไฟล์. h เช่นเดียวกับรหัสของการใช้งาน

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

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

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


-1

มีข้อแก้ตัวสำหรับชื่อตัวแปรสั้นเกินไปหรือไม่?

ข้อแรก: การตั้งชื่อตัวแปรสำหรับพลังงาน e ขณะคำนวณสูตรเช่น E = MC2 ไม่ใช่การตั้งชื่อแบบสั้นเกินไป การใช้สัญลักษณ์เป็นอาร์กิวเมนต์สำหรับชื่อย่อไม่ถูกต้อง

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

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

(เพียงเพื่อรักษาตัวอย่าง 'สมจริง' คุณไม่ได้รับอนุญาตให้ใช้เครื่องมือตัวย่อเพราะเหตุใดปัญหาด้านความปลอดภัยไม่อนุญาตให้ใช้เครื่องมือภายนอกเพื่อสัมผัสรหัสฐาน)


1
ตัวอย่างของคุณยังไม่เหมือนจริงมาก
Radu

-1

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

double dR, dCV, dK, dDin, dDout, dRin, dRout

"d" ที่จุดเริ่มต้นของตัวแปรเหล่านี้มีไว้เพื่อระบุว่าพวกเขาเป็นคู่; แต่ภาษาบังคับใช้สิ่งนี้อยู่ดี แม้ชื่อเหล่านี้จะมีความซ้ำซ้อนแต่ก็มีมากถึง 50% ซ้ำซ้อน !

หากเราจะใช้หลักการตั้งชื่อเพื่อลดข้อผิดพลาดเราจะดีกว่าการเข้ารหัสข้อมูลที่ไม่ได้ตรวจสอบด้วยภาษา ตัวอย่างเช่นไม่มีภาษาใดที่จะบ่นdK + dRในโค้ดด้านบนแม้ว่ามันจะไม่มีความหมายในการเพิ่มหมายเลขไร้มิติให้กับความยาว

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

// Dimensions:
// l  = length
// rl = reciprocal length
double lR, rlCV, K, lDin, lDout, lRin, lRout

ภาษาจะยังช่วยให้เราเขียนK + lRแต่ตอนนี้ชื่อให้คำแนะนำแก่เราว่านี่อาจไม่ถูกต้อง

นี่คือความแตกต่างระหว่างSystems Hungarian (โดยทั่วไปไม่ดี) และApps Hungarian (อาจดี)

http://en.wikipedia.org/wiki/Hungarian_notation


1
ที่จริงแล้ว C ++ สามารถบ่นได้K + lR หากคุณประกาศหน่วยของคุณอย่างถูกต้อง ด้วยหน่วย SI สามารถทำการตรวจสอบมิติและการแปลงหน่วย การเพิ่ม3_feet + 2_meterควรไม่มีปัญหาในขณะที่2_meter+1_secondควรเป็นข้อผิดพลาดในการคอมไพล์
MSalters

@Malters นั่นเจ๋งมาก แม่แบบ / มาโครไม่ได้เกิดขึ้นกับฉัน ยังคงมีคำถาม "ผู้ไม่เชื่อเรื่องภาษา" เช่นนี้ฉันจะจัดกลุ่มหน่วยการคอมไพล์เวลาทั้งหมดภายใต้ร่ม "ประเภทที่แข็งแกร่งกว่า" โดยไม่คำนึงว่าภาษาจะเรียกพวกเขาว่า "ประเภท" หรือไม่;)
Warbo

เทมเพลตจำเป็นต้อง คุณไม่สามารถทำแคลคูลัสประเภทที่จำเป็นในแมโคร
MSalters

-2

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


9
จะเป็นอย่างไรเมื่อทำการดำเนินการทางคณิตศาสตร์โดยที่เงื่อนไขนั้นถือเป็นความรู้ทั่วไปในโดเมน ตัวอย่าง: ใช้ M แทน "มวล" ใน e = mc ^ 2
Andy Hunt

2
@andyBursh - ฉันต้องระวังที่นั่น โปรแกรมเมอร์มักไม่เชี่ยวชาญ (หรือมีความสามารถ) ในโดเมนปัญหา ที่กล่าวว่าสิ่งเหล่านี้สามารถใช้ได้โดยเฉพาะถ้ามีลิงค์ความคิดเห็นที่เหมาะสมกับสูตรที่เป็นปัญหา ฉันลืมเรื่องนี้ไปแล้ว
Telastyn

8
@Telastyn - หากคุณคิดว่าโปรแกรมเมอร์ไม่ใช่ผู้เชี่ยวชาญ แต่มักจะนำไปสู่การใช้คำย่อที่มีความหมายที่ชัดเจนและเปลี่ยนเป็นชื่อที่ยาวกว่าอย่างน้อยค่อนข้างคลุมเครือ (เช่นมีคนตัดสินใจตั้งชื่อตัวแปรท้องถิ่นradiusเมื่อมันเก็บรัศมีภายในไม่เข้าใจว่ามันคลุมเครือกว่าRin) จากนั้นผู้พัฒนาที่ไม่ใช่ผู้เชี่ยวชาญจะต้องแปลระหว่างศัพท์เฉพาะและศัพท์เฉพาะที่ธุรกิจเข้าใจทุกครั้งที่มีการอภิปรายเกี่ยวกับสมการ
Justin Cave

2
แล้ว "i" สำหรับตัวนับลูป หรือ "x" และ "y" เมื่อจัดการกับพิกัด? หรือตัวแปรที่มีขอบเขตเป็นโค้ดสองบรรทัด?
ไบรอัน Oakley

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