วิธีตั้งชื่อตัวแปรเมื่อคำนั้นเป็นทั้งคำนามและคำกริยา


48

ฉันพบปัญหากรณีมุมด้วยคำแนะนำทั่วไปของ:

  • คำนามสำหรับตัวแปร
  • คำกริยาสำหรับฟังก์ชั่น

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

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

batteryหนึ่งในตัวอย่างที่เป็นด้วย A batteryมีchargeและคุณยังสามารถcharge()ใช้แบตเตอรี่ได้อีกด้วย

ฉันคิดว่าการมีทั้งคู่Battery.ChargeและBattery.Charge(value)จะสับสนกับนักพัฒนาในอนาคต

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

คำถามของฉันคือถ้ามีอีกวิธีที่ดีกว่า / จัดการความขัดแย้งนี้ในการตั้งชื่อแบบแผนการ?


อ่านเพิ่มเติมบางเรื่อง ไม่มีใครตอบคำถามของฉันโดยเฉพาะ


3
ทำให้ฟังก์ชั่นการชาร์จเพิ่มค่าใช้จ่ายง่ายและชัดเจนเพียงพอ
เฟืองวงล้อประหลาด

2
คุณสามารถเติมคำนามในคำนำหน้าด้วย "Current-" ได้หรือไม่? ดังนั้น "CurrentCharge" กับ "Charge ()"?
Brian Snow

6
หรือเพียงแค่ ChargeLevel เพื่อรับค่าปัจจุบัน
วงล้อประหลาด

5
ประกอบคำ WordNet ไม่คิดว่าenqueueเป็นคำ แต่เป็นคำกริยาใน Java แล้วไงdoChargeล่ะ มันจะยังคงล้มเหลวในการทดสอบสมมาตรเนื่องจากวิธีการอื่นของคุณจะไม่มีคำนำหน้านี้
Miserable Variable

5
"Current" = ตอนนี้หรือ "current" = การไหลของประจุ ทางออกที่แท้จริงเพียงอย่างเดียวคือการแทนที่ภาษาอังกฤษด้วยภาษาที่มีเหตุผลมากขึ้น!
DarenW

คำตอบ:


38

ในสถานการณ์ที่คล้ายกันฉันพยายามค้นหาคำพ้องความหมาย ในกรณีนี้ฉันจะใช้ "เติม" สำหรับคำกริยา "re-" ซ้ำซ้อนเล็กน้อย แต่ความหมายชัดเจน การใช้ "การชาร์จ" แบบง่ายสำหรับการชาร์จที่เหลืออยู่ในแบตเตอรี่นั้นไม่ชัดเจนเนื่องจากไม่ได้ระบุหน่วยทางกายภาพใด ๆ ฉันต้องการ "availableAmpHours", "hoursUntilRecharge" หรือบางอย่างที่คล้ายกัน หน่วยจะขึ้นอยู่กับสิ่งที่สะดวกสำหรับการใช้งาน

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


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

1
ฉันชอบคำกริยาสำหรับฟังก์ชั่นราคาแพงและไม่กลายพันธุ์ เช่นฟังก์ชันที่เรียกใช้แบบสอบถามในฐานข้อมูล
Brian

20

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

battery.Charge(50) VS batteryCharger.Charge(battery, 50)

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


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

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

คุณอาจเป็นโปรแกรมเมอร์ Java หรือไม่? ชัดเจนว่าเป็นการละเมิดอย่าทำซ้ำตัวเอง ในความเป็นจริงคุณกำลังทำซ้ำทุกอย่างยกเว้นพารามิเตอร์ "50" ฉันไม่สามารถยกตัวอย่างการละเมิด DRY ที่แย่ลงได้ถ้าฉันลอง
วางจำหน่าย

@boxed คุณกำลังยกตัวอย่างของฉันหรือไม่ เนื่องจากฉันไม่แน่ใจว่าคุณจะอ้างสิทธิ์ได้อย่างไรว่าฉันละเมิด DRY เมื่อฉันไม่ได้ลงมือปฏิบัติ ฉันเป็นผู้สนับสนุนหลักของ SOLID และฉันไม่เห็นว่าคุณได้ข้อสรุปอย่างไร
mortalapeman

คุณกำลังละเมิด DRY โดยการสร้างคลาส BatteryCharger ที่ไม่จำเป็นซึ่งจะทำให้เกิดการเปลี่ยนแปลงสถานะในแบตเตอรี่ ดังนั้น BatteryCharger จะยอมรับอินพุตที่จะส่งผ่านไปยัง Battery ทันที
kevin cline

