วิธีการตั้งชื่อบางอย่างเมื่อตัวเลือกตรรกะเป็นคำหลักที่สงวนไว้? [ปิด]


64

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

ฉันคิดว่ามีวิธีแก้ปัญหาการปฏิบัติที่ดีที่สุดสำหรับปัญหานี้ สิ่งเหล่านี้สามารถจัดทำโดยผู้สร้างหรือผู้ว่าราชการของภาษาโปรแกรมและสภาพแวดล้อม ตัวอย่างเช่นถ้า python.org (หรือ Guido van Rossum) บอกว่าจะจัดการกับมันอย่างไรใน Python นั่นจะเป็นแนวทางที่ดีในหนังสือของฉัน ลิงก์ MSDN เกี่ยวกับวิธีจัดการกับมันใน C # จะดีเช่นกัน
แนวทางที่จัดทำโดยผู้มีอิทธิพลที่สำคัญในวิศวกรรมซอฟต์แวร์ก็ควรมีคุณค่าเช่นกัน บางที Google / Alphabet มีคู่มือสไตล์ที่ดีที่สอนเราถึงวิธีจัดการกับมัน?

นี่เป็นเพียงตัวอย่าง: ในภาษา C # "default" เป็นคำหลักที่สงวนไว้ เมื่อฉันใช้ enum ฉันอาจต้องการตั้งชื่อค่าเริ่มต้น "default" (คล้ายกับ "switch" statement) แต่ไม่สามารถทำได้
(C # คำนึงถึงขนาดตัวพิมพ์และค่าคงที่ enum ควรเป็นตัวพิมพ์ใหญ่ดังนั้น "Default" จึงเป็นตัวเลือกที่ชัดเจนที่นี่ แต่สมมติว่าไกด์นำเที่ยวสไตล์ปัจจุบันของเรากำหนดค่าคง enum ทั้งหมดให้เป็นตัวพิมพ์เล็ก)
เราสามารถพิจารณาคำว่า "แต่สิ่งนี้ไม่เป็นไปตามหลักการของความประหลาดใจน้อยที่สุด เราควรพิจารณา "มาตรฐาน" และ "เริ่มต้น" แต่น่าเสียดายที่ "ค่าเริ่มต้น" เป็นคำที่สื่อถึงจุดประสงค์ของมันในสถานการณ์นี้อย่างแน่นอน


15
ฉันจะใช้บางอย่างเช่น "default_value" ความหมายยังคงเหมือนเดิม แต่คุณต้องพิมพ์อักขระเพิ่มอีกสองสามตัว
Mael

26
@ Darkhogg หากฉันพบว่าหนึ่งในรหัสของฉันฉันจะเปลี่ยนพวกเขาทันที การสะกดคำผิดหรือการตั้งชื่อการละเมิดไม่เป็นที่ยอมรับ
MetaFight

26
@MetaFight - ยกเว้นว่าใน Java การเรียกตัวแปรที่เก็บคลาสclazzนั้นในทางปฏิบัติแล้วเป็นมาตรฐานแบบพฤตินัย มันเป็นส่วนหนึ่งของแผนการตั้งชื่อแพลตฟอร์ม การทำสิ่งอื่นจะเป็นการละเมิดความคาดหวังที่คนอื่นอาจอ่านรหัสของคุณดังนั้นควรทำในกรณีที่จำเป็นจริงๆเท่านั้น
Periata Breatta

6
เริ่มต้น เป็นค่า enum ดูเหมือนว่าตรงกันข้ามกับประสิทธิผล ควรเป็นชื่อเฉพาะโดเมนที่อธิบายค่าเริ่มต้น ควรมีวิธีการคืนค่าเริ่มต้น
qwerty_so

18
@AndresF ฉันไม่เห็นด้วย. ฉันมักจะพบว่ามันง่ายมากที่จะโต้แย้งกับนักออกแบบของ Java แม้ว่าฉันจะไม่จับพวกเขา พวกเขาทำงานในป่าตะวันตก
MetaFight

คำตอบ:


63

สำหรับตัวเลือก enum Defaultคุณควรใช้กรณีที่ชื่อเหมือน เนื่องจาก C # คำนึงถึงขนาดตัวพิมพ์มันจะไม่ขัดแย้งกับคำหลักที่สงวนไว้ ดูแนวทาง .net การตั้งชื่อ

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

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


แน่นอนว่าภาษาอื่นมีไวยากรณ์และคำหลักต่างกันดังนั้นจึงสามารถแก้ไขปัญหานี้ได้

SQLมีค่อนข้างมากของคำหลัก [Table]แต่มันเป็นเรื่องธรรมดามากที่จะเพียงแค่หนีตัวระบุเช่น บางคนทำเช่นนั้นสำหรับตัวระบุทั้งหมดโดยไม่คำนึงว่าพวกเขาขัดแย้งกับคำหลักหรือไม่ (หลังจากทั้งหมดคำสำคัญการปะทะกันสามารถนำมาใช้ในอนาคต!)

Powershell (และภาษาสคริปต์อื่น ๆ ) นำหน้าตัวแปรทั้งหมดด้วย sigil like $ ซึ่งหมายความว่าพวกเขาจะไม่ชนกับคำหลัก

เสียงกระเพื่อมไม่มีคำหลักเลยอย่างน้อยก็ไม่ได้อยู่ในความหมายทั่วไป

Pythonมีการประชุมที่เป็นที่ยอมรับอย่างเป็นทางการในPEP-8 :

ใช้ cls สำหรับอาร์กิวเมนต์ตัวแรกกับเมธอด class เสมอ

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

บางภาษาเช่นBrainfuckหรือWhitespaceหลีกเลี่ยงการกำหนดคำเลยการหลีกเลี่ยงปัญหาอย่างหรูหรา

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


2
คุณไม่ควรใช้ความไวตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เพียงอย่างเดียว แม้ว่าจะไม่ได้เป็นปัญหาในการใช้งานจริง แต่ภาษา NET บางภาษาอาจไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กดังนั้นคุณอาจพบปัญหาบางอย่างที่ไม่คาดคิด
Vivelin

6
@Vivelin: คุณไม่ควรมีสมาชิกสาธารณะหรือชื่อประเภทที่แตกต่างกันเฉพาะในกรณีเนื่องจากอาจนำไปสู่ปัญหาสำหรับภาษาอื่น ๆ แต่สิ่งนี้ไม่เกี่ยวข้องกับสิ่งที่ฉันแนะนำเนื่องจากคำหลักไม่ใช่ตัวระบุ (และภาษาอื่นจะมีคำหลักอื่น ๆ )
JacquesB

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

@VinVin ไม่ทุกภาษา. NET เป็นตัวพิมพ์เล็ก - ใหญ่ฉันรู้ว่า VB.NET และ Powershell; มีคนอื่นอีกไหม?
Zev Spitz

@ ZevSpitz OP ที่เรียกว่า C # โดยเฉพาะซึ่งเป็นสาเหตุที่ฉันคิดว่า Vivelin ใช้มันเป็นตัวอย่างของเขา แต่อย่างที่คุณพูดว่า VB.NET ไม่ต้องตรงตามตัวพิมพ์ใหญ่ - เล็กดังนั้นตามปกติฉันคิดว่ามันคงเป็นภาษาต่อพื้นฐาน . ไม่ใช่ทุกภาษาที่มีคำสงวนไว้เหมือนกัน
Shaggy13spe

22

ฉันจะเพิ่มขีดล่าง (ค่าดีฟอลต์ _)

ข้อดี:

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

ทำไมฉันไม่ชอบโซลูชันอื่น ๆ :

คำพ้องความหมาย:

  • หายาก
  • มักจะไม่ได้ความหมายเดียวกันแน่นอน (ความแตกต่าง)

การต่อท้าย / การเติมคำ:

  • ไม่สอดคล้องกัน (ค่าเริ่มต้นค่าเริ่มต้นรายการ)
  • เพิ่มรายละเอียดโดยไม่ต้องอ่านเพิ่มขึ้น

เปลี่ยนตัวอักษร (clazz แทนคลาส):

  • ไม่สอดคล้องกัน (clazz, klass, klazz)

ต่อท้ายตัวเลข (ค่าเริ่มต้น 1):

  • ทำให้คำถามสำหรับ default2

การต่อท้าย / การเตรียมจดหมาย:

  • ไม่ชัดเจน (โปรแกรมเมอร์ต้องเดาว่ามันใช้สำหรับการแก้ไขชื่อและไม่ใช่ทางลัดสำหรับสิ่งอื่น)

การหลีกเลี่ยงคำหลัก (@default (c #), `default` (scala))

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

ฉันจะไม่ใช้เมื่อไร:

  • ที่มีอยู่ใช้กันอย่างแพร่หลายในการประชุมอื่น ๆ
  • ฉันรู้คำพ้องความเหมาะสมแล้ว
  • ในกรณี enum เฉพาะของคุณฉันจะทำตามคำตอบ @JacquesB

7
นี่เป็นวิธีแก้ปัญหาที่มักใช้ใน Python ฉันไม่ได้เรียกร้องให้มันเป็นสิ่งที่งดงามที่สุด แต่ก็ใช้ได้ดี
fralau

1
@fralau Python แย่มากโดยเฉพาะ - ฉันเกลียดตัวระบุเช่น "อินพุต"
Christian Sauer

ในหลายภาษาเราจะเห็นklassตัวแปรซึ่งclassเป็นคำที่สงวนไว้ ฉันไม่เคยเห็นdefawltแต่มันเป็นความคิดเดียวกัน ฉันต้องการdefault_(และอาจจะclass_ถ้าไม่เหยียบย่ำอนุสัญญาที่จัดตั้งขึ้นโดยการทำเช่นนั้น)
nigel222

คุณไม่ได้รวมตัวเลือกในการหลีกเลี่ยงคำหลัก
CodesInChaos

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

18

"ค่าเริ่มต้น" อาจไม่ใช่ค่า enum ที่เป็นประโยชน์ มันแสดงให้เห็นถึงพฤติกรรมที่อาจมีการเปลี่ยนแปลงขึ้นอยู่กับบริบทที่มีการใช้

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

หรือดีกว่าให้ใช้ความพยายามเป็นพิเศษในการพิมพ์ตัวอักษรอีกสองสามตัวแล้วเรียกว่า DefaultValue


3
ฉันเห็นด้วย. "ค่าเริ่มต้น" ไม่มีข้อบ่งชี้ว่าค่าคืออะไร พิจารณาเทียบกับenum ErrorHandlingLevel { Default = 0, ... } enum ErrorHandlingLevel { None = 0, ... }ในตัวอย่างที่สองความจริงที่Noneเป็นค่าเริ่มต้นสามารถทราบได้โดยการตั้งค่า enum เป็น 0 โดยใช้ xmldoc หรือในรหัสอย่างชัดเจน คุณจะได้รับประโยชน์เพิ่มของการรู้ว่ามันหมายความว่าเมื่อวัตถุมีของชุดErrorHandlingLevel Noneเปรียบเทียบกับการตรวจสอบวัตถุที่มีการErrorHandlingLevelตั้งค่าเป็นค่าเริ่มต้น
Harrison Paine

9

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

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

ตัวอย่างเช่นสมมติว่าคุณมี enum Modeที่ควรเปิดเผยค่าเริ่มต้นเช่นในกรณีของคุณ การตั้งชื่อdefault_modeอาจไม่ได้ดูดีที่สุดเนื่องจากมีการพูดซ้ำ ๆ แต่ก็หลีกเลี่ยงความคลุมเครือในขณะที่สื่อความหมายที่ต้องการ


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

3

คุณจะต้องใช้คำอื่นหรือแก้ไขที่ชัดเจน
ดังนั้นนี่มักจะหมายถึงอย่างใดอย่างหนึ่ง

  • คำที่แตกต่างอย่างสิ้นเชิง
  • คำนำหน้า
  • คำต่อท้าย

ปัจจัยอีกประการที่ควรพิจารณาคือการเข้าร่วมหลายคำและตัวเลือกต่าง ๆ มักจะเป็นอย่างไร

ข้อเสนอแนะของฉันคือการใช้คำนำหน้าหรือคำต่อท้ายและขีดล่าง / ขีดกลางเช่น

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

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

ตัวอย่างบางส่วนสำหรับวิธี domain_specific ที่ฉันได้เห็นคือ: vehicle_modelแทนที่จะmodelเป็นคำสงวน; room_tableสำหรับตาราง SQL ตามที่tableเป็นคำสงวน

อีกสองตัวเลือกที่ฉันได้เห็นภาษาหรือสคริปต์ใช้คือ:

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

ในฐานะที่เป็นบันทึกย่อด้านที่น่าสนใจ: ฉันเคยเห็นwords_with_underscores-or-dashesชื่อสองชื่อ - snake_caseเมื่อใช้เครื่องหมายขีดเส้นใต้และkebab-caseเมื่อใช้เส้นประ ฉันพบว่าหลังตลก
VLAZ

2

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

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

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

int ccase;  // Name dodges a reserved word

10
ไม่ใช่ downvoter แต่ข้อเสนอแนะ "การเพิ่มตัวอักษรตัวแรกหรือตัวอักษรสุดท้าย" ส่งอาการหนาวสั่นลงมาที่กระดูกสันหลังของฉัน ....
Willem van Rumpt

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

6
ไม่มีการตัดสินที่ตั้งใจเพียง .... หนาวสั่น .... หนาวเย็น ... ;)
Willem van Rumpt

1
การเลื่อนการขีดเส้นใต้จะดีกว่าตัวอักษรตัวสุดท้ายที่เพิ่มเป็นสองเท่า (โหวตใด ๆ สำหรับclasss?)
nigel222

1
แนวทางการเข้ารหัส! นั่นจะเป็นการดีที่ได้! จุดดี.
ป้องกันหนึ่ง

2

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

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

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