ให้ดูที่นี้จริง
Obj 3
ตอนนี้รู้ว่าObj 4
มีอยู่ แล้วอะไรล่ะ ทำไมเราถึงสนใจ
กรมทรัพย์สินทางปัญญากล่าวว่า
"โมดูลระดับสูงไม่ควรขึ้นอยู่กับโมดูลระดับต่ำทั้งสองควรขึ้นอยู่กับนามธรรม"
ตกลง แต่ไม่ใช่วัตถุทั้งหมดที่เป็นนามธรรม?
กรมฯ ยังกล่าวอีกว่า
"Abstractions ไม่ควรขึ้นอยู่กับรายละเอียดรายละเอียดควรขึ้นอยู่กับ abstractions"
ตกลง แต่ถ้าวัตถุของฉันถูกห่อหุ้มอย่างถูกต้องไม่ได้ซ่อนรายละเอียดใด ๆ
บางคนชอบที่จะยืนยันว่าวัตถุทุกอย่างต้องการอินเทอร์เฟซคำหลัก ฉันไม่ได้เป็นหนึ่งในนั้น ฉันชอบที่จะยืนยันว่าหากคุณไม่ได้ใช้พวกเขาในตอนนี้คุณต้องวางแผนที่จะจัดการกับสิ่งที่ต้องการในภายหลัง
หากรหัสของคุณสามารถ refactor ได้อย่างสมบูรณ์ในทุกรุ่นคุณสามารถแยกอินเทอร์เฟซได้ในภายหลังหากคุณต้องการ หากคุณมีรหัสเผยแพร่ที่คุณไม่ต้องการคอมไพล์ใหม่และพบว่าคุณต้องการพูดคุยผ่านอินเทอร์เฟซคุณจะต้องมีแผน
Obj 3
รู้ว่าObj 4
มีอยู่ แต่ไม่Obj 3
ทราบว่าObj 4
เป็นรูปธรรมหรือไม่
นี่คือเหตุผลว่าทำไมมันดีมากที่ไม่แพร่กระจายไปnew
ทุกที่ ถ้าObj 3
ไม่รู้ว่าObj 4
เป็นรูปธรรมมีแนวโน้มเพราะมันไม่ได้สร้างขึ้นมาถ้าคุณแอบเข้าไปในภายหลังและกลายObj 4
เป็นคลาสนามธรรมObj 3
จะไม่สนใจ
หากคุณสามารถทำสิ่งนั้นObj 4
ได้อย่างสมบูรณ์นามธรรมตลอด สิ่งเดียวที่ทำให้อินเทอร์เฟซระหว่างพวกเขาตั้งแต่เริ่มต้นคือคุณคือความมั่นใจว่าใครบางคนจะไม่เพิ่มรหัสที่ให้โดยไม่ตั้งใจซึ่งObj 4
ตอนนี้เป็นรูปธรรม ตัวสร้างที่ได้รับการป้องกันสามารถลดความเสี่ยงนั้นได้ แต่ก็นำไปสู่คำถามอื่น:
Obj 3 และ Obj 4 อยู่ในแพ็คเกจเดียวกันหรือไม่?
วัตถุมักจะถูกจัดกลุ่มในบางวิธี (แพ็คเกจเนมสเปซและอื่น ๆ ) เมื่อจัดกลุ่มอย่างชาญฉลาดเปลี่ยนผลกระทบที่น่าจะเกิดขึ้นภายในกลุ่มมากกว่าข้ามกลุ่ม
ฉันชอบที่จะจัดกลุ่มตามคุณสมบัติ หากObj 3
และObj 4
อยู่ในกลุ่มและเลเยอร์เดียวกันมันไม่น่าเป็นไปได้มากที่คุณจะได้เผยแพร่รายการหนึ่งและไม่ต้องการปรับโครงสร้างใหม่ในขณะที่ต้องการเปลี่ยนเฉพาะอีกรายการหนึ่ง นั่นหมายความว่าวัตถุเหล่านี้มีโอกาสน้อยที่จะได้รับประโยชน์จากการใส่สิ่งที่เป็นนามธรรมลงก่อนที่จะมีความต้องการที่ชัดเจน
หากคุณกำลังข้ามเขตแดนของกลุ่มถึงแม้ว่าเป็นความคิดที่ดีที่จะปล่อยให้วัตถุในแต่ละด้านแตกต่างกันอย่างอิสระ
มันควรจะง่าย แต่น่าเสียดายที่ทั้ง Java และ C # ทำตัวเลือกที่โชคร้ายที่ทำให้สิ่งนี้ยุ่งยาก
ใน C # เป็นธรรมเนียมที่ต้องตั้งชื่อทุกอินเทอร์เฟซคำสำคัญด้วยI
คำนำหน้า ที่บังคับให้ลูกค้ารู้ว่าพวกเขากำลังพูดคุยกับส่วนติดต่อคำหลัก นั่นยุ่งกับแผนการปรับโครงสร้าง
ใน Java มันเป็นประเพณีที่จะใช้รูปแบบการตั้งชื่อที่ดีกว่า: FooImple implements Foo
อย่างไรก็ตามสิ่งนี้จะช่วยได้ในระดับซอร์สโค้ดเท่านั้นเนื่องจาก Java ได้คอมไพล์อินเทอร์เฟซคำสำคัญกับไบนารีที่แตกต่างกัน ซึ่งหมายความว่าเมื่อคุณปรับโครงสร้างFoo
จากไคลเอนต์ที่เป็นรูปธรรมเป็นนามธรรมที่ไม่จำเป็นต้องเปลี่ยนรหัสตัวอักษรเดียวก็ยังต้องทำการคอมไพล์ใหม่
เป็นข้อบกพร่องเหล่านี้ในภาษาเฉพาะเหล่านี้ที่ป้องกันไม่ให้ผู้คนสามารถชะลอการสรุปที่เป็นทางการจนกว่าพวกเขาจะต้องการมัน คุณไม่ได้พูดภาษาที่คุณใช้ แต่เข้าใจว่ามีบางภาษาที่ไม่มีปัญหาเหล่านี้
คุณไม่ได้พูดภาษาที่คุณใช้ดังนั้นฉันจะขอให้คุณวิเคราะห์ภาษาและสถานการณ์ของคุณอย่างรอบคอบก่อนที่คุณจะตัดสินใจว่ามันจะเป็นอินเทอร์เฟซคำหลักทุกที่
หลักการ YAGNI มีบทบาทสำคัญที่นี่ แต่ "โปรดทำให้เป็นการยากที่จะยิงตัวเองในเท้า"