좋은 설계인지 판단하는 다섯 가지 원칙. 객체를 어떻게 나눴는지와 나눈 것들을 어떻게 이었는지를 묻는다.
다섯이 이어지는 방식
다섯이 따로 떨어져 있는 것은 아니다. SRP로 나누고, 나눈 것들을 인터페이스로 잇고(ISP), 그 인터페이스에 의존하게 하고(DIP), 그래서 확장이 가능해지고(OCP), 확장한 것이 원래 자리를 대신할 수 있다(LSP). 다섯 모두 응집도와 결합도 이야기로 돌아온다.
단일 책임 원칙 (SRP)
수정해야 할 이유는 하나여야 한다. 객체 하나에 책임 하나만 준다. 책임이란 그 객체가 수행해야 할 임무를 말하고, 한 객체에 여러 기능을 몰아넣지 않는다.
기능의 개수가 아니라 변경의 원인이 기준이라 “수정할 이유”로 표현한다. 메서드가 열 개여도 전부 같은 이유로 바뀐다면 책임은 하나다.
개방 폐쇄 원칙 (OCP)
수정에는 닫히고 확장에는 열려 있어야 한다. 처음부터 고칠 수 있게 만들지 말고 확장해서 기능을 바꿀 수 있게 만든다. 기존 코드는 건드리지 않는다.
다형성이 이것을 가능하게 한다. 인터페이스를 두면 새 구현을 추가하는 것만으로 동작이 바뀐다.
리스코프 치환 원칙 (LSP)
추상체가 쓰이는 자리에 구상체가 들어가도 아무 문제가 없어야 한다. 추상과 구체의 관계가 분명하면 저절로 지켜진다. 깨지는 것은 공통 코드를 빼려고 상속을 썼을 때다. 부모가 진짜 추상체가 아니니 자식이 부모 자리를 대신할 수 없다. 상속과 합성에 자세히 있다.
인터페이스 분리 원칙 (ISP)
필요한 기능만 보이도록 인터페이스를 나눈다. 로그인 인터페이스와 검색 인터페이스가 따로 있으면 로그인만 시키고 싶을 때 로그인 인터페이스로 넘기면 된다. 하나로 뭉쳐 있으면 검색까지 딸려 나간다.
의존관계 역전 원칙 (DIP)
상위 모듈은 하위 모듈에 의존하지 않는다. 둘 다 추상화에 의존해야 한다. 다섯 중 가장 자주 언급되고 파급도 크다. DIP에 따로 정리해두었다.