เป็นความคิดที่ดีหรือไม่ที่จะใช้ชื่อรูปแบบการออกแบบในคลาสที่นำไปใช้งานจริง? [ปิด]


28

เมื่อเร็ว ๆ นี้ฉันมาข้าม codebase หลามขนาดใหญ่ในระดับปานกลางมีจำนวนมากMyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapterเรียน ฯลฯ

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

นอกจากนี้พวกเขาดูเหมือนจะตกอยู่ในรายชื่อต้องห้ามของคำในการเขียนโปรแกรม: variable, process_available_information, data, amount, compute: ชื่อกว้างเกินไปที่ไม่ได้บอกให้เราทราบอะไรเกี่ยวกับฟังก์ชั่นเมื่อใช้ด้วยตัวเอง

ดังนั้นควรจะมีCommunicationManagerหรือมากกว่าPortListener? หรือบางทีฉันไม่เข้าใจปัญหาเลย ... ?


หากคุณคุ้นเคยกับสิ่งที่รูปแบบทำแล้วชื่อรูปแบบเป็นคำอธิบายที่ดี แต่เพียงชื่อรูปแบบเป็นความคิดที่ไม่ดีควรมี MyClassFactory, FooAdapter เป็นต้น
ratchet freak

แก้ไขคำถามเพื่อระบุว่าคลาสไม่ได้ถูกเรียกว่า "AbstractFactory" เท่านั้น แต่มีคำอธิบายบางคำอยู่ที่นั่นด้วย
Vorac

1
... พวกเขาเรียกมันอย่างจริงจังว่าFctoryแทนที่จะเป็นFactoryหรือนั่นเป็นเพียงการพิมพ์ผิดหรือเปล่า?
Izkata

@ อิซกาตะฮ่า ๆ ฉันไม่ดี อย่างไรก็ตามมีอะแดปเตอร์และอะแดปเตอร์!
Vorac

คำตอบ:


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

  • AnimalAbstractFactoryไม่ใช่ตัวเลือกที่ฉลาดทั้งในภาษาส่วนใหญ่มันจะซ้ำซ้อนกับabstractคำหลักในลายเซ็น

    สิ่งนี้ถูกกล่าวว่ามีเหตุผลที่ดีหลายประการโดยเน้นความคิดเห็นเพื่อรวมAbstractไว้ในชื่อจริง: ไม่เพียง แต่มีหลายบริบทที่คุณไม่มีลายเซ็นเต็ม แต่เพียงชื่อ แต่ยังAnimalFactoryสำหรับอินเตอร์เฟซ อาจเป็นทางเลือกที่ชาญฉลาด (เว้นแต่น่าเสียดายที่การประชุมของภาษา / กรอบงานเป็นการอินเทอร์เฟซคำนำหน้าด้วยI)

  • AnimalCreationUtilityยังจะเป็นทางเลือกที่ดี: ถ้าเป็นโรงงานให้สิ่งที่ง่ายสำหรับคนที่จะอ่านรหัสและเรียกมันว่าเป็นโรงงาน

  • abstract AnimalFactoryก็โอเค มันไม่ได้มีความซ้ำซ้อนและเป็นที่ชัดเจนว่ามันเป็นนามธรรมโรงงานที่ได้รับมอบหมายการสร้างสัตว์ให้กับเด็กของตน

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


2
ทำไมถึงดีกว่าการเขียนความคิดเห็นในสถานที่ที่โดดเด่น "ในโมดูลนี้เราใช้ MVC เหตุผล: ... รุ่น: ... Views: ... ตัวควบคุม: ... แผนที่โครงสร้าง: ... API: .. "
Vorac

37
@Vorac: มีชื่อที่ชัดเจนคือมักจะดีกว่าพึ่งพาความคิดเห็น
Arseni Mourzenko

2
@Vorac ไม่ช้าก็เร็วจะมีคนเพิ่มคลาสใหม่โดยไม่ต้องอัปเดตความคิดเห็นที่เด่นชัด (หรือแม้แต่รู้เกี่ยวกับการมีอยู่ของมัน) ในขณะที่มันยากมากที่จะมองข้ามการตั้งชื่อที่ใช้อย่างสม่ำเสมอในแอพทั้งหมด
Konrad Morawski

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

2
ฉันไม่เห็นด้วยอย่างจริงใจกับประเด็นที่สอง: ฉันคิดว่า AnimalAbstractFactory เป็นทางเลือกที่ดีเพราะถึงแม้ว่ามันจะซ้ำซ้อนในการประกาศในชั้นเรียนมันจะมีประโยชน์มากในการประกาศระดับเด็ก: LionFactory ขยาย AnimalAbstractFactory ซึ่งฉันคิดว่า เป็นข้อมูลที่ดี
Igor

11

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

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


3
ความสอดคล้องเป็นสิ่งสำคัญที่นี่เพราะเมื่อมีเพียงบางโรงงานเท่านั้นที่ถูกเรียก...Factoryมันจะกลายเป็นเรื่องยากที่จะตระหนักว่าชั้นเรียนเป็นโรงงานถ้าการตั้งชื่อแบ่งการประชุมนั้น
Konrad Morawski

10

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


1

ฉันคิดว่ามันสามารถทำงานได้ดีจริงๆ ตัวอย่างเช่น:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
คำถามนี้ถามคำถามนี้อย่างไร ต่อการอ่านของฉัน "ตัวอย่าง" ของคุณแสดงการซ้ำซ้อนของชื่อคลาสและความคิดเห็นโค้ดโดยไม่ได้ผล
gnat

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