ฉันผิดศีลธรรมหรือไม่ที่ใช้ชื่อตัวแปรที่แตกต่างจากประเภทของชื่อนั้น ๆ


95

ตัวอย่างเช่นใช้รหัสนี้:

var person = new Person();

หรือสำหรับคุณ Pythonistas:

person = Person()

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

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


ฉันสงสัยเกี่ยวกับเรื่องนี้มาตลอด เป็นคำถามที่ดี!
William Brendel

18
การโทรหาบุคคลนั้นเป็นเรื่องที่โหดร้าย "บ๊อบ" ผิดอะไร?
Sam Meldrum

17
อย่าลืมก่อนที่ var จะมีความงามแบบเซนของ Person person = new Person ();
Jamie Ide

1
@ เจมี่คุณเรียกการพิมพ์แบบคงที่เหมือนเซนหรือเปล่า?
orokusaki

ฉันอยากจะเจาะลึกลงไปอีกระดับหนึ่งในคำถามนี้: การทำPerson Person=new Person();เรื่องนี้ผิดอย่างปฏิเสธไม่ได้หรือไม่? ตามที่ระบุไว้ในคำถามเราอยู่ในช่วงเวลาของการเน้นไวยากรณ์ที่น่าทึ่งและการจดจำบริบทซึ่งคอมไพเลอร์ของฉันไม่เคยบ่นว่าฉันทำแบบนั้น ฉันรักตัวแปรของฉัน CamelCased - ทำไมฉันจึงไม่ควร (ในสถานการณ์ที่Person Personมีการสร้างอินสแตนซ์ทั่วไปและเป็นเพียงตัวอย่างเดียวของคลาสและไม่มีความขัดแย้งเกิดขึ้นและเป็นไปไม่ได้)
Robert Synoradzki

คำตอบ:


94

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

fastPerson
slowPerson

อย่างอื่นก็แค่

person

สบายดีกับฉัน


8
"อะไรคือเหตุผลของคนที่บอกคุณว่ามันไม่ดี" - ดันโน นั่นเป็นเหตุผลที่ฉันเริ่มหัวข้อนี้ :-)
Jason Baker

เห็นได้ชัดว่าคุณไม่ต้องเข้ามาในรหัสของคนอื่น ฉันรู้ว่าเมื่อฉันถูกเรียกร้องให้ค้นคว้าข้อผิดพลาดที่เพิ่งค้นพบในโค้ดหลายปีโดยโปรแกรมเมอร์ที่ลาออกจาก บริษัท ไปนานแล้วสิ่งใดก็ตามที่ขัดขวางฉันขึ้นมาคือเวลาที่ไม่สามารถแก้ไขปัญหาได้ หากหนึ่งในอุปสรรคเหล่านั้นกำลังพยายามค้นหาว่าอินสแตนซ์คืออะไรและคลาสคืออะไรเพียงเพราะโปรแกรมเมอร์ไม่ใส่ใจที่จะพูดว่า "var currentPerson = New Person ();" นั่นก็ไร้ประโยชน์เสียเวลา ... และเมื่อลูกค้าของคุณกำลังรอการแก้ไขเวลาเป็นสิ่งสำคัญ
เดวิด

3
@ เดวิด - คุณจับฉัน! ฉันรู้ว่าการเข้ารหัสในสุญญากาศจะทำให้หัวที่น่าเกลียดไม่ช้าก็เร็ว :) แต่อย่างจริงจัง - ฉันพบว่ามันยากที่จะเชื่อว่าคุณสะดุดโดยไม่สามารถแยกแยะระหว่างประเภทและอินสแตนซ์ของพวกเขาตามหลักการตั้งชื่อนี้
Andrew Hare

2
@David - นั่นน่าจะเป็นปัญหาสำหรับเครื่องมือวิเคราะห์โค้ด ด้วยเหตุนี้จึงมีรูปแบบที่ประเภทขึ้นต้นด้วยตัวพิมพ์ใหญ่ใน Python
ilya n.

69

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

จะผิดอะไรถ้าคุณมีบุคคล 2 ประเภทและบุคคลนั้นจะผิดมาก


