ชั้นกาวหรือการจัดการทำอะไรมากเกินไปเมื่อไหร่?


10

ฉันมีแนวโน้มที่จะสร้างชั้นเรียนแบบรวมศูนย์ที่จัดการชั้นเรียนอื่น ๆ ในการออกแบบของฉัน มันไม่ได้เก็บข้อมูลทุกอย่าง แต่คำขอข้อมูลส่วนใหญ่จะไปที่ "ผู้จัดการ" ก่อน ในขณะที่ดูคำตอบสำหรับคำถามนี้ฉันสังเกตเห็นคำว่า "God Object" Wikipedia ระบุว่าเป็น antipattern เข้าใจได้

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

คำตอบ:


15

ผู้คนมากมายพูดว่า "ชั้นเรียนไม่ควรใหญ่กว่าหัวของคุณ"

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

แต่โดยปกติคลาสหนึ่งที่เกิดขึ้นนี้เป็นวัตถุโดเมนซึ่งแสดงถึงองค์ประกอบพื้นฐานของโดเมนของคุณ - บัญชีสำหรับธนาคาร, การขายเพื่อการค้าปลีก ฯลฯ หากคุณพบว่ามันเกิดขึ้นกับคลาสอื่นด้วยเช่นกัน ต้องการพิจารณาความรับผิดชอบของชั้นเรียนนั้น นี่คือเคล็ดลับของฉัน:

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

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


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