개방-폐쇄 원칙
소프트웨어 개체(클래스, 모듈, 함수 등등)은 확장에 대해 열려있어야 하고 수정에 대해서는 닫혀있어야 한다.
-- 마틴 파울러.
소프트웨어 개체(클래스, 모듈, 함수 등등)은 확장에 대해 열려있어야 하고 수정에 대해서는 닫혀있어야 한다.
-- 마틴 파울러.
사람이 수용할 수 있는 정보의 허용량을 넘어선 순간부터 문제 해결 능력은 급격하게 떨어지는 인지 과부하가 발생한다.
인지 과부하를 방지하는 가장 좋은 방법은 쏟아지는 정보의 양을 조절하는 것이다. 추상화는 문제 해결에 필요한 핵심만 남기고 불필요한 정보를 제거하는 것을 말한다.
클래스는 객체지향 프로그래밍을 위한 도구로서 많은 개발자들이 객체지향에 대해 생각하면 떠오르는 키워드일 것이다. 그러나 클래스는 프로그래밍 도구일 뿐 설계를 클래스에 초점을 두어선 안된다.
정말 중요한 것은 객체들이 주고 받는 메시지이며 이 메시지가 객체의 퍼블릭 인터페이스를 결정하고, 클래스를 결정한다.
책임에 초점을 맞춰 설계할 때 가장 큰 어려움은 어떤 객체에게 어떤 책임을 할당할지를 결정하기 쉽지 않다는 것이다.
모든 책임 활동은 트레이드오프 활동이며, 여러 방법중 최선의 할당 방법을 선택하는 것이다.
객체지향 패러다임의 관점에서 핵심은 역할(role), 책임(responsibility), 협력(collaboration) 이다.
객체지향 설계의 핵심은 협력을 구성하기 위해 적쩔한 객체를 찾고 적절한 책임을 할당하는 과정에서 드러난다.
모든 설계가 그러하듯 요구사항을 확인하는 것이 우선이다. 요구사항 분석을 통해 필요한 객체를 정할 수 있고, 각 객체의 책임을 어떻게 분배할지 방향을 잡을 수 있다.
객체 내부의 상태를 캡슐화하고 객체 간에는 오직 메시지를 통해서만 상호작용하도록 만드는 것을 캡슐화(Encapsulation)이라 한다.
자신 이외의 객체는 내부의 상태, 구현등을 알 수 없어야 한다.