การตั้งชื่อคลาส: เอกพจน์หรือพหูพจน์ [ปิด]


58

เป็นเรื่องยากสำหรับฉันที่จะเลือกรูปแบบเอกพจน์และพหูพจน์สำหรับชื่อคลาส:

CustomerRepository vs. CustomersRepository
CustomerService vs. CustomersService
CustomerController vs. CustomersController

และสำหรับชื่อคอมโพสิตมันก็ยิ่งยากขึ้น:

OrderCustomerRepository กับ OrderCustomersRepository เทียบกับ OrdersCustomersRepository

คุณชอบแนวทางใดและทำไม


ชั้นจะมีพื้นที่เก็บข้อมูลสำหรับลูกค้าหลายคน? ถ้ามันเป็นหนึ่งในพื้นที่เก็บข้อมูลสำหรับลูกค้ารายหนึ่ง ...
JeffO

2
@Jeff O พื้นที่เก็บข้อมูลสามารถมีวิธี GetCustomerById และ GetCustomers ในเวลาเดียวกัน
SiberianGuy

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

คำตอบ:


73

สิ่งเดียวที่ฉันทำให้เป็นพหูพจน์คือคอลเลกชัน

foreach (var customer in customers)
{
    // do something with customer
}

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

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


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

12
ฉันไม่ชอบคำเช่น "Collection" ที่นี่ ภาษาอังกฤษมีวิธีที่ดีในการอ้างถึงสิ่งต่าง ๆ โดยใช้คำพหูพจน์
Gort the Robot

แทนCollectionวิธีการเกี่ยวกับIterator?
Julian

@Julian An Iteratorจะเป็นประเภท co-กิจวัตรมากกว่าโครงสร้างข้อมูลสำหรับเก็บวัตถุหลาย ๆ อัน
วิลสัน

64

ใช้เอกพจน์ เครื่องมือในการหมุนสกรูที่เรียกว่า "ไขควงสกรู" ไม่ใช่ "ไขควงสกรู"

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


7

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


1
และคิดตลอดเวลาที่ฉันใช้คอลเลกชัน Peoples!
จอร์แดน

2
รายการ <คน> คน ... ดูเหมือนจะโอเคกับฉัน @Jordan
StevenV

1

จำไว้ว่าคลาสเป็นเทมเพลตสำหรับวัตถุ ดังนั้นคิดเกี่ยวกับวัตถุที่คุณอ้างถึง

บ่อยครั้งที่มันเป็นเอนทิตี้เอกพจน์โดยเฉพาะอย่างยิ่งเมื่อมันเป็นนิติบุคคล ORM บางครั้งมันอาจเป็นคอลเลกชัน

ฉันเชื่อว่าคำตอบนั้นเฉพาะเจาะจงกับบริบท

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