หลักการ open-closed (OCP) ระบุว่าควรเปิดวัตถุสำหรับส่วนขยาย แต่ปิดเพื่อทำการปรับเปลี่ยน ฉันเชื่อว่าฉันเข้าใจและใช้งานร่วมกับ SRP เพื่อสร้างคลาสที่ทำสิ่งเดียวเท่านั้น และฉันพยายามสร้างวิธีการขนาดเล็กจำนวนมากที่ทำให้สามารถแยกการควบคุมพฤติกรรมทั้งหมดออกเป็นวิธีที่อาจขยายหรือแทนที่ในคลาสย่อยบางประเภท ดังนั้นฉันจบลงด้วยคลาสที่มีคะแนนส่วนขยายมากมายไม่ว่าจะเป็น: การฉีดและองค์ประกอบ, เหตุการณ์, การมอบหมาย ฯลฯ
พิจารณาคลาสที่เรียบง่ายและขยายได้ดังต่อไปนี้
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
ตอนนี้พูดเช่นว่าการOvertimeFactor
เปลี่ยนแปลง 1.5 ตั้งแต่ระดับดังกล่าวข้างต้นได้รับการออกแบบมาเพื่อขยายฉันสามารถ subclass OvertimeFactor
และกลับที่แตกต่างกัน
แต่ ... แม้จะมีคลาสที่ถูกออกแบบมาสำหรับการขยายและการยึดติดกับ OCP ฉันจะแก้ไขวิธีการที่เป็นปัญหามากกว่าซับคลาสและแทนที่วิธีการที่มีปัญหา
ด้วยเหตุนี้ฉันจึงละเมิดส่วนหนึ่งของความพยายามของ OCP ที่จะทำให้สำเร็จ รู้สึกเหมือนฉันเพิ่งขี้เกียจเพราะสิ่งที่กล่าวมานั้นง่ายกว่านิดหน่อย ฉันเข้าใจ OCP ผิดหรือเปล่า? ฉันควรจะทำอะไรที่แตกต่างออกไปจริงๆเหรอ? คุณใช้ประโยชน์จาก OCP ต่างกันหรือไม่
อัปเดต : ขึ้นอยู่กับคำตอบที่ดูเหมือนว่าตัวอย่างที่วางแผนไว้นี้เป็นตัวอย่างที่ไม่ดีด้วยเหตุผลหลายประการ จุดประสงค์หลักของตัวอย่างคือเพื่อแสดงให้เห็นว่าชั้นเรียนได้รับการออกแบบให้ขยายโดยการให้วิธีการที่เมื่อแทนที่จะเปลี่ยนพฤติกรรมของวิธีการสาธารณะโดยไม่จำเป็นต้องเปลี่ยนรหัสภายในหรือส่วนตัว ถึงกระนั้นฉันก็เข้าใจผิด OCP