1
"จะเกิดอะไรขึ้นถ้าคุณมีบุคคลสองประเภทและบุคคลนั้นจะผิดมาก" - สิ่งนี้สมเหตุสมผลสำหรับฉัน
Jason Baker

1
หากการสร้าง API VB ของคุณไม่สามารถจัดการโค้ดได้เนื่องจากไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
JoshBerke

1
เฮ้ในกรณีของ API คุณกำลังกังวลเกี่ยวกับชื่อวิธีการสาธารณะหรือคุณสมบัติไม่ใช่ชื่อตัวแปรเพราะจะไม่เปิดเผยรหัสไคลเอ็นต์ สำหรับคำถามของ Jason ฉันก็ใช้การตั้งชื่อนี้ตลอดเวลา ไม่มีอะไรผิดปกติอย่างแน่นอน
Frederick The Fool

1
ตรงประเด็นของฉัน Frederick ทำไมการมีสองประเภทที่แตกต่างกันเฉพาะกรณีพื้นฐานเป็นความคิดที่ไม่ดี ;-)
JoshBerke

1
แม้ว่าจะไม่ผิด แต่ก็ทำให้โค้ดอ่านยากขึ้น ความสามารถในการอ่านก็เช่นกัน
J3r3myK

45

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

Person person = new Person(); // okay

int Int = 42; // pure evil

หากไม่มีความหมายจริงๆฉันสามารถให้ความหมายดั้งเดิมได้ฉันจะใช้ i หรือ s นอกเหนือจากดัชนีแบบวนรอบฉันไม่สามารถนึกถึงสถานการณ์เช่นนี้ได้อีก
AnthonyWJones

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

3
ตกลง ชื่อตัวแปรอักษรตัวเดียวกรีดร้องว่า "ฉันชั่วคราว" ดัชนีลูปควรเป็น i, j, k ตัวอื่น ๆ ควรเป็น a, b, c, x, y, z หรือตัวอักษรอื่น ๆ ที่ไม่สามารถเข้าใจผิดว่าเป็นอย่างอื่นเช่น l และ o
Bill the Lizard

ไชโย! 42 มันมากเกินไป :)
Vishal Seth

18

หากมีคนบอกว่าสิ่งนั้นชั่วร้ายให้ถามพวกเขาว่าสิ่งนี้ดีกว่าไหม:

var abc = new Person();

2
@ คริส: เป๊ะ! หรือยังดีกว่า: var temp = new Person();(ข้อจำกัดความรับผิดชอบ: ฉันรู้ว่ามีสถานที่ที่ใช้ตัวแปรชั่วคราวเพียงครั้งเดียว แต่บ่อยครั้งที่ฉันไม่เห็นสิ่งนี้ในรหัสของใครบางคนผู้เขียนก็ไม่เคยกลับไปให้ชื่อที่เหมาะสมแก่ตัวแปรและอาจ เป็น "abc" ด้วย)
Dinah

15

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


9

ฉันคิดว่าฉันจะถูกโหวตให้พูดอย่างนั้น แต่ ...

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


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

1
@ เดวิด: อีกครั้ง เมื่อคุณปู่คนแรกของฉันระหว่างทางฉันคิดว่ามันซ้ำซาก แต่ฉันสนใจว่าเราจะมอบโลกแบบไหน
Mike Dunlavey

8

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


6

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

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

หากไม่มีใครโต้แย้งอย่างชัดเจนฉันจะทำเช่นนี้ต่อไป


6

เหตุผลที่ถือว่าไม่ดีคือถ้าคุณต้องการมี 2 คนในอนาคตคุณสามารถลงเอยด้วยรหัสที่ดูเหมือน

บุคคล = บุคคลใหม่ ();

บุคคล person2 = บุคคลใหม่ ();

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

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


3

ฉันพูดชื่อสำหรับสิ่งที่มันคือถ้าตัวแปรหมายถึงคนที่มี 2 personWith2Dogsสุนัขเรียกว่า ตัวแปรมีขอบเขตสั้น ๆ (เช่น loop var) แล้วคนก็สบายดี


3

