การตั้งชื่อคลาส - วิธีหลีกเลี่ยงการเรียกทุกอย่างว่า“ <WhatEver> Manager” ได้อย่างไร [ปิด]


1188

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

ตัวอย่างเช่นหากแอปพลิเคชันของฉัน (เป็นแอปทางธุรกิจทั่วไป) ที่จัดการผู้ใช้ บริษัท และที่อยู่ที่ฉันมีคลาสUsera Companyและa Addressโดเมนและอาจเป็นที่ไหนสักแห่งUserManagera CompanyManagerและa AddressManagerจะปรากฏขึ้นเพื่อจัดการกับสิ่งเหล่านั้น

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

บทความที่ฉันอ่านแนะนำโดยใช้ชื่อเฉพาะมาก ถ้ามันเป็นแอพพลิเคชั่น C ++ และUserManagerงานของมันถูกจัดสรรและปลดปล่อยผู้ใช้จากฮีปมันจะไม่จัดการผู้ใช้ แต่ปกป้องการเกิดและความตาย อืมเราอาจเรียกมันUserShepherdว่า

หรืออาจจะUserManagerเป็นหน้าที่ของการตรวจสอบข้อมูลของวัตถุผู้ใช้แต่ละคนและลงนามในข้อมูลการเข้ารหัส UserRecordsClerkแล้วเราต้องการมี

ตอนนี้ความคิดนี้ติดอยู่กับฉันฉันพยายามที่จะใช้มัน และพบว่าความคิดที่เรียบง่ายนี้ยากอย่างน่าอัศจรรย์

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

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

  • โรงงาน - สร้างวัตถุอื่น ๆ (การตั้งชื่อที่นำมาจากรูปแบบการออกแบบ)
  • Shepherd - คนเลี้ยงแกะจัดการกับอายุของวัตถุการสร้างและการปิด
  • ซิงโครไนซ์ - คัดลอกข้อมูลระหว่างวัตถุสองชิ้นขึ้นไป (หรือลำดับชั้นวัตถุ)
  • Nanny - ช่วยให้วัตถุเข้าถึงสภาวะ "ใช้งานได้" หลังการสร้างตัวอย่างเช่นโดยการเดินสายไปยังวัตถุอื่น

  • ฯลฯ

ดังนั้นคุณจะจัดการกับปัญหานั้นได้อย่างไร คุณมีคำศัพท์ที่ตายตัวคุณสร้างชื่อใหม่ได้ทันทีหรือคุณคิดว่าการตั้งชื่อไม่สำคัญหรือผิด

PS: ฉันสนใจในการเชื่อมโยงไปยังบทความและบล็อกที่พูดถึงปัญหา เป็นการเริ่มต้นที่นี่เป็นบทความต้นฉบับที่ทำให้ฉันนึกถึง: การตั้งชื่อ Java Classes ที่ไม่มี 'Manager'


อัปเดต: สรุปคำตอบ

ต่อไปนี้เป็นบทสรุปเล็กน้อยของสิ่งที่ฉันเรียนรู้จากคำถามนี้ในระหว่างนี้

  • พยายามอย่าสร้างคำอุปมาอุปมัยใหม่ (พี่เลี้ยง)
  • ดูที่กรอบอื่น ๆ ทำ

บทความ / หนังสือเพิ่มเติมในหัวข้อนี้:

และรายการปัจจุบันของคำนำหน้าชื่อ / คำต่อท้ายที่ฉันรวบรวม (ส่วนตัว) จากคำตอบ:

  • ผู้ประสาน
  • ผู้ก่อสร้าง
  • นักเขียน
  • ผู้อ่าน
  • ผู้ดำเนินการ
  • ภาชนะ
  • มาตรการ
  • เป้า
  • แปลง
  • ตัวควบคุม
  • ดู
  • โรงงาน
  • เอกลักษณ์
  • ถัง

และเคล็ดลับที่ดีสำหรับถนน:

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


11
มันเป็นของวิกิชุมชนเพราะไม่มีคำตอบที่ "ดีที่สุด" มันเป็นการสนทนา
DOK

13
นั่นคือเคาน์เตอร์ที่ใช้งานง่าย พวกเขาไม่ควรเรียกมันว่าฟอรัม ฉันคิดว่าวิกิจะใช้เพื่อรวบรวมข้อเท็จจริงไม่ใช่ความคิดเห็น
AaronLS

