Definition
•
S/W 개체(class, module, function 등)는 확장에 열려있고, 변경에는 닫혀있어야.
•
추상화를 통한 변경에 대한 파급의 격리, 다형성을 이용한 확장의 지원
OCP violated sample
Class Client
{
void DoCommunicate(Server1 server1) { //.. }
//...
}
//타 server(Server2)를 참조해야 할 경우의 변경
Class Client
{
void DoCommunicate(Server2 server2) { //.. }
//...
}
C#
복사
•
Client는 Concrete class인 server를 참조
•
만일 client가 타 server 개체를 사용하려면, 새 server 개체를 참조하도록 변경해야 할 것임
OCP complied sample
Class Server1 : IClient {}
Class Client
{
void DoCommunicate(IClient server) { //.. }
//...
}
//새 기능을 담당할 Server2. client 변경 필요 무
Class Server2 : IClient {}
C#
복사
•
Client는 추상 클래스 또는 interface를 참조. 이 때 참조해야 할 새 server 개체가 Client Interface를 상속한다면,
◦
client는 변경할 필요가 없음(변경에 대한 격리)
◦
새 server 개체를 통해 client의 기능을 확장(다형성 기반)
Usage examples for OCP
•
Access modifier : 특히 private(protected), Property(Getter/Setter)를 통한 외부 노출.
•
IOC(Inversion of Control) : template method, strategy pattern, delegate(C#) 등..
Conclusion
•
경직성과 취약성을 제거하는 대표적 원칙으로서, 개체 지향 설계의 핵심.
•
OCP가 요구하는 적절한 추상화는 실제 적용에는 많은 경험을 요구(적용이 용이한 원칙은 아님) : 왜? 추상화는 종종 '불필요한 복잡성'을 유발하기 때문에. 적절한 trade off 필요.