ฉันใช้รหัสนี้เป็นจำนวนมากและไม่คิดว่าจะมีอะไรผิดปกติ ที่กล่าวว่าฉัน (อาจ) จะไม่ใช้มันในวิธีการที่นานกว่าพูดหนึ่งหน้าจอและถ้ามีหลายอินสแตนซ์ของคลาสบุคคล อย่าตั้งชื่อพวกเขาอย่างแน่นอน person1, person2, person3 ...


3

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

Personสำหรับคลาส / ประเภท aPersonสำหรับตัวแปรโลคัล thePersonสำหรับพารามิเตอร์วิธีการ myPersonสำหรับตัวแปรอินสแตนซ์ ourPersonสำหรับตัวแปรคลาส

ในบางครั้งฉันอาจใช้pในบริบทท้องถิ่นที่ฉันมีข้อมูลอ้างอิงมากมาย แต่โดยปกติจะใช้กับดัชนีลูปและสิ่งที่คล้ายกันเท่านั้น


3

มันขึ้นอยู่กับ.

หากคุณมีรูปแบบการใช้อักษรตัวพิมพ์ใหญ่ที่เข้มงวดดังนั้นตัวแปรจะเริ่มเป็นตัวพิมพ์เล็ก (และใช้ under_scores หรือ camelCase สำหรับการแบ่งคำ) และ Classes เริ่มต้นด้วย Capital Letters จะเห็นได้ชัดว่าบุคคลนั้นเป็นตัวแปรและ Person คือคลาสและเมื่อมีคนเข้าใจสิ่งนี้ ดูเหมือนว่าจะไม่อยู่ในเนมสเปซที่ทับซ้อนกัน (ในทำนองเดียวกันผู้คนแทบจะไม่สับสนระหว่างคำกริยาหรือคำนาม "polish" กับคำคุณศัพท์ "Polish")

หากคุณไม่มีสไตล์ดังกล่าวแสดงว่าคุณมีสองชื่อที่อาจสับสนได้ง่ายและแตกต่างกันในบางกรณีเท่านั้น เลวร้าย.


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

ฉันไม่คิดว่าฉันได้ทำการแก้ไขแบบนี้ดังนั้นอาจเป็นของคนอื่น BTW มัน "ขัด"
David Thornley

2

อะไรคือข้อโต้แย้งที่แน่นอนที่คนเหล่านั้นใช้?

หากพวกเขาไม่อนุญาตให้คุณใช้บุคคลเป็นชื่อตัวแปรคุณอาจพิจารณาเพิ่มคำนำหน้า "a"

aPerson = Person()

2
นั่นจะแย่กว่าในความคิดของฉัน อ่านยากกว่าและไม่มีข้อมูลเพิ่มเติมใด ๆ
Joachim Sauer

ใช่ แต่อย่างน้อยชื่อก็แตกต่างจากชื่อชั้นซึ่งเป็นสิ่งที่พวกเขาต้องการอย่างชัดเจน
Gerrie Schenck

นั่นจะเป็นไปตามตัวอักษรของกฎหมาย แต่ไม่ใช่วิญญาณแน่นอน
Joachim Sauer

1
+1 ฉันใช้ thePerson สำหรับพารามิเตอร์และ myPerson สำหรับคนในพื้นที่ที่ฉันจัดการ
Amy B

2

ฉันคิดว่าสิ่งที่คุณกำลังทำอยู่นั้นสบายดี ฉันคิดว่าโดยทั่วไปแล้วสิ่งสำคัญคือต้องตกลงมาตรฐานการเข้ารหัส

ตัวอย่างเช่นฉันใช้ lowerCamelCase สำหรับอินสแตนซ์ตัวแปรและ UpperCamelCase สำหรับคลาส ฯลฯ

มาตรฐานการเข้ารหัสควรขจัดปัญหานี้

เมื่อฉันดูโปรแกรมโอเพนซอร์สที่ประสบความสำเร็จพวกเขามักจะมีมาตรฐานการเข้ารหัส

http://drupal.org/coding-standards

http://help.joomla.org/content/view/826/125/

http://wiki.rubyonrails.org/rails/pages/CodingStandards

http://lxr.linux.no/linux/Documentation/CodingStyle

