OCP (Open-Closed Principal)는 개체가 확장을 위해 열려 있지만 수정을 위해 닫혀 있어야한다고 명시하고 있습니다. 나는 그것을 이해하고 SRP와 함께 사용하여 한 가지만 수행하는 클래스를 만듭니다. 그리고 일부 하위 클래스에서 확장되거나 재정의 될 수있는 메서드로 모든 동작 컨트롤을 추출 할 수있는 많은 작은 메서드를 만들려고합니다. 따라서 종속성 주입 및 구성, 이벤트, 위임 등을 통해 확장 점이 많은 클래스가 생깁니다.
다음과 같이 간단하고 확장 가능한 클래스를 고려하십시오.
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
예를 들어 OvertimeFactor
1.5로 변경 되었다고 가정 하겠습니다. 위의 클래스는 확장되도록 설계되었으므로 쉽게 서브 클래스 화하고 다른을 반환 할 수 있습니다 OvertimeFactor
.
그러나 ... 클래스가 확장 및 OCP를 준수하도록 설계 되었음에도 불구하고 문제의 메소드를 서브 클래 싱 및 오버 라이딩 한 다음 IoC 컨테이너에서 객체를 다시 배선하는 대신 해당 단일 메소드를 수정합니다.
결과적으로 OCP가 달성하려는 일부를 위반했습니다. 위가 조금 더 쉽기 때문에 게으른 느낌입니다. OCP를 오해하고 있습니까? 정말로 다른 것을해야합니까? OCP의 이점을 다르게 활용합니까?
업데이트 : 답변을 기반 으로이 구성 된 예제는 여러 가지 이유로 열악한 것으로 보입니다. 이 예제의 주요 목적은 재정의 될 때 내부 또는 개인 코드 를 변경할 필요없이 공용 메서드 의 동작을 변경할 수있는 메서드를 제공하여 클래스가 확장되도록 설계되었음을 보여주었습니다 . 그래도 OCP를 오해했습니다.