เคล็ดลับ / คำแนะนำเกี่ยวกับวิธีการลดการใช้คลาส "ผู้จัดการ"?


14

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

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


3
คำตอบของprogrammers.stackexchange.com/questions/59866//อาจเป็นประโยชน์กับคุณ
Tesserex

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

คำตอบ:


13

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

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


4

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

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


3

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

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

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