การยอมรับมาตรฐานการเข้ารหัสควรเป็นการต่อสู้ครั้งสุดท้ายที่คุณมีในเรื่องนี้

ในความเป็นจริงดูรายการวิกิพีเดีย (จากhttp://en.wikipedia.org/wiki/CamelCase )

รูปแบบการเขียนโปรแกรมและการเข้ารหัส

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

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

รูปแบบการเขียนโค้ด Java ที่ใช้กันอย่างแพร่หลายกำหนดให้ใช้ UpperCamelCase สำหรับคลาสและ lowerCamelCase ใช้สำหรับอินสแตนซ์และวิธีการ [19] เมื่อรับรู้ถึงการใช้งานนี้ IDE บางตัวเช่น Eclipse ใช้ทางลัดตาม CamelCase ตัวอย่างเช่นในคุณสมบัติ Content Assist ของ Eclipse การพิมพ์เพียงตัวอักษรตัวพิมพ์ใหญ่ของคำ CamelCase จะแนะนำคลาสหรือชื่อเมธอดที่ตรงกัน (ตัวอย่างเช่นการพิมพ์ "NPE" และการเปิดใช้งานการช่วยเหลือเนื้อหาอาจแนะนำ "NullPointerException")

สัญกรณ์ภาษาฮังการีดั้งเดิมสำหรับการเขียนโปรแกรมระบุว่าตัวย่อของ "ประเภทการใช้งาน" (ไม่ใช่ประเภทข้อมูล) ควรนำหน้าชื่อตัวแปรทั้งหมดโดยส่วนที่เหลือของชื่อใน UpperCamelCase; ดังนั้นจึงเป็นรูปแบบของ lowerCamelCase CamelCase เป็นแบบแผนอย่างเป็นทางการสำหรับชื่อไฟล์ใน Java และสำหรับคอมพิวเตอร์ส่วนบุคคลของ Amiga

Microsoft .NET แนะนำ lowerCamelCase สำหรับพารามิเตอร์และฟิลด์ที่ไม่ใช่สาธารณะและ UpperCamelCase (หรือที่เรียกว่า "Pascal Style") สำหรับตัวระบุประเภทอื่น ๆ [20]

Python แนะนำ UpperCamelCase สำหรับชื่อคลาส [21]

รีจิสทรี NIEM ต้องการให้องค์ประกอบข้อมูล XML ใช้ UpperCamelCase และแอตทริบิวต์ XML ใช้ lowerCamelCase

ไม่มีแบบแผนเดียวสำหรับการรวมตัวย่อตัวพิมพ์ใหญ่ (ส่วนใหญ่เป็นคำย่อและการเริ่มต้น) ภายในชื่อ CamelCase วิธีการรวมถึงการทิ้งตัวย่อทั้งหมดไว้ในตัวพิมพ์ใหญ่ (เช่นใน "useHTTPConnection") และเหลือเพียงตัวอักษรตัวแรกในตัวพิมพ์ใหญ่ (เช่นใน "useHttpConnection")

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


2

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

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

  • ตัวบ่งชี้ของการคำนวณวัตถุประสงค์ทั่วไปถูกผลักลงไปในวิธีการวัตถุประสงค์ทั่วไป: หากคุณทำการจัดการโครงสร้างข้อมูลระดับกลางในวิธีการทางธุรกิจตัวอย่างเช่นอาร์เรย์ของผู้ใช้จะต้องมีการอนุมานซ้ำคุณจะต้องมีตัวแปรในขอบเขต ที่มีชื่อเหมือนusers[]และdeduplicatedUsers[]. ถ้าคุณย้ายการขจัดข้อมูลซ้ำซ้อนเป็นวิธียูทิลิตี้ที่คุณสามารถเรียกวิธีUtils.dedup(array)และคุณสามารถโทรอาร์เรย์ซ้ำหรือเพียงแค่deduplicatedArrayresult

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

  • หลักการดูแลร์รี่กำแพงของ "ความคลุมเครือท้องถิ่น is OK" - http://www.wall.org/~larry/natural.html


2

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

newContactดังนั้นถ้าคุณต้องการที่จะสร้างรายชื่อใหม่ในการประยุกต์ใช้สมุดที่อยู่ของคุณคุณอาจต้องการที่จะเรียกตัวแปร

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

เรียกได้ว่าเป็นการpersonละทิ้งโอกาสครั้งใหญ่ในการจัดทำเอกสารด้วยตนเองของโค้ด


เรียกว่าไม่เปิดเผยตัว! :)) var anonymous = บุคคลใหม่ (); หรือดีกว่านั้น: var you_know_who = new Person (); :))
Vadim Ferderer

