Trong Xây dựng phần mềm hướng đối tượng của Meyer (1988), ông định nghĩa nguyên tắc mở / đóng như sau:
- Một mô-đun sẽ được cho là mở nếu nó vẫn có sẵn để mở rộng. Ví dụ, có thể thêm các trường vào cấu trúc dữ liệu mà nó chứa hoặc các phần tử mới vào tập hợp các hàm mà nó thực hiện.
- Một mô-đun sẽ được cho là đóng nếu nó có sẵn để sử dụng bởi các mô-đun khác. Điều này giả định rằng mô-đun đã được cung cấp một mô tả ổn định, được xác định rõ (giao diện theo nghĩa ẩn thông tin).
Anh tiếp tục nói:
Nếu bạn mở lại một mô-đun, bạn cũng phải mở lại tất cả các máy khách của nó để cập nhật chúng, vì chúng dựa vào phiên bản cũ. Re [Vấn đề này] phát sinh mỗi khi một mô-đun phải được mở rộng bởi một chức năng hoặc thành phần dữ liệu mới, kích hoạt các thay đổi trong các máy khách trực tiếp và gián tiếp. ... Với các phương pháp cổ điển để thiết kế và lập trình, không có cách nào để viết các mô-đun cả mở và đóng.
Giải pháp của Meyer cho vấn đề nan giải này là: không bao giờ mở rộng mô-đun thư viện bằng cách sửa đổi các lớp hiện có; thay vào đó, hãy viết một mô-đun mới phân lớp các lớp hiện có và có các máy khách mới phụ thuộc vào mô-đun mới đó.
Bây giờ, vào năm 1988, tôi đã viết các chương trình đồ chơi (thủ tục) trong Turbo Pascal và Blankenship Basic, và kinh nghiệm chuyên môn trong thế kỷ 21 của tôi là về JVM, CLR và bằng các ngôn ngữ động, vì vậy tôi không biết Meyer có nghĩa là gì bởi "cách tiếp cận cổ điển để thiết kế và lập trình".
Một ví dụ cụ thể về lý do tại sao các mô-đun máy khách phải được mở lại (một câu lệnh chuyển đổi về một bảng liệt kê hiện có nhiều thành viên hơn, yêu cầu nhiều trường hợp hơn) có vẻ hợp lý, nhưng anh ta gần như không biện minh rằng mỗi khi bạn thêm chức năng vào thư viện mô-đun, bạn cần cập nhật tất cả các khách hàng của nó .
Có một lý do lịch sử mà khẳng định này dường như tự rõ ràng vào năm 1988? Có phải, việc thêm các hàm hoặc cấu trúc dữ liệu vào thư viện tĩnh C đã thay đổi bố cục sao cho ngay cả với các API tương thích ngược, các máy khách phải được biên dịch lại? Hay Meyer thực sự chỉ đang nói về một cơ chế để thực thi tính tương thích ngược API?