Câu trả lời của Doc Brown gần nhất với chính xác, các câu trả lời khác minh họa cho sự hiểu lầm về Nguyên tắc Đóng mở.
Để nói rõ sự hiểu lầm, dường như có một niềm tin rằng OCP có nghĩa là bạn không nên thực hiện các thay đổi không tương thích ngược (hoặc thậm chí bất kỳ thay đổi hoặc điều gì đó dọc theo các dòng này.) OCP là về thiết kế các thành phần để bạn không cần phải thay đổi chúng để mở rộng chức năng của chúng, bất kể những thay đổi đó có tương thích ngược hay không. Có nhiều lý do khác ngoài việc thêm chức năng mà bạn có thể thay đổi thành phần cho dù chúng có tương thích ngược (ví dụ: tái cấu trúc hoặc tối ưu hóa) hoặc không tương thích ngược (ví dụ: không dùng và loại bỏ chức năng). Rằng bạn có thể thực hiện những thay đổi này không có nghĩa là thành phần của bạn đã vi phạm OCP (và chắc chắn không có nghĩa là bạn đang vi phạm OCP).
Thực sự, đó không phải là về mã nguồn. Một tuyên bố trừu tượng và phù hợp hơn của OCP là: "một thành phần sẽ cho phép mở rộng mà không cần vi phạm các ranh giới trừu tượng của nó". Tôi sẽ đi xa hơn và nói một biểu hiện hiện đại hơn là: "một thành phần nên thực thi các ranh giới trừu tượng của nó nhưng cho phép mở rộng". Ngay cả trong bài viết về OCP của Bob Martin trong khi ông "mô tả" "đóng để sửa đổi" là "mã nguồn là bất khả xâm phạm", sau đó ông bắt đầu nói về việc đóng gói không liên quan gì đến việc sửa đổi mã nguồn và mọi thứ phải làm với sự trừu tượng hóa ranh giới.
Vì vậy, tiền đề bị lỗi trong câu hỏi là OCP (dự định là) một hướng dẫn về sự phát triển của một cơ sở mã. OCP thường được khẩu hiệu là "một thành phần nên được mở cho các tiện ích mở rộng và đóng cho sửa đổi bởi người tiêu dùng". Về cơ bản, nếu người tiêu dùng của một thành phần muốn thêm chức năng cho thành phần đó thì họ có thể mở rộng thành phần cũ thành một thành phần mới với chức năng bổ sung, nhưng họ không thể thay đổi thành phần cũ.
OCP không nói gì về người tạo ra một thành phần thay đổi hoặc loại bỏ chức năng. OCP không ủng hộ việc duy trì khả năng tương thích lỗi mãi mãi. Bạn, với tư cách là người tạo, không vi phạm OCP bằng cách thay đổi hoặc thậm chí xóa một thành phần. Bạn, hay đúng hơn là các thành phần bạn đã viết, đang vi phạm OCP nếu cách duy nhất người tiêu dùng có thể thêm chức năng cho các thành phần của bạn là bằng cách thay đổi nó, ví dụ như bằng cách vá khỉhoặc có quyền truy cập vào mã nguồn và biên dịch lại. Trong nhiều trường hợp, cả hai đều không phải là tùy chọn cho người tiêu dùng, điều đó có nghĩa là nếu thành phần của bạn không "mở rộng" thì họ không gặp may. Họ chỉ đơn giản là không thể sử dụng thành phần của bạn cho nhu cầu của họ. OCP lập luận rằng không đưa người tiêu dùng của thư viện của bạn vào vị trí này, ít nhất là đối với một số loại "tiện ích mở rộng" có thể nhận dạng được. Ngay cả khi sửa đổi có thể được thực hiện đối với mã nguồn hoặc thậm chí là bản sao chính của mã nguồn, tốt nhất bạn nên "giả vờ" rằng bạn không thể sửa đổi nó vì có nhiều hậu quả tiêu cực tiềm ẩn khi làm như vậy.
Vì vậy, để trả lời câu hỏi của bạn: Không, đây không phải là vi phạm OCP. Không có thay đổi nào mà tác giả thực hiện có thể là vi phạm OCP vì OCP không phải là tỷ lệ thay đổi. Tuy nhiên, những thay đổi có thể tạo ra sự vi phạm OCP và chúng có thể được thúc đẩy bởi những thất bại của OCP trong các phiên bản trước của codebase. OCP là một thuộc tính của một đoạn mã cụ thể, không phải là lịch sử tiến hóa của một cơ sở mã.
Ngược lại, khả năng tương thích ngược là một thuộc tính của sự thay đổi mã. Thật vô nghĩa khi nói một số đoạn mã là hoặc không tương thích ngược. Nó chỉ có ý nghĩa để nói về khả năng tương thích ngược của một số mã đối với một số mã cũ hơn. Do đó, không bao giờ có ý nghĩa để nói về lần cắt đầu tiên của một số mã có tương thích ngược hay không. Lần cắt mã đầu tiên có thể thỏa mãn hoặc không thỏa mãn OCP và nói chung, chúng tôi có thể xác định liệu một số mã có thỏa mãn OCP hay không mà không đề cập đến bất kỳ phiên bản lịch sử nào của mã.
Đối với câu hỏi cuối cùng của bạn, có thể nói là lạc đề đối với StackExchange nói chung là chủ yếu dựa trên quan điểm, nhưng thiếu sót trong công nghệ và đặc biệt là JavaScript, trong vài năm qua, hiện tượng mà bạn mô tả được gọi là mệt mỏi JavaScript . (Hãy thoải mái google để tìm một loạt các bài viết khác, một số châm biếm, nói về điều này từ nhiều quan điểm.)