@ วาดิมเฟอร์เดอเรอร์: var he_who_must_not_be_named = new Person();? :-)
Platinum Azure

2

เฉพาะในกรณีที่คุณกำลังเขียนโปรแกรมใน VB6 ในกรณีนี้สิ่งที่คุณทำนั้นผิดกฎหมาย แต่ไม่ผิดศีลธรรม


1

ฉันก็ทำเช่นกันและฉันก็ไม่เข้าใจว่าทำไมจึงควร 'ผิดศีลธรรม' แม้ว่าฉันจะเข้าใจว่าบางครั้งอาจจะสับสน แต่วันนี้เรามี IDE ที่มี Intellisense และการเน้นไวยากรณ์ซึ่งจะทำให้แน่ใจได้ว่า (ถ้าคุณทำผิดและอ้างอิงตัวแปรของคุณแทนชั้นเรียนของคุณและในทางกลับกัน) คุณจะ เห็นข้อผิดพลาดของคุณค่อนข้างเร็ว และเรายังมีคอมไพเลอร์ :)


1

ฉันไม่เห็นปัญหาใด ๆ กับการปฏิบัตินี้ ตราบใดที่มีตัวแปรเดียวของคลาสนั้นก็เขียนง่ายและอ่านง่าย Imo ที่ใช้ในโปรแกรมแก้ไขข้อความพื้นฐาน โดยส่วนตัวฉันจำไม่ได้ว่ามีใครเรียกสิ่งนี้ว่าเลวร้ายหรือผิดศีลธรรม ทำสิ่งนี้ต่อไป :)


1

ฉันคิดว่า 'กฎ' ที่คุณอาจนึกถึงมีไว้สำหรับประเภทดั้งเดิมมากกว่าและคลาสที่ชื่อคลาสสร้างชื่อตัวแปรไม่ดี

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

Decimal _decimal = item.BaseCost + item.Tax;

แต่ขอแนะนำให้ใช้ชื่อที่สื่อความหมายมากขึ้นเช่น "_total" หรือ "_cost"


1

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

หากสิ่งเหล่านี้แตกต่างกันเฉพาะในกรณีนี้จะใช้งานได้ดีในภาษาที่คำนึงถึงตัวพิมพ์เล็กและใหญ่เช่น C # แต่ไม่ใช่ใน VB.NET

ตัวอย่างเช่นใน VB ฉันจะเขียน

Private _name As String

แต่

Public Property Name() As String
    Get
        Return _name
    End Get
    Set(ByVal Value As String)
        _name = Value
    End Set
End Property

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


สิ่งเดียวที่ฉันไม่ชอบเกี่ยวกับแนวทางนี้คือตัวแปรที่ขึ้นต้นด้วยขีดล่างเดียวมักจะเกี่ยวข้องกับสมาชิกส่วนตัวของชั้นเรียน แต่ฉันคิดว่าแนวทางทั่วไปนั้นดี
Jason Baker

ใช่นี่คือสิ่งที่ฉันกำลังแสดงอยู่ที่นี่ การกำหนดตัวแปรในเครื่องเช่น "Dim person as New Person" ก็ใช้ได้ มาก (มาก) ในบางครั้งกับคอมไพเลอร์ VB มีความคลุมเครือและการใช้อักษรตัวพิมพ์ใหญ่อัตโนมัติแบบปกติจะไม่เกิดขึ้น มันเป็นภาพที่ดีที่ทุกอย่างไม่ดี
ChrisA

1

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


1

ผมใช้Person person = new Person()เองบ่อยๆ นิยมใช้ใน Java / C #