78
ขอบคุณสำหรับการอัปเดตนี้ - แต่เอ่อคำแนะนำสุดท้ายนั้นเป็นคำแนะนำที่แย่มาก! หากคุณนึกชื่อไม่ได้ภายใน 10 นาทีอาจมีบางอย่างผิดปกติกับคลาสของคุณ (ด้วยคำเตือนมาตรฐาน: 1) สมบูรณ์แบบเป็นศัตรูของดี 2) การจัดส่งสินค้าเป็นคุณลักษณะ - เพียงจำไว้ว่าคุณเป็นหนี้ทางเทคนิคที่เกิดขึ้น)
เจฟฟ์ Sternal

11
หากคุณไม่สามารถคิดชื่อที่ดีภายใน 10 นาทีให้ขอความช่วยเหลือจากเพื่อนร่วมงานของคุณ อย่าเพิ่งยอมแพ้

9
หากคุณไม่สามารถคิดชื่อที่ดีได้ภายใน 10 นาทีลองอธิบายให้เพื่อนร่วมงานฟัง พวกเขาอาจนึกชื่อที่ดี (user338195) แต่การพยายามอธิบายมันอาจช่วยให้คุณค้นพบสิ่งที่ผิดปกติ ( Jeff )
WillC

คำตอบ:


204

ฉันถามคำถามที่คล้ายกันแต่ถ้าเป็นไปได้ฉันพยายามที่จะคัดลอกชื่อที่มีอยู่แล้วใน. NET Framework และฉันมองหาแนวคิดในJavaและAndroid frameworks

ดูเหมือนว่าHelper, ManagerและUtilเป็นคำนามที่หลีกเลี่ยงไม่ได้คุณแนบในการประสานงานการเรียนที่มีรัฐไม่มีและโดยทั่วไปจะมีขั้นตอนและแบบคงที่ Coordinatorทางเลือกคือ

คุณสามารถได้รับ prosey สีม่วงโดยเฉพาะอย่างยิ่งที่มีชื่อและไปสำหรับสิ่งที่ต้องการMinder, Overseer, Supervisor, AdministratorและMasterแต่ที่ผมบอกว่าผมชอบทำให้มันเช่นชื่อกรอบที่คุณใช้ในการ


คำต่อท้ายทั่วไปอื่น ๆ (ถ้านั่นคือคำที่ถูกต้อง) คุณยังพบใน. NET Framework คือ:

  • Builder
  • Writer
  • Reader
  • Handler
  • Container

4
ฉันชอบสิ่งเหล่านี้มาก พวกเขาจะไม่ตกหลุมพรางของคำอุปมาอุปมัยที่ไม่ดีหรือไม่รู้จักเพราะพวกเขาถูกใช้งานโดย. NET Framework อาจเป็นเรื่องที่น่าสนใจที่จะดูไลบรารี่อื่น ๆ (Java) เช่นกันสำหรับการป้อนข้อมูลเพิ่มเติมของสิ่งที่ใช้กันทั่วไป
froh42

ฉันอยากจะแนะนำConductorเช่นเดียวกับตัวนำของวงดุริยางค์ดนตรี แน่นอนว่ามันมีบทบาทสำคัญขึ้นอยู่กับลักษณะของความร่วมมือที่คุณต้อง "ดำเนินการ" (วัตถุอื่น ๆ ที่เป็นนักแสดงที่เชี่ยวชาญมากซึ่งควรตอบสนองต่อคำสั่งจากส่วนกลางและไม่ต้องกังวลเกี่ยวกับผู้ทำงานร่วมกันมากเกินไป)
heltonbiker

1
ฉันไม่เชื่อว่าวิธีแก้ปัญหาของผู้เรียนคือการสร้างชื่อใหม่ อย่างที่ฉันได้อ่านในโพสต์อื่น ๆ แล้วฉันพยายามเรียนรู้คำตอบคือคุณต้องเปลี่ยนสถาปัตยกรรมไม่ใช่แค่ชื่อที่ใช้
Michael Ozeryansky

115

คุณสามารถดูที่source-code-wordle.deฉันได้วิเคราะห์ส่วนต่อท้ายที่ใช้บ่อยที่สุดของชื่อคลาสของ. NET Framework และไลบรารี่อื่น ๆ

20 อันดับแรกคือ:

  • คุณลักษณะ
  • ชนิด
  • ผู้ช่วย
  • ชุด
  • แปลง
  • ผู้ดำเนินการ
  • ข้อมูล
  • ผู้ให้บริการ
  • ข้อยกเว้น
  • บริการ
  • ธาตุ
  • ผู้จัดการ
  • ปม
  • ตัวเลือก
  • โรงงาน
  • บริบท
  • สิ่งของ
  • นักออกแบบ
  • ฐาน
  • บรรณาธิการ

