หลักการตั้งชื่อคลาส C #: เป็น BaseClass หรือ ClassBase หรือ AbstractClass


117

แนวทางที่แนะนำในการตั้งชื่อคลาสพื้นฐานคืออะไร? มันนำหน้าชื่อประเภทด้วย " Base " หรือ " Abstract " หรือเราจะต่อท้ายด้วย "Base"?

พิจารณาสิ่งต่อไปนี้:

ชนิด: ViewModelเช่นMainViewModel , ReportViewModel

คลาสฐาน: BaseViewModelหรือViewModelBaseหรือAbstractViewModel

พิจารณา:

ชนิด: Productเช่นVirtualProduct , ExpiringProduct

คลาสฐาน: BaseProductหรือProductBaseหรือAbstractProduct

คุณคิดว่ามาตรฐานไหนมากกว่ากัน?

class Entity : EntityBase
{
}

หรือ

class Entity : BaseEntity
{
}


คำตอบ:


90

มีตัวอย่างในกรอบอยู่กับปัจจัยฐานเช่น,System.Configuration.Provider.ProviderBaseSystem.Web.SessionState.SessionStateStoreProviderBase

แต่ไม่ได้หมายความว่าทุกชั้นเรียนฐานนามธรรมในกรอบปฏิบัติตามอนุสัญญานี้ (เช่นSystem.Data.Common.DbParameter, System.Data.Common.DbCommand)

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


" Avoidการตั้งชื่อคลาสพื้นฐานด้วยBaseคำต่อท้ายหากคลาสนั้นมีไว้สำหรับใช้ใน API สาธารณะ" แนวทางการออกแบบกรอบหน้า 174
Yousha Aleayoub

47

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

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


15
นั่นไม่ใช่กรณีเสมอไปและคุณจะพบคลาส Base * มากมายในเฟรมเวิร์ก CollectionBase, DictionaryBase .... etc
Chad Grant

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

45
เป็นที่น่าสังเกตว่าบางคลาสใน. NET Framework ที่มีคำต่อท้าย "Base" ถูกตั้งชื่อก่อนเวอร์ชัน 1.0 และ Microsoft ไม่ได้ปฏิบัติตามอนุสัญญาเหล่านั้นอีกต่อไป .... แต่ไม่สามารถเปลี่ยนชื่อได้ในตอนนี้ หนังสือแนวทางการออกแบบกรอบของ Microsoft ส่วน 6.2 (ซึ่งครอบคลุมคลาสพื้นฐาน) แนะนำให้ใช้คำต่อท้าย "ฐาน" โดยเฉพาะ
Warren Rumak

5
แนวปฏิบัติที่ฉันเห็นใช้บ่อยที่สุดในภาษา OO หลาย ๆ บริษัท ในหลาย ๆ บริษัท คือ“ Base” กำหนดคลาสพื้นฐานที่มีไว้เพื่อสืบทอดมาเท่านั้นไม่ใช่ใช้โดยตรง จากตัวอย่างของคุณคลาสที่ชื่อว่า "ยานพาหนะ" ดูเหมือนเป็นสิ่งที่ใช้งานได้และ "ขับเคลื่อน" - โดยอ้างว่าตัวเองเป็นยานพาหนะ อย่างไรก็ตามหากคลาสพื้นฐานถูกตั้งชื่อว่า“ ชิ้นส่วนยานพาหนะ” หรือ“ สิ่งจำเป็นสำหรับยานพาหนะ” หรือ“ ชุดอุปกรณ์ยานพาหนะ” เรารู้ว่ามันไม่ใช่สิ่งที่ใช้งานได้โดยตรง แต่เป็นฐานสำหรับยานพาหนะหลากหลายประเภท
Slipp D.Thompson

4
ตามที่วอร์เรนกล่าวถึงหนังสือแนวทางการออกแบบกรอบงานของ Microsoft ส่วน 6.2 บนคลาสพื้นฐาน: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx พวกเขากล่าวว่าให้หลีกเลี่ยงคำต่อท้ายฐาน: "หลีกเลี่ยงการตั้งชื่อ คลาสพื้นฐานที่มีคำต่อท้าย "ฐาน" หากคลาสมีไว้สำหรับใช้ใน API สาธารณะ "
cwills


