나는 많은 사람들이 클래스가해야한다 느끼는 진짜 이유가 믿는 final
/ sealed
대부분의 비 추상적 확장 클래스가되는 것입니다 하지 제대로 문서화 .
자세히 설명하겠습니다. 멀리서부터 OOP의 도구로서의 상속이 널리 남용되고 남용된다는 견해가 일부 프로그래머들 사이에 있습니다. 우리는 모두 Liskov 대체 원칙을 읽었지만 이것이 수백 (아마도 수천 번)을 위반하는 것을 막지는 못했습니다.
문제는 프로그래머가 코드를 재사용하는 것을 좋아한다는 것입니다. 그렇게 좋은 생각이 아니더라도. 그리고 상속은 코드의 "재활용"의 핵심 도구입니다. 최종 / 봉인 된 질문으로 돌아 가기
최종 / 밀봉 클래스에 대한 적절한 문서는 비교적 작습니다. 각 메소드의 기능, 인수, 반환 값 등을 설명합니다.
그러나 확장 가능한 클래스 를 올바르게 문서화 할 때는 최소한 다음을 포함해야합니다 .
- 메소드 간의 종속성 (어떻게 메소드를 호출하는지 등)
- 지역 변수에 대한 의존성
- 확장 클래스가 존중해야하는 내부 계약
- 각 방법에 대한 호출 규칙 (예를 들어, 당신이 그것을 무시하면, 당신은 전화를 할
super
구현을? 당신이 방법의 시작에 전화하거나 결국하십니까? 소멸자 대 생성자를 생각)
- ...
이것들은 내 머리 꼭대기에 있습니다. 그리고 나는 이들 각각이 중요한 이유의 예를 제공 할 수 있으며 그것을 건너 뛰면 확장 수업을 망칠 것입니다.
이제 이러한 각 항목을 올바르게 문서화하는 데 얼마나 많은 문서 노력이 필요한지 고려하십시오. 나는 7-8 개의 메소드가있는 클래스 (이상화 된 세계에서는 너무 많지만 실제로는 너무 적음)가 텍스트 전용 5 페이지에 대한 문서를 가지고 있다고 생각합니다. 대신, 우리는 반쯤 빠져 나와 다른 사람들이 사용할 수 있도록 수업을 봉인하지 않습니다. 그러나 시간이 많이 걸리기 때문에 올바르게 문서화하지 마십시오. 어쨌든 확장되지 않으므로 왜 귀찮게합니까?).
강의를 디자인하는 경우 사람들이 예상치 못한 (그리고 준비하지 않은) 방법으로 강의를 사용할 수 없도록 봉인하려는 유혹을 느낄 수 있습니다. 반면에 다른 사람의 코드를 사용하는 경우 (공개 API에서) 클래스가 최종적인 이유는 없으며 "Damn, 해결 방법을 찾는 데 30 분이 소요됩니다"라고 생각할 수도 있습니다.
솔루션의 일부 요소는 다음과 같습니다.
- 먼저 확인하는 좋은 아이디어입니다 확장 당신이 코드의 클라이언트가되면하고 정말 상속을 통해 구성을 선호한다.
- 두 번째로 고객이 언급 한 내용을 간과하지 않도록 매뉴얼 전체를 다시 읽어보십시오 .
- 셋째, 클라이언트가 사용할 코드를 작성할 때 코드에 대한 적절한 문서를 작성하십시오 (그렇습니다). 긍정적 인 예로서, 나는 애플의 iOS 문서를 제공 할 수있다. 항상 제대로 자신의 클래스를 확장에 그들은 사용자에 대한 충분하지,하지만 그들은 적어도 포함 일부 상속에 대한 정보를. 대부분의 API에 대해 말할 수있는 것 이상입니다.
- 넷째, 실제로 자신의 수업을 확장하여 작동하는지 확인하십시오. API에 많은 샘플과 테스트를 포함시키는 데 큰 지지자이며 테스트를 할 때 상속 체인도 테스트 할 수 있습니다. 결국 계약의 일부입니다!
- 다섯째, 의심스러운 상황에서는 수업이 확장 될 수 없으며 수업을하는 것이 나쁜 생각 (tm)임을 나타냅니다. 의도하지 않은 사용에 대해 책임을지지 말아야하지만 여전히 수업을 봉인하지는 마십시오. 분명히 이것은 클래스가 100 % 봉인되어야하는 경우에는 적용되지 않습니다.
- 마지막으로, 클래스를 봉인 할 때 클라이언트가 자신의 수정 된 클래스 버전을 "다시 작성"하고 "봉인 된"클래스를 해결할 수 있도록 인터페이스를 중간 후크로 제공하십시오. 이렇게하면 봉인 된 클래스를 구현으로 바꿀 수 있습니다. 가장 간단한 형태의 느슨한 커플 링이기 때문에 이것은 분명해야하지만 여전히 언급 할 가치가 있습니다.
다음과 같은 "철학적"질문을 언급 할 가치가있다 : 클래스인지 여부가 sealed
/ final
클래스, 또는 구현 세부 사항에 대한 계약의 일부? 이제 나는 거기에서 밟고 싶지 않지만 이것에 대한 대답은 수업을 봉인할지 여부에 대한 결정에도 영향을 미칩니다.
Open/Closed principle
아닌Closed Principle.