ฉันเป็นนักปฏิบัตินิยม แต่ความกังวลหลักของฉันที่นี่คือคุณอาจยอมให้สิ่งนี้ConfigBlock
ครอบงำการออกแบบส่วนต่อประสานของคุณในทางที่ไม่ดี เมื่อคุณมีสิ่งนี้:
explicit MyGreatClass(const ConfigBlock& config);
... อินเทอร์เฟซที่เหมาะสมกว่าอาจเป็นดังนี้:
MyGreatClass(int foo, float bar, const string& baz);
... ตรงข้ามกับการหยิบเชอร์รี่เหล่านี้ foo/bar/baz
ConfigBlock
เขตข้อมูลจากขนาดใหญ่
การออกแบบส่วนต่อประสานที่ขี้เกียจ
ในด้านบวกการออกแบบชนิดนี้ทำให้ง่ายต่อการออกแบบส่วนต่อประสานที่มีความเสถียรสำหรับตัวสร้างของคุณเช่นถ้าคุณต้องการสิ่งใหม่คุณสามารถโหลดมันลงใน ConfigBlock
(อาจไม่มีการเปลี่ยนแปลงรหัส) เลือกสิ่งใดใหม่ที่คุณต้องการโดยไม่ต้องชนิดของการเปลี่ยนแปลงอินเตอร์เฟซใด ๆ MyGreatClass
เพียงการเปลี่ยนแปลงการดำเนินการตามที่
ดังนั้นทั้งมืออาชีพและมืออาชีพที่ทำให้คุณมีอิสระในการออกแบบอินเทอร์เฟซที่คำนึงถึงอย่างรอบคอบมากขึ้นซึ่งยอมรับเฉพาะอินพุตที่ต้องการจริงๆเท่านั้น มันใช้ความคิดของ"เพียงแค่ให้ฉันหยดของข้อมูลขนาดใหญ่นี้ฉันจะเลือกสิ่งที่ฉันต้องการจากมัน"เมื่อเทียบกับสิ่งที่ชอบ "พารามิเตอร์ที่แม่นยำเหล่านี้คือสิ่งที่ส่วนต่อประสานนี้ต้องใช้งาน"
ดังนั้นจึงมีข้อดีบางอย่างที่นี่ แต่พวกเขาอาจจะมีน้ำหนักเกินกว่าข้อเสีย
การมีเพศสัมพันธ์
ในสถานการณ์นี้คลาสดังกล่าวทั้งหมดจะถูกสร้างขึ้นจากConfigBlock
อินสแตนซ์ท้ายมีการอ้างอิงของพวกเขามีลักษณะเช่นนี้:
สิ่งนี้สามารถกลายเป็น PITA ตัวอย่างเช่นถ้าคุณต้องการทดสอบหน่วยClass2
ในแผนภาพนี้โดยแยก คุณอาจจะต้องจำลองแบบต่าง ๆ อย่างพิถีพิถันConfigBlock
อินพุตที่มีเขตข้อมูลที่เกี่ยวข้องClass2
สนใจอย่างพิถีพิถันเพื่อให้สามารถทดสอบได้ภายใต้เงื่อนไขที่หลากหลาย
ในบริบทใหม่ประเภทใด ๆ (ไม่ว่าจะเป็นการทดสอบหน่วยหรือโครงการใหม่ทั้งหมด) คลาสใด ๆ ดังกล่าวสามารถกลายเป็นภาระในการใช้งานได้มากขึ้นในขณะที่เราท้ายที่สุดต้องนำมาด้วยเสมอConfigBlock
สำหรับการขี่และตั้งค่า ตาม
สามารถนำมาใช้ / deployability / การตรวจสอบได้
แต่ถ้าคุณออกแบบอินเทอร์เฟซเหล่านี้อย่างเหมาะสมเราสามารถแยกออกจากConfigBlock
และจบลงด้วยสิ่งนี้:
หากคุณสังเกตเห็นในแผนภาพข้างต้นคลาสทั้งหมดจะแยกจากกัน (ข้อต่อส่วนต่อ / ขาออกลดลง 1)
สิ่งนี้นำไปสู่คลาสที่เป็นอิสระมากขึ้น (อย่างน้อยก็เป็นอิสระจาก ConfigBlock
) ซึ่งสามารถใช้ / ทดสอบได้ง่ายขึ้นในสถานการณ์ / โครงการใหม่
ตอนนี้Client
รหัสนี้กลายเป็นสิ่งที่ต้องพึ่งพาทุกสิ่งและรวมเข้าด้วยกัน ภาระจะถูกโอนไปยังรหัสลูกค้านี้เพื่ออ่านฟิลด์ที่เหมาะสมจากConfigBlock
และส่งไปยังคลาสที่เหมาะสมเป็นพารามิเตอร์ แต่โดยทั่วไปแล้วรหัสลูกค้านั้นได้รับการออกแบบมาอย่างแคบสำหรับบริบทที่เฉพาะเจาะจงและศักยภาพในการใช้ซ้ำนั้นโดยทั่วไปจะเป็น zilch หรือปิดต่อไป (อาจเป็นแอปพลิเคชันของคุณmain
ฟังก์ชันจุดเข้าคุณ
ดังนั้นจากความสามารถในการนำกลับมาใช้ใหม่และการทดสอบจุดยืนมันสามารถช่วยให้ชั้นเรียนเหล่านี้เป็นอิสระมากขึ้น จากมุมมองของอินเทอร์เฟซสำหรับผู้ที่ใช้คลาสของคุณมันยังสามารถช่วยระบุพารามิเตอร์ที่พวกเขาต้องการได้อย่างชัดเจนแทนที่จะมีขนาดใหญ่เพียงอันเดียวConfigBlock
ซึ่งจำลองจักรวาลทั้งหมดของเขตข้อมูลที่จำเป็นสำหรับทุกสิ่ง
ข้อสรุป
โดยทั่วไปแล้วการออกแบบในระดับนี้จะขึ้นอยู่กับหินใหญ่ก้อนเดียวซึ่งมีทุกสิ่งที่จำเป็นต้องมีลักษณะเหล่านี้ การบังคับใช้การปรับใช้การใช้ซ้ำได้การทดสอบ ฯลฯ สามารถลดลงอย่างมีนัยสำคัญ แต่พวกเขาสามารถทำให้การออกแบบส่วนต่อประสานง่ายขึ้นหากเราพยายามหมุนเป็นบวก มันขึ้นอยู่กับคุณที่จะวัดข้อดีและข้อเสียเหล่านั้นและตัดสินใจว่าการแลกเปลี่ยนนั้นคุ้มค่าหรือไม่ โดยทั่วไปแล้วจะปลอดภัยกว่าที่จะผิดกับการออกแบบประเภทนี้ที่คุณหยิบเชอร์รี่จากหินใหญ่ก้อนเดียวในชั้นเรียนที่มีจุดประสงค์เพื่อสร้างแบบจำลองทั่วไปที่กว้างกว่า
สุดท้าย แต่ไม่ท้ายสุด:
extern CodingBlock MyCodingBlock;
... นี่อาจเป็นยิ่งแย่ลง (เบ้มากขึ้น?) ในแง่ของลักษณะที่อธิบายข้างต้นกว่าวิธีการฉีดพึ่งพาในขณะที่มันจบลงด้วยการมีเพศสัมพันธ์ชั้นเรียนของคุณไม่เพียง แต่จะConfigBlocks
แต่โดยตรงกับกรณีเฉพาะของมัน นั่นจะทำให้ความสามารถในการปรับใช้
คำแนะนำทั่วไปของฉันจะทำผิดพลาดในด้านของการออกแบบอินเตอร์เฟสซึ่งไม่ขึ้นอยู่กับ monoliths ประเภทนี้เพื่อให้พารามิเตอร์ของพวกเขาอย่างน้อยที่สุดสำหรับคลาสที่ใช้งานได้โดยทั่วไปที่คุณออกแบบ และหลีกเลี่ยงวิธีการทั่วโลกโดยไม่ต้องพึ่งพาการฉีดถ้าคุณทำได้เว้นแต่คุณจะมีเหตุผลที่แข็งแกร่งและมั่นใจมากที่จะไม่หลีกเลี่ยง