3

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

เช่นเดียวกันกับการตัดสินใจระหว่าง GetItems และ ItemsGet function ฉันจะบอกว่าเพื่อประโยชน์อย่างน้อยที่สุดในการอ่าน - ไปที่ GetItems ปฏิบัติตามอนุสัญญา :)


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

1
@ Abhishek: การเปรียบเทียบกับใช้GetItemsไม่ได้ -“ Get” เป็นเพียงคำกริยาและทำให้ความหมายทางไวยากรณ์ภาษาอังกฤษเป็นคำนำหน้าเท่านั้นในขณะที่“ Base” ทำงานเป็นทั้งคำคุณศัพท์ (คำนำหน้า) หรือคำนาม (คำต่อท้าย)
Slipp D.Thompson

1
@Iain: เหตุผลที่ผู้คนใช้“ ฐาน” ในชื่อคลาสไม่สามารถค้นหาคลาสพื้นฐานได้ทั้งหมด - เหตุผลนั้นใกล้เคียงกับสิ่งที่ตรงกันข้ามมากกว่า เพื่อให้คลาสพื้นฐานของคลาสที่เกี่ยวข้องจำนวนหนึ่งโดดเด่นจากคลาสเหล่านี้โดยมากในวิธีที่คำนำหน้า“ I” มีไว้เพื่อแยกความแตกต่างของอินเทอร์เฟซจากคลาสที่นำมาใช้ ผมเคยเห็น“ฐาน” คำนำหน้า / abstractต่อท้ายที่ใช้บ่อยที่สุดเมื่อชั้นฐานไม่สามารถทำงานบนแบนด์ของตนเองที่เป็นนามธรรมของตนโดยวัตถุประสงค์การใช้งานโดยไม่คำนึงถึงการบังคับใช้
Slipp D.Thompson

@ SlippD ธ อมป์สันใช่ 'ค้นหาทุกชั้น' เป็นการตอบสนองต่อ Abhishek ฉันตอบกลับคำตอบของพอล
Iain

2

เราใช้ BaseEntity แต่ฉันคิดว่ามันเป็นความชอบของคุณเอง ฉันมักจะเห็นอื่น ๆ

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


2

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


-1

BaseEntity ดูเหมือนกรณีอูฐมาก - strName, bseEntity ฉันจะใช้ EntityBase เพราะมันกำหนดหัวเรื่องก่อนซึ่งจะช่วยให้คุณระบุว่ามันทำงานได้เร็วขึ้น


10
คุณกำลังพูดถึงสัญกรณ์ฮังการีไม่ใช่ปลอกอูฐ สัญกรณ์ภาษาฮังกาเรียนเพิ่งเกิดขึ้นกับอูฐ แต่เป็นสิ่งที่แตกต่างอย่างสิ้นเชิง
sliderhouserules

-5

คิดถึงการเรียงตัวอักษรเสมอเมื่อคุณตั้งชื่อสิ่งต่างๆ ฉันไม่ชอบดูเซิร์ฟเวอร์ SQL และทุกโพรซีเดอร์ที่จัดเก็บมีชื่อว่า usp [บางอย่าง] ตามบรรทัดเดียวกันอย่าใช้ Get and Set เป็นชื่อนำหน้าสำหรับฟังก์ชันมากเกินไป แทนที่จะใช้ GetItems หรือ PlaceOrder ให้ลองตั้งชื่อเป็น ItemsGet หรือ OrderPlace แทน

ดังนั้นโดยทั่วไป ClassnameBase / EntityBase จะเป็นทางเลือกที่ดีกว่า


9
ไม่เห็นด้วย; การอ่าน GetItems มีความหมายมากกว่า ItemsGet
Nathan Ridley

2
ไม่เห็นด้วย ... เหตุผลเดียวกับข้างบน.. แต่ไม่สามารถลงคะแนนได้ ... :(
Mugunth

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