단일 책임 원칙(SRP)
한 클래스는 단 한가지의 변경 이유만을 가져야 한다. (= 한 클래스는 한 가지의 책임만을 가져야 한다)
한 클래스가 하나 이상의 책임을 맡게 되었을 때, 한 책임에 대한 변경은 다른 책임을 충족시키는 클래스의 능력을 떨어트리거나 저하시킬 수 있다.
책임(responsibility):
변경을 위한 이유
변경의 축은 변경이 실제로 일어날 때만 변경의 축이다. 아무 증상도 없는데 이 문제에 SRP나 다른 원칙을 적용하는 것은 현명하지 못하다.
두가지 이상의 책임을 맡고 있다고 해서 무조건 SRP를 적용하는 것은 현명하지 못하다. 어플리케이션의 현 상황에 따라서 두 책임이 분리될 수 있도록 해야한다.
중요한 것은 요구사항의 변경에 맞게 적절하게 책임을 분배 하는 것인 것 같다.
모든 시스템은 생명주기 동안에 변화한다. 이것은 개발 중인 시스템이 첫 번째 버전보다 오래 남길 원한다면 반드시 염두에 두어야 할 사실이다.
개방 폐쇄 원칙(OCP)
소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
- 확장에 대해 열려 있다. (= 요구 사항이 변경될 때 새로운 행위를 추가해 모듈을 확장할 수 있다)
- 수정에 대해 닫혀 있다. (= 모듈의 행위를 확장하는 것이 소스 코드의 변경을 초래하는 것은 아니다)
→ 모듈의 소스코드를 변경하지 않고 모듈의 행위를 확장해야 한다
모듈은 고정된 추상화에 의존하기 때문에 수정에 대해 닫혀있고, 추상화의 새 파생 클래스들을 만듦으로써 확장이 가능하다
일반화(Generalization) 을 통한 추상화: 인터페이스 or 추상클래스
모든 상황에서 자연스러운 모델은 없다. 닫혀 있지 않은 것에 대한 변경은 항상 존재한다
올가미 놓기
불필요한 복잡성이 발생할 수 있다. 그렇기 때문에 처음에는 코드가 변경되지 않을 것이라고 생각하고 작성한 다음, 변경이 일어나면 나중에 해당 종류의 변경으로부터 보호되는 추상화를 구현 한다.