147
ใน บริษัท หนึ่งนานมาแล้วผมรู้ว่าวิศวกรระอากับมากมายเหลือเฟือไร้สาระและการเจริญเติบโตของกฎต่อท้ายทำให้เกิดภัยพิบัติ บริษัท Thingyที่เขาท้าทายสิ้นสุดทุกระดับด้วย

8
รายการของชื่อด้วยตัวเองไม่ได้มีประโยชน์มากหากไม่มีบริบทที่ควรใช้คำต่อท้าย
เฟรด

65

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

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

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


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

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

1
ทางเลือกที่สร้างสรรค์ของคำกริยา + "เอ้อ" มักจะชัดเจนสำหรับชั้นเรียนที่เป็นรูปธรรมมากกว่าการเปรียบเทียบที่มีสีสัน ในทางตรงกันข้าม abstractions ใหม่ - สิ่งที่เป็นแนวคิดใหม่ "ชนิดของสิ่ง" ใหม่มากกว่า "สิ่ง" ใหม่ - มักจะทำงานได้ดีเช่นคำอุปมาอุปมัย ("ถั่ว" ของ Java, "เลนส์" ของ Haskell, GUI "windows" หลายภาษา "" สัญญา ") รหัสฐานส่วนใหญ่จะไม่มีสิ่งประดิษฐ์ของแท้เช่นนั้น
Malnormalulo

51

เราสามารถทำได้โดยไม่ต้องใด ๆxxxFactory, xxxManagerหรือxxxRepositoryการเรียนถ้าเราสร้างแบบจำลองโลกแห่งความจริงอย่างถูกต้อง:

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");

;-)


11
คุณจะไปสู่จักรวาลคู่ขนานและมิติทางเลือกได้อย่างไร
tster

23
ง่ายมาก: Omniverse.Instance ขนาด ["ของเรา"] จักรวาล ["ของเรา"] กาแลคซี่ ... ... โอเคโอเคฉันยอมรับว่าสิ่งนี้จะต้องมีการคอมไพล์ใหม่ ;-)
herzmeister

73
อัปเดต:สิ่งนี้ถูกเพิ่มเข้ามาใน. NET 4.0:; Universe.Instance.ToParallel())
Connell

2
ฝ่าฝืนกฎหมายของ Demeter!
Jonas G. Drange

13
เหล่านี้คือวัตถุและสมาชิกไม่ใช่ชื่อคลาส
Harry Berry

39

ดูเหมือนความลาดชันของสิ่งที่จะถูกโพสต์ใน thedailywtf.com, "ManagerOfPeopleWhoHaveMortgages" เป็นต้น

ฉันคิดว่ามันถูกต้องว่าคลาส monolithic Manager หนึ่งตัวนั้นไม่ดีนัก แต่การใช้ 'Manager' นั้นไม่เลวเลย แทนที่จะเป็น UserManager เราอาจแยกย่อยเป็น UserAccountManager, UserProfileManager, UserSecurityManager เป็นต้น

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


8
แล้ว UserAccounter, UserProfiler และ UserSecurer ล่ะ? หากคุณกำจัดผู้จัดการคุณจะถูกบังคับให้มาพร้อมกับคำจำกัดความเฉพาะซึ่งฉันคิดว่าเป็นสิ่งที่ดี
Didier A.

10
สิ่งที่เกี่ยวกับ UserAccount, UserProfile, UserSecurity oO?
clime

3
ฉันจะตั้งชื่อมันว่า "MortageOwnersManager"
volter9

บางครั้งโดเมนมีชื่อเฉพาะ เช่น "MortageHolder" ที่อาจจะดีกว่าที่ "MortageOwner"
borjab


24

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

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

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

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


1
ฉันชอบแนวคิดของการใช้Policyคำต่อท้ายสำหรับคลาสที่มีตรรกะทางธุรกิจ
jtate

+1 สำหรับการกล่าวถึงกลิ่นรหัสที่เกี่ยวข้องกับชื่อเช่น "ผู้จัดการ" และ "ผู้ช่วย" ฉันพบว่าถ้าฉันไม่มีชื่อที่ชัดเจนสำหรับสิ่งต่าง ๆ มันมักจะเกิดจากความคลุมเครือบางอย่างในความเข้าใจในโดเมนของฉันไม่ว่าจะเป็นธุรกิจหรือทางเทคนิค เกือบเท่ากันมันอาจหมายถึงว่าฉันเพิ่งเลิกเรียนเพราะพวกเขา "ใหญ่เกินไป" - ซึ่งสำหรับฉันก็เป็นสัญญาณของการสร้างแบบจำลองที่ไม่เพียงพอ นี่ควรเป็นคำตอบที่ได้รับการโหวตสูงสุด
nclark

10