9

หลีกเลี่ยงความหมายสองเท่า

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

ใช้ Getters และ Setters

การตั้งชื่อมาตรฐานสำหรับวัตถุส่วนใหญ่เป็นวิธีการ getters / การตั้งค่าสำหรับคุณสมบัติ

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

คุณสมบัติคือสถานะไม่ใช่คำนาม

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

คุณสามารถอธิบายค่าที่พวกเขาถือเป็นคำนาม แต่ฉันไม่แน่ใจว่าเป็นจริงในทุกกรณี

ในคุณสมบัติวัตถุคำศัพท์ OOP อธิบายถึงสถานะของวัตถุนั้น ในกรณีของคุณBatteryคือวัตถุและChargeเป็นสถานะ นั่นจะเป็นคุณสมบัติของวัตถุ แต่ขึ้นอยู่กับบริบทของการใช้งาน

หากคุณต้องการChargeแบตเตอรี่และรู้ว่าปัจจุบันChargeมีอะไรแสดงว่าคุณมีปัญหา

ใช้ขอบเขตเพื่อบังคับใช้บริบท

บริบทคือสิ่งที่จะอธิบายความหมายของคำที่คุณต้องการใช้วิธีหรือคุณสมบัติในการถ่ายทอด ขอบเขตคือการตั้งค่าการเข้าถึงของคุณสมบัติ / วิธีการจากนอกวัตถุ

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

วิธีการมีคำกริยา

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

คำChargeนี้เป็นคำกริยา แต่ก็เป็นคำนามด้วย Battery.Charge(....)เมื่อใช้ในการเรียกวิธีการของการกระทำที่มันจะกลายเป็นที่ชัดเจนว่าคำกริยาจะถูกใช้

แต่บริบทมีความสำคัญมาก ขณะที่คำว่าเป็นคำกริยาก็ไม่เป็นความหมายเป็นCharge()startCharging()

วิธีการที่ถูกต้องสำหรับBatteryอาจรวมถึงCharging, Discharging, setCharge, getCharge, hasCharge, และDischargeCharged

วิธีการหนึ่งคำที่เรียบง่ายมักจะไม่ได้ระบุการกระทำของพวกเขาไว้อย่างชัดเจน แต่มีบางกรณีที่ชอบopenและต้องการการcloseอธิบายเล็กน้อย

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


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

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


4

สำหรับกรณีคำกริยาฉันคิดว่าChargeตกลง สำหรับคำนามจะgetCurrentChargeLevelเหมาะกับคุณไหม


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

คิดค่าแรงดันไฟฟ้าหรือเปอร์เซ็นต์
mhoran_psprep

1
@ GlenH7: อ่าฉันเข้าใจแล้ว คุณไม่ได้ระบุ C # และสมองของฉันอยู่ในโหมด Java ดีทางใดทางหนึ่งผมคิดว่าสำหรับคำนามที่เป็นตัวแทนของจำนวนเงินค่าใช้จ่ายในปัจจุบันแบตเตอรี่สิ่งที่ตามเส้นของBattery.currentChargeLevelการทำงานอาจ คุณสามารถลองใช้Battery.coloumbsหรือBattery.ampereHoursแต่อาจไม่ชัดเจน ...
FrustratedWithFormsDesigner

1
@mhoran_psprep - ไม่ ;-) Chargeเป็นEnergyซึ่งเป็นPower(โวลต์แอมป์ * == วัตต์) คูณด้วยเวลา ดังนั้นในกรณีนี้การเรียกเก็บเงินจึงเป็นตัวเลข นอกจากนี้ยังมีสถานะของค่าใช้จ่ายที่เกิดขึ้นเป็นร้อยละ

@FrustratedWithFormsDesigner - ใช่ฉันออก C # ออกเพราะฉันคิดว่ากรณีมุมที่กว้างขึ้นมีผลบังคับใช้โดยไม่คำนึงถึงภาษา Watt*timeแน่นอนจะไม่สอดคล้องกับการสนทนาการออกแบบ แต่ChargeLevelจะ

0

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

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


0

สัญลักษณ์ฮังการีเพื่อช่วยชีวิต คุณสามารถมีintChargeและfcnCharge(value)ดังนั้นหลีกเลี่ยงความสับสนและไม่เพิ่มชื่อยาวบ้าเมื่อตัวอักษรสามตัวจะทำงานได้ดี

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


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