การใช้ชื่อพารามิเตอร์ที่แตกต่างจากชื่อประเภทเท่านั้นโดยปลอกถือเป็นแนวทางปฏิบัติที่ไม่ดีใน C #?


43

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

public Range PadRange(Range range) {}

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

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

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

public Range PadRange(Range myRange) {}

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

ฉันยังเห็นดังต่อไปนี้

public Range PadRange(Range rangeToPad) {}

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

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


35
หากคุณไม่สามารถหาพารามิเตอร์ที่อธิบายได้มากกว่าRange rangeนี้ก็ดี
Robert Harvey

21
ในสถานการณ์นี้ IDE จะใช้สี 'ช่วง' และ 'ช่วง' แตกต่างกันดังนั้นจึงเป็นเรื่องง่ายที่จะเห็นว่าประเภทหนึ่งเป็นประเภทและอีกชื่อหนึ่งเป็นชื่อตัวแปร
17 ของ 26

10
ใช่ฉันจำได้ว่า มันอยู่ในแนวทางการออกแบบของพวกเขาเป็นข้อพิจารณา "พิจารณาให้ชื่อเหมือนกันกับคุณสมบัติ" docs.microsoft.com/en-us/dotnet/standard/design-guidelines/?hl=th
Jason Tyler

11
นอกจากนี้ยังปรับ: Range r(อย่างน้อยสำหรับร่างกายวิธีสั้น) Range toPadและ
Bergi

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

คำตอบ:


100

อย่าคิดมากเรื่องนี้Range rangeดี ฉันใช้การตั้งชื่อแบบนี้มานานกว่า 15 ปีใน C # และอาจนานกว่าใน C ++ และไม่เคยพบข้อเสียจริงจากมันเลย

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


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

17
ฉันจะถือว่าWack(Bozo bozoToBeWacked)เป็นตัวอย่างของความซ้ำซ้อนในชื่อตัวแปรที่แสดงออกอย่างเพียงพอโดยวิธีการของตัวเอง (และไม่พึงประสงค์ต่อคำถามเดิม) Wack(Person bozo)มีค่าทางความหมายมากกว่าอย่างไรก็ตามเนื่องจากมันบ่งบอกว่าคาดว่าจะมีเพียง bozos เท่านั้นที่ถูกกำจัด
Miral

2
initialRangeในกรณีที่คุณพูดถึงในวรรคที่สองผมมักจะเปลี่ยนชื่อพารามิเตอร์เพื่อสิ่งที่ต้องการ มันยังคงเป็นแบบทั่วไปมาก แต่ก็ไม่ได้มีระดับความขมขื่นเกือบเท่าmyRangeกัน
Jaquez

@Miral: Punch(Bozo punchingBozo, Bozo bozoToBePunched)มันจะกลายเป็นที่เกี่ยวข้องมากขึ้นในกรณีดังกล่าวเป็น การตั้งชื่อโดยละเอียดนั้นมีความเกี่ยวข้องมากกว่าเมื่อคุณต้องแยกแยะความแตกต่างระหว่างสิ่งต่าง ๆ (ซึ่งอธิบายด้วยความหมายด้วยคำเดียวกัน) คำแนะนำของ OP Range rangeToPadไม่จำเป็นในตัวอย่างวิธีการพารามิเตอร์หนึ่งของเขา แต่อาจจำเป็นอย่างยิ่งสำหรับวิธีที่ใช้ในRangeวัตถุหลาย ชิ้น
Flater

7
@Flater Punch(Bozo source, Bozo target)จะทำงาน
Thomas Ayoub

17

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

this.range = range;

และโดยปกติฉันจะมีคุณสมบัติชื่อ Range

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

คุณควรเข้มงวดกับสมาชิกที่มีคุณสมบัติครบถ้วนด้วย "สิ่งนี้" แม้ว่านั่นเป็นสิ่งที่ StyleCop มีไว้สำหรับ

บันทึกข้าง StyleCop

รับประกันการโต้เถียง!

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

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

