Meyer의 Object-Oriented Software Construction (1988)에서 개방 / 폐쇄 원칙 을 다음과 같이 정의합니다 .
- 확장이 가능한 모듈은 열려 있다고합니다. 예를 들어, 포함 된 데이터 구조에 필드를 추가하거나 수행하는 기능 세트에 새 요소를 추가 할 수 있어야합니다.
- 다른 모듈에서 사용할 수있는 모듈은 닫혀 있다고합니다. 이것은 모듈에 잘 정의되고 안정적인 설명이 제공되었다고 가정합니다 (정보 숨기기의 인터페이스).
그는 계속해서 말합니다.
모듈을 다시 열면 이전 버전에 의존하기 때문에 모든 클라이언트를 다시 열어서 업데이트해야합니다. … [이 문제]는 직 / 간접 클라이언트의 변경을 트리거하여 새로운 기능 또는 데이터 요소로 모듈을 확장해야 할 때마다 발생합니다. ... 디자인과 프로그래밍에 대한 고전적인 접근 방식을 사용하면 열려 있고 닫힌 모듈을 작성할 수있는 방법이 없습니다.
이러한 딜레마에 대한 Meyer의 솔루션은 다음과 같습니다. 기존 클래스를 수정하여 라이브러리 모듈을 확장하지 마십시오. 대신 기존 클래스를 서브 클래 싱하는 새 모듈을 작성하고 새 클라이언트가 해당 새 모듈에 종속되도록하십시오.
1988 년 저는 Turbo Pascal and Blankenship Basic에서 장난감 (절차) 프로그램을 작성하고 있었고 21 세기 전문 경력은 JVM, CLR 및 동적 언어에 관한 것이므로 Meyer의 의미를 모릅니다. "디자인 및 프로그래밍에 대한 고전적인 접근 방식".
의 마이어의 하나의 구체적인 예 이유는 클라이언트 모듈 (지금은 더 많은 사례를 요구, 더 많은 회원을 보유하고 열거에서 switch 문) 재개해야 합리적인 충분히 보이지만, 그는 거의 그 주장을 정당화하지 않습니다 때마다 당신이 라이브러리에 기능을 추가 모듈의 경우 모든 클라이언트 를 업데이트해야합니다 .
이 주장이 1988 년에 자명 한 것처럼 보이는 역사적 이유가 있습니까? 예를 들어 함수 나 데이터 구조를 C 정적 라이브러리에 추가하면 이전 버전과 호환되는 API를 사용하더라도 클라이언트를 다시 컴파일해야하는 레이아웃이 변경 되었습니까? 아니면 Meyer는 API 이전 버전과의 호환성을 강화하기위한 메커니즘을 실제로 논의하고 있습니까?