คำตอบของ Doc Brown นั้นใกล้เคียงกับความถูกต้องส่วนคำตอบอื่น ๆ แสดงให้เห็นถึงความเข้าใจผิดของหลักการ Open Open
อย่างชัดเจนเป็นปล้องความเข้าใจผิดที่ดูเหมือนว่าจะมีความเชื่อว่า OCP หมายความว่าคุณไม่ควรทำให้เกิดการเปลี่ยนแปลงเข้ากันไม่ได้ย้อนหลัง (หรือแม้กระทั่งใด ๆการเปลี่ยนแปลงหรือสิ่งที่ตามเส้นเหล่านี้.) The OCP เป็นเรื่องเกี่ยวกับการออกแบบชิ้นส่วนเพื่อให้คุณไม่ต้องไป ทำการเปลี่ยนแปลงเพื่อเพิ่มฟังก์ชันการทำงานโดยไม่คำนึงถึงว่าการเปลี่ยนแปลงเหล่านั้นเข้ากันได้ย้อนหลังหรือไม่ มีเหตุผลอื่น ๆ อีกมากมายนอกเหนือจากการเพิ่มฟังก์ชันการทำงานที่คุณอาจทำการเปลี่ยนแปลงส่วนประกอบไม่ว่าจะเข้ากันได้ย้อนหลัง (เช่นการปรับโครงสร้างหรือการเพิ่มประสิทธิภาพ) หรือเข้ากันไม่ได้ย้อนหลัง (เช่นการเลิกใช้งานและการลบฟังก์ชัน) การที่คุณทำการเปลี่ยนแปลงเหล่านี้ไม่ได้หมายความว่าองค์ประกอบของคุณละเมิด OCP (และแน่นอนไม่ได้หมายความว่าคุณ กำลังละเมิด OCP)
จริงๆแล้วมันไม่เกี่ยวกับซอร์สโค้ดเลย แถลงการณ์ที่เป็นนามธรรมและมีความเกี่ยวข้องของ OCP คือ: "ส่วนประกอบควรอนุญาตให้มีการขยายโดยไม่จำเป็นต้องละเมิดขอบเขตสิ่งที่เป็นนามธรรม" ฉันจะไปต่อและบอกว่าการแปลที่ทันสมัยกว่าคือ: "องค์ประกอบควรบังคับใช้ขอบเขตนามธรรม แต่อนุญาตให้มีการขยาย" แม้ในบทความเกี่ยวกับ OCP โดย Bob Martin ในขณะที่เขา "อธิบาย" "ปิดการปรับเปลี่ยน" เป็น "ซอร์สโค้ดไม่ถูกทำลาย" เขาก็เริ่มพูดคุยเกี่ยวกับการห่อหุ้มซึ่งไม่มีส่วนเกี่ยวข้องกับการแก้ไขซอร์สโค้ดและทุกอย่างเกี่ยวกับนามธรรม ขอบเขต
ดังนั้นหลักฐานที่ผิดพลาดในคำถามคือ OCP เป็นแนวทางในการวิวัฒนาการของ codebase โดยทั่วไปแล้ว OCP จะสโลแกนเป็น "ส่วนประกอบควรจะเปิดเพื่อขยายและปิดเพื่อการปรับเปลี่ยนโดยผู้บริโภค" โดยทั่วไปหากผู้บริโภคของส่วนประกอบต้องการเพิ่มฟังก์ชันการทำงานให้กับองค์ประกอบพวกเขาควรจะสามารถขยายองค์ประกอบเก่าไปเป็นองค์ประกอบใหม่ด้วยฟังก์ชันเพิ่มเติม แต่พวกเขาไม่ควรเปลี่ยนองค์ประกอบเก่า
OCP ไม่ได้พูดอะไรเลยเกี่ยวกับผู้สร้างส่วนประกอบที่เปลี่ยนแปลงหรือลบฟังก์ชันการทำงาน OCP ไม่สนับสนุนการรักษาความเข้ากันได้ของข้อผิดพลาดตลอดไป คุณในฐานะผู้สร้างไม่ได้ละเมิด OCP โดยการเปลี่ยนหรือลบส่วนประกอบ คุณหรือว่าส่วนประกอบที่คุณเขียนนั้นละเมิด OCP หากวิธีเดียวที่ผู้บริโภคสามารถเพิ่มฟังก์ชันการทำงานให้กับส่วนประกอบของคุณคือการกลายพันธุ์เช่นการดัดแปลงโดยลิงหรือมีการเข้าถึงซอร์สโค้ดและคอมไพล์ใหม่ ในหลายกรณีไม่มีตัวเลือกเหล่านี้สำหรับผู้บริโภคซึ่งหมายความว่าหากองค์ประกอบของคุณไม่ "เปิดเพื่อขยาย" พวกเขาจะโชคไม่ดี พวกเขาไม่สามารถใช้องค์ประกอบของคุณตามความต้องการได้ OCP ระบุว่าจะไม่ให้ผู้บริโภคของห้องสมุดของคุณเข้าสู่ตำแหน่งนี้อย่างน้อยก็ในส่วนที่เกี่ยวกับ "ส่วนขยาย" ที่ระบุได้บางคลาส แม้ว่าการแก้ไขสามารถทำได้กับซอร์สโค้ดหรือแม้แต่สำเนาหลักของซอร์สโค้ดก็ตามก็เป็นการดีที่สุดที่จะ "เสแสร้ง" ที่คุณไม่สามารถแก้ไขได้เนื่องจากมีผลกระทบด้านลบหลายประการที่อาจเกิดขึ้น
ดังนั้นเพื่อตอบคำถามของคุณ: ไม่สิ่งเหล่านี้ไม่ใช่การละเมิด OCP ไม่มีการเปลี่ยนแปลงใด ๆ ที่ผู้เขียนทำอาจเป็นการละเมิด OCP เนื่องจาก OCP ไม่ใช่สัดส่วนของการเปลี่ยนแปลง อย่างไรก็ตามการเปลี่ยนแปลงสามารถสร้างการละเมิด OCP และสามารถสร้างแรงจูงใจจากความล้มเหลวของ OCP ใน codebase เวอร์ชันก่อนหน้า OCP เป็นคุณสมบัติของรหัสบางส่วนไม่ใช่ประวัติวิวัฒนาการของ codebase
สำหรับความคมชัดความเข้ากันได้ย้อนหลังเป็นคุณสมบัติของการเปลี่ยนแปลงของรหัส มันไม่มีเหตุผลที่จะบอกว่าบางส่วนของโค้ดนั้นเข้ากันไม่ได้หรือไม่ มันสมเหตุสมผลที่จะพูดถึงความเข้ากันได้ของโค้ดบางส่วนที่เกี่ยวกับโค้ดเก่า ดังนั้นจึงไม่มีเหตุผลที่จะพูดถึงการตัดครั้งแรกของรหัสบางส่วนที่เข้ากันได้ย้อนหลังหรือไม่ การตัดครั้งแรกของรหัสสามารถตอบสนองหรือล้มเหลวในการตอบสนอง OCP และโดยทั่วไปเราสามารถตรวจสอบว่าบางรหัสตรงกับ OCP โดยไม่ต้องอ้างอิงถึงรุ่นที่ผ่านมาของรหัสใด ๆ
เป็นคำถามสุดท้ายของคุณก็เป็นเนื้อหาที่ปิดหัวข้อสำหรับ StackExchange ทั่วไปเป็นหลักความคิดเห็นตาม แต่ระยะสั้นของมันคือการต้อนรับการเทคโนโลยีและโดยเฉพาะอย่างยิ่ง JavaScript ที่ในช่วงไม่กี่ปีที่ผ่านมาปรากฏการณ์ที่คุณอธิบายได้รับการเรียกความเมื่อยล้า JavaScript (อย่าลังเลที่จะgoogleเพื่อค้นหาบทความอื่น ๆ อีกมากมายบางเรื่องเสียดสีพูดถึงเรื่องนี้จากหลายมุมมอง)