"มันเป็นตัวละครมากขึ้น!" อย่างจริงจัง? "เวลารวบรวมจะพุ่งสูงขึ้น!" อย่างจริงจัง? ฉันจะต้องยกก้อยเมื่อพิมพ์! " ราวกับว่าเวลาในการพิมพ์มีความสำคัญในเวลาการพัฒนาทั้งหมด

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

StyleCop ทำอะไรได้มากกว่านี้ (ฮ่าฮ่า) มีหลายวิธีที่นักพัฒนาสามารถ (เพียงพิจารณาการจัดรูปแบบโค้ด) ทำให้รอดพ้นจากงานบำรุงรักษาของผู้สืบทอดของเขา StyleCop ป้องกันส่วนใหญ่ มันมีค่ามาก

หากคุณยังใหม่กับมัน: โดยทั่วไปแล้วจะทำให้คุณบ่นประมาณหนึ่งหรือสองสัปดาห์แล้วคุณจะรักมัน


19
" คุณควรเข้มงวดกับสมาชิกที่มีคุณสมบัติครบถ้วนด้วย" สิ่งนี้ "แม้ว่า " -1 ห้ามใช้thisยกเว้นเมื่อจำเป็น มันเป็นแค่เสียงอื่น ใช้_rangeสำหรับฟิลด์และthisไม่จำเป็นต้องใช้ยกเว้นในวิธีการขยาย
David Arno

12
ฉันเห็นด้วยกับ @DavidArno 'นี่' เป็นเพียงเสียงที่บริสุทธิ์ 'ช่วง' เป็นคุณสมบัติ '_range' เป็นเขตข้อมูลและ 'ช่วง' เป็นพารามิเตอร์
17 ของ 26

8
@David ถ้าตัวแปรเป็นสมาชิกของคลาสมันเป็นสิ่งจำเป็นและใช้คำนำหน้าใดก็ได้เพื่อส่งสัญญาณว่าคุณกำลังมองหาสมาชิกของชั้นแทนที่จะเป็นอาร์กิวเมนต์หรือตัวแปรท้องถิ่น
Martin Maat

6
IDE ของฉันจะยิงลูกไฟตัวที่สองฉันจะกำหนดตัวแปรให้ตัวเอง
Koekje

21
@DavidArno ดูแลเพื่ออธิบายว่าทำไม "เสียง" ของ_เป็นที่นิยมมากกว่าเสียงของthis.? ฉันจะเถียงว่าหนึ่งมีความหมายบังคับใช้โดยภาษา (และมักจะมีการเน้นไวยากรณ์) ในขณะที่คนอื่นไม่ได้
Clint

9

คำแนะนำตัวเองของฉันเกี่ยวกับวิธีการตั้งชื่อพารามิเตอร์และตัวแปรนั้นค่อนข้างง่าย:

  1. หากชื่อมีประเภทที่ถูกส่งหรือส่งคืนแสดงว่าคุณทำผิด
  2. ตั้งชื่อสิ่งต่าง ๆ ตามสิ่งที่พวกเขาตั้งใจไว้ไม่ใช่สิ่งที่พวกเขาทำ
  3. โปรดจำไว้ว่ารหัสนั้นอ่านมากกว่าที่เขียนไว้

ดังนั้นวิธีการที่ดีที่สุดในความคิดของฉันจะเป็น:

Range Pad(Range toPad)

การย่อชื่อเมธอดคือการอธิบายตนเอง

ชื่อพารามิเตอร์toPadจะบอกผู้อ่านทันทีว่าพารามิเตอร์นั้นน่าจะถูกแก้ไขแบบแทนที่ด้วยการบุรองแล้วส่งคืน rangeในทางตรงกันข้ามไม่มีสมมติฐานสามารถทำเกี่ยวกับชื่อตัวแปร

นอกจากนี้ในเนื้อความจริงของวิธีการRangeตัวแปรอื่น ๆที่ถูกนำเสนอจะ (ควร) ตั้งชื่อตามความตั้งใจของพวกเขาดังนั้นคุณอาจจะมีpaddedและunpadded... toPadสอดคล้องกับอนุสัญญาการตั้งชื่อเหล่านั้น แต่rangeเพียงแค่ยื่นออกมาและไม่ได้เจล