แม้ว่าฉันจะสงสัยเมื่อวานนี้ว่าทำไม

private enum DataType {NEW, OLD}

ไม่ทำงานใน C # ...

โดยเฉพาะอย่างยิ่งที่ได้เห็นวิธีการที่คุณสามารถใช้String, string, Double, double... ที่จะใน C #


enum รองรับเฉพาะ byte, sbyte, short, ushort, int, uint, long, ulong เช่นประเภทค่าตัวเลขที่ไม่ใช่เศษส่วน
Kev

1
Person person = new Person()

หนังสือของฉันสบายดี

สิ่งที่น่ากลัวก็คือเมื่อคุณมี:

string Person;
string person;

ง่ายมากที่จะผสม 2.


1

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

สำหรับประเภท CLR (int, string ฯลฯ ) คุณสามารถใช้ String หรือ string (ฯลฯ ) เพื่อประกาศประเภทได้ดังนั้นฉันจะหลีกเลี่ยงการใช้สิ่งต่างๆเช่น

int Int = 0;
string String = "hi there";

1

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

fastPerson / slowPerson เหมือนข้างบนนั้นใช้ได้ ... มันอธิบายและแตกต่างจากชื่อประเภทตัวแปร ... แต่มากับมนุษย์การเรียก int "Int" จะเป็นเรื่องขี้เกียจธรรมดา


1

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

void SaveToDatabase(Person person) {...}

เกี่ยวกับสิ่งเดียวที่คุณสามารถเรียกคนอย่างสมเหตุสมผลได้คือperson_to_saveหรืออะไรทำนองนั้นที่ดูเหมือนซ้ำซ้อน

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

void AddToAccount(Account account, Person person)  {...}

กว่านี้

void AddToAccount(Account account, Person dependent)  {...}

อย่างไรก็ตามโปรดอย่าใส่ 'a' หรือ 't' ไว้หน้าชื่อประเภท IE aPerson สำหรับ 'บุคคล' หรือ tPerson สำหรับ 'บุคคล' มันซับซ้อนเกินไปและไม่เพิ่มมูลค่าใด ๆ นอกจากนี้คุณยังเริ่มสร้างมลพิษให้กับขอบเขตของคุณด้วยตัวแปรมากมายที่ขึ้นต้นด้วย a หรือ t ซึ่งสามารถลดค่าของ intelli-sense ได้


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

0

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

Person aPerson = new Person();

มันทำให้รหัสอ่านเป็นธรรมชาติมากขึ้นฉันคิดว่า


0

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

กฎง่ายๆของฉัน? ข้อความในรหัสควรอ่านเหมือนประโยคภาษาอังกฤษง่ายๆ

บุคคล = บุคคลใหม่ ();

พนักงานลูกจ้าง = person.getRole (EMPLOYEE);

ผู้ปกครองหลัก = person.getRole (PARENT);

person.getFullName ();

พนักงาน.getSalary ();

parent.getChildren ();

parent.getFullName (); // สมมติว่าเป็นรูปแบบมัณฑนากรที่เล่น

ถ้า (person.hasRole (EMPLOYEE)) {

  ...

}

และอื่น ๆ

หากขอบเขตของตัวแปรมี จำกัด (เช่นวิธีการห่อหุ้มคือ 10-15 บรรทัด) ฉันอาจใช้ 'p' แทน 'person' ชื่อตัวแปรที่สั้นกว่าจะไม่ทำให้ไขว้เขวน้อยลงเมื่อพยายามเก็บบริบทไว้ในหัว หลีกเลี่ยงคำนำหน้าโดยไม่จำเป็นเช่น "a" หรือ (ตัวสั่น) สัญกรณ์ภาษาฮังกาเรียนและการวางตำแหน่งดังกล่าว (โปรดทราบว่าฉันไม่มีอะไรต่อต้านคำนำหน้าดังกล่าวเมื่อใช้ในบริบทที่เหมาะสม - รหัส C ++ / COM / ATL / Win32 API เป็นต้นซึ่งจะช่วยให้การมอบหมายงาน / การพิมพ์ตรง)

สอง (!) บิตของฉัน :-)

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