au fait ที่มีรูปแบบตามที่กำหนดโดย (พูด) หนังสือ GOFและการตั้งชื่อวัตถุหลังจากสิ่งเหล่านี้ทำให้ฉันอยู่ในชั้นเรียนการตั้งชื่อจัดระเบียบพวกเขาและสื่อสารเจตนา คนส่วนใหญ่จะเข้าใจคำศัพท์นี้ (หรืออย่างน้อยก็เป็นส่วนสำคัญของมัน)


ฟาวเลอร์เป็นข้อมูลอ้างอิงที่ดีสำหรับฉัน แต่ GOF เป็นคำแนะนำที่ดี
Lazarus

ยกโทษให้ความไม่รู้ของฉัน คุณหมายถึงหนังสือใดที่ฟาวเลอร์อ้างถึง
Brian Agnew


19
อืมบางครั้งมันก็ใช้งานได้ (ตัวอย่างเช่น Factory หรือ Strategy) แต่ในบางครั้งฉันรู้สึกว่านี่เป็นการสื่อสารถึงวิธีการนำไปใช้ (ฉันใช้รูปแบบ!) มากกว่าความตั้งใจและหน้าที่ของชั้นเรียน ตัวอย่างเช่นสิ่งที่สำคัญที่สุดของซิงเกิลมันคือสิ่งที่มันหมายถึง - และไม่ใช่ว่ามันเป็นซิงเกิล การตั้งชื่ออย่างเข้มงวดหลังจากรูปแบบที่ใช้ให้ความรู้สึกเหมือนกับการตั้งชื่ออย่างเข้มงวดหลังจากประเภทที่ใช้ เช่นสัญกรณ์ฮังการีเป็นใช้ผิดโดยกลุ่ม Windows Systems (อธิบายประเภทข้อมูล C แทน "เจตนาพิมพ์")
4324 Froh42

1
สำหรับคลาสโครงสร้างพื้นฐานทางเทคนิคมักเป็นที่ต้องการเพื่อให้เกิดความโปร่งใสในการใช้งานและชื่อรูปแบบการออกแบบที่เป็นที่ยอมรับส่วนใหญ่สื่อสารทั้งการติดตั้งและเจตนา แม้ว่าคลาสโมเดลโดเมนนั้นเป็นอีกเรื่องหนึ่ง
Jeff Sternal

10

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


8

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

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


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

ปัญหาของวิธีนี้คือยากที่จะค้นหารหัสของคุณUsersโดยเฉพาะถ้าคุณผ่านวัตถุผู้จัดการ this.users = new Users()แต่แล้วคงเส้นคงวาที่อื่นในรหัสของคุณusersจะอ้างถึงอาร์เรย์ของUsers
มนุษย์หิมะ

อย่างที่คุณพูดผู้ใช้หมายถึง "การรวบรวมผู้ใช้" - ชุดของเอนทิตีที่เป็นของรัฐ แต่ SRP จะหมายความว่าคุณไม่ต้องการรวมกลุ่มการจัดการผู้ใช้ (ฟังก์ชันการทำงานและตรรกะทางธุรกิจ) เข้ากับข้อมูลผู้ใช้ (สถานะ) ไม่ได้บอกว่าคุณทำผิด UserManager นั้นเหมาะสมถ้าชั้นมีหน้าที่จัดการผู้ใช้และไม่เพียงแค่เก็บสถานะและ CRUD พื้นฐานของพวกเขา
Richard Moore

5

เฉพาะ C # ฉันพบ"แนวทางการออกแบบกรอบ: อนุสัญญาสำนวนและรูปแบบสำหรับ. NET Library ที่นำกลับมาใช้ใหม่"เพื่อให้ได้ข้อมูลที่ดีเกี่ยวกับตรรกะของการตั้งชื่อ

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


3

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

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


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

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

2

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

ตัวอย่างเช่น UserRecordsClerk อาจอธิบายได้ดีกว่าเช่นการขยายอินเตอร์เฟสทั่วไปของ RecordsClerk ซึ่งทั้ง UserRecordsClerk และ CompanyRecordsClerk นำไปใช้แล้วชำนาญในความหมายหนึ่งสามารถดูวิธีการในอินเทอร์เฟซเพื่อดูว่า subclasses ทำอะไร / โดยทั่วไปสำหรับ

ดูหนังสือเช่นรูปแบบการออกแบบเพื่อดูข้อมูลมันเป็นหนังสือที่ยอดเยี่ยมและอาจช่วยให้คุณเข้าใจได้ว่าคุณต้องการให้โค้ดของคุณอยู่ตรงไหน - ถ้าคุณยังไม่ได้ใช้มัน! ; o)

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


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