3
padded/ unpaddedฟังดูดีสำหรับตัวแปรที่ไม่เปลี่ยนแปลงในท้องถิ่น แต่ถ้ามีtoPadพารามิเตอร์ที่เปลี่ยนแปลงได้หลังจากทำ padding เสร็จแล้วชื่อtoPadนั้นไม่เหมาะสมอีกต่อไป (เว้นแต่ผลลัพธ์จะถูกส่งคืนทันที) ฉันอยากจะติดRange rangeในกรณีเหล่านั้น
kapex

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

จากลายเซ็นที่วิธีการส่งกลับPad Rangeสำหรับฉันแล้วก็หมายความว่าสิ่งที่ฉันได้ส่งผ่านไปจะได้รับการเก็บรักษาไว้ไม่ได้ถูกแก้ไขแทนที่และเบาะใหม่Rangeจะถูกส่งคืน .
Aaron M. Eshbach

1
ฉันไม่แน่ใจว่าจะคิดถึงคำแนะนำของคุณอย่างไร Pad(toPad)รู้สึกผิดที่ IMHO คุณทำดีในการปกป้องมุมมองของคุณ คุณได้รับ +0 จากฉัน! :)
Eric Duminil

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

3

สำหรับการตั้งชื่อองค์ประกอบรหัส (ประเภทตัวแปรฟังก์ชั่นอะไรก็ได้) คำถามสำคัญที่ถามตัวเองคือ

ถ้าฉันพิมพ์ผิดคอมไพเลอร์จะพบมันให้ฉันได้ไหม

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

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

ที่คุณจะต้องกังวลจะเป็นอย่างไรถ้ามีสองตัวแปรวิธีการฟังก์ชั่นหรือคุณสมบัติในขอบเขตปัจจุบันเรียกว่าและrange Rangeในกรณีนั้นคอมไพเลอร์อาจจะปล่อยให้ผ่านและคุณจะได้รับพฤติกรรมที่ไม่คาดคิดในเวลาทำงาน โปรดทราบว่านั่นคือองค์ประกอบรหัสสองประเภทใด ๆไม่ใช่แค่ "ตัวแปรสองตัว" หรือ "สองฟังก์ชั่น" - ทั้งหมดนี้สามารถส่งเข้าหากันโดยปริยายโดยมีการสังหารเกิดขึ้นเมื่อทำงาน คุณอาจได้รับคำเตือน แต่คุณไม่สามารถรับประกันอะไรได้มากกว่านั้น คุณมีปัญหาที่คล้ายกันถ้าคุณได้สองประเภทประกาศเรียกและrangeRange

นอกจากนี้โปรดทราบว่าลักษณะเดียวกันนี้ใช้กับรูปแบบสัญกรณ์ฮังการีซึ่งชื่อจะถูกนำหน้าด้วยอักขระอย่างน้อยหนึ่งตัวเพื่อพูดอะไรเพิ่มเติมเกี่ยวกับสิ่งที่เป็น หากคุณมีตัวแปรที่เรียกว่าRangeและตัวชี้ไปยังเรียกว่าPRangeมันง่ายที่จะพลาดโดยบังเอิญPเช่น C # ควรตรวจจับสิ่งนี้ แต่ C และ C ++ จะเตือนคุณอย่างมากเท่านั้น หรือมากกว่าไม่แยแสสมมติว่าคุณมีรุ่นที่เรียกว่าคู่DRangeและคุณ downsample FRangeที่ลอยรุ่นที่เรียกว่า ใช้ลอยหนึ่งโดยอุบัติเหตุ (ซึ่งเป็นเรื่องง่ายตั้งแต่คีย์จะอยู่ติดกันบนแป้นพิมพ์) และรหัสของคุณจะชนิดของการทำงาน แต่มันจะตกไปในรูปแบบที่แปลกและคาดเดาไม่ได้เมื่อกระบวนการไหลออกมาจากความละเอียดและ underflows

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


เพียงแค่ทราบสำหรับผู้อ่าน - สำหรับ C # คนควรจริงๆหลีกเลี่ยงฮังการีโน้ต ในขณะที่มันมีประโยชน์ในเวลาที่เก่ากว่าเมื่อเน้นไวยากรณ์ไม่ได้เป็นสิ่งที่ จำกัด แต่ทุกวันนี้มันไม่ได้ช่วย
T. Sar - Reinstate Monica

@ T.Sar แม้จะกลับมาในวันนี้ฉันเกลียดมันด้วยความหลงใหล! อย่างที่คุณพูด IDEs ที่ดีกว่าได้แก้ปัญหาที่มันมุ่งไปแล้ว แต่มันก็ยังปรากฏอยู่บ่อยครั้ง คุณจะยังคงเห็นมันหากคุณต้องการพูดคุยกับ Windows API ตัวอย่างเช่นด้วยเหตุผลทางประวัติศาสตร์ ฉันไม่ต้องการทุบตีสไตล์ที่คนอื่นชอบถ้าพวกเขาชอบ แต่ฉันต้องการใช้มันเป็นตะขอสำหรับแสดงว่าตัวใหญ่ / ตัวเล็กไม่ใช่วิธีเดียวที่คุณสามารถทำให้เสียชื่อ
เกรแฮม

ฉันรู้ว่าคุณไม่ได้เสนอให้ใช้สัญกรณ์ฮังการี แต่ฉันก็ทราบด้วยว่า devs รุ่นเยาว์นั้นมีจุดอ่อนมากมายสำหรับสิ่งที่มีชื่อเท่ ๆ ความสามารถในการพูดว่า "รหัสของฉันถูกเขียนในรูปแบบการเข้ารหัสนินจาลับสุดยอดนี้ - สัญลักษณ์ของฮังการี!" อาจฟังดูเยินยอใจสำหรับเด็ก ฉันเห็น devs มากเกินไปตกเป็นเหยื่อในคำพูดที่เท่ห์ ... สัญกรณ์ฮังการีคือความเจ็บปวดให้รูปแบบของซอร์สโค้ด xX
T. Sar - Reinstate Monica

@ T.Sar จริงพอ "คนที่จำอดีตไม่ได้ก็ต้องทำซ้ำ" และทุกอย่าง : /
Graham

1
พวกเรากำลังพูดถึงสัญกรณ์ฮังการีต้นฉบับหรือว่าไมโครซอฟท์ตีความผิด ๆ หรือไม่ (ใกล้กับ"นักเขียนเอกสารในทีม Windows คิดค้นโดยไม่ได้ตั้งใจสิ่งที่ต่อมาเป็นที่รู้จักในชื่อว่า Systems Hungarian"และในบทสัมภาษณ์ของ Joel Spolsky โดย Leo Laporte 277, 2016-12-12, 04 นาที 00 วินาที - 06 นาที 35 วินาที )?
Peter Mortensen

1

เกร็ดเล็กเกร็ดน้อยหนึ่งที่ฉันต้องการเพิ่มในขณะที่Range rangeสิ่งนี้ถูกต้องตามกฎหมาย syntactically มันอาจทำให้สิ่งที่ท้าทายมากขึ้นในการแก้ปัญหาหรือ refactor กำลังมองหาตัวแปรหนึ่งตัวที่ชื่อว่า "ช่วง" ในไฟล์ที่มีตัวแปรประเภท Range มากมายอยู่ใช่ไหม คุณอาจจะทำงานมากขึ้นในภายหลังเนื่องจากตัวเลือกการตั้งชื่อนี้

นี่ขึ้นอยู่กับบริบทเป็นส่วนใหญ่ หากเป็นไฟล์ 30 บรรทัดคำสั่งของฉันจะไม่เข้าสู่การเล่นจริงๆ


7
คนส่วนใหญ่ใช้เครื่องมือที่แยกความแตกต่างระหว่างชนิดและพารามิเตอร์หรือตัวแปรสำหรับการพัฒนา Windows สิ่งที่คุณอธิบายทำให้ฉันนึกถึงวัน grep เก่าที่ดีใน Unix
Frank Hileman

1
@ FrankHileman มันอาจทำให้คุณประหลาดใจ แต่ Unix ยังมีชีวิตอยู่และ grep ยังคงใช้งานอยู่ (: D) เนื่องจาก grep เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตามตัวอักษรดังนั้นจึงไม่มีปัญหาที่กล่าวถึง อย่างไรก็ตามถึงแม้เราจะเกลียดชัง windows-Haters แต่ก็ไม่ค่อยใช้ grep สำหรับซอร์สโค้ดเนื่องจาก IDE นั้นดีกว่าการค้นหาทั่วไปมาก
maaartinus

ฉันคิดว่าเราเห็นด้วยว่าแพลตฟอร์มดังกล่าวไม่ใช่ประเด็น grepเป็นเครื่องมือที่ยอดเยี่ยม แต่ไม่ใช่เครื่องมือการปรับโครงสร้าง มีเครื่องมือการรีแฟคเตอร์อยู่ในทุกแพลตฟอร์มการพัฒนาที่ฉันใช้ (OS X, Ubuntu, Windows)
Eric Wilson

@EricWilson ครั้งเดียว grep และ sed เป็นเครื่องมือการรีแฟคเตอร์เดียวในยูนิกซ์
Frank Hileman

@ FrankHileman เพียงเพราะบางสิ่งบางอย่างถูกใช้เป็นเครื่องมือการรีแฟคเตอร์ไม่ได้หมายความว่ามันเป็นสิ่งหนึ่ง ฉันสามารถ refactor ใน notepad แต่นั่นไม่ได้ทำให้มันเป็นมากกว่าโปรแกรมแก้ไขข้อความ
Eric Wilson

1

ฉันคิดว่าคุณสามารถใช้Range rangeทุกวันนี้ได้ด้วยเหตุผลเดียวนั่นคือการเน้นไวยากรณ์ IDEs สมัยใหม่มักจะเน้นชื่อประเภทและชื่อพารามิเตอร์ในสีที่แตกต่างกัน นอกจากนี้ชนิดและตัวแปรยังมี "ระยะทางแบบลอจิคัล" พอสมควรเพื่อไม่ให้สับสนได้ง่าย

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


0

เมื่อฟังก์ชั่นเป็นแบบทั่วไปมันก็เป็นเหตุผลว่าพารามิเตอร์จะเป็นแบบทั่วไปและดังนั้นจึงควรมีชื่อสามัญ

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

public String removeNonDigits(String phoneNumber)

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

ดังนั้นแทนที่จะพูดว่า Range Range คุณสามารถพูด Range rangeToPad ได้ แต่สิ่งนี้เพิ่มข้อมูลอะไร? แน่นอนมันเป็นช่วงที่จะเสริม มันจะเป็นอะไรอีก?

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

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

public Range pad(Range range1, Range range2)

ความแตกต่างระหว่าง range1 และ range2 คืออะไร ฉันควรจะรู้ได้อย่างไร? ถ้ามันเป็นสิ่งที่พวกเขาเป็นค่าทั่วไปและค่าที่เปลี่ยนแปลงได้สองค่าจริง ๆ เช่น

public boolean overlap(Range range1, Range range2)

ฉันคาดหวังว่าจะให้ผลลัพธ์เป็นจริงหากช่วงทับซ้อนและเป็นเท็จถ้าไม่มีดังนั้นจึงเป็นแบบทั่วไปและใช้แทนกันได้

แต่ถ้าพวกมันต่างกันให้ฉันรู้ว่ามันต่างกันอย่างไร! ฉันเพิ่งทำงานกับโปรแกรมเมื่อเร็ว ๆ นี้ที่มีคลาส "สถานที่" เพื่อเก็บข้อมูลเกี่ยวกับสถานที่ทางภูมิศาสตร์และด้วยตัวแปรประเภทนี้ที่ชื่อ "p", "สถานที่", "สถานที่", "สถานที่ 2", "myPlace" ฯลฯ ว้าว ชื่อจริง ๆ ช่วยฉันพิจารณาว่าอันไหน

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