나쁜 디자인을 나타내는 4가지 증상이 있다.
시스템이 변경되기 쉽지 않다. 하나의 변경을 위해서 다른 것들을 변경해야할 때 경직성이 높다고 판단한다. 경직성이 높아지면 non-critical한 문제가 발생해도, 관리자가 개발자에게 수정을 요청하기 힘들어진다.
취약성이 높다는 것은 시스템의 어느 부분을 수정할 때 관련이 없는 다른 부분에 영향을 준다는 것이다. 수정사항이 관련없는 부분에도 영향을 미쳐 관리하는 비용이 커지게 되며 신뢰성을 잃게 된다.
부동성이 높다는 것은 시스템을 분리하여 재사용을 위한 컴포넌트 활용이 어렵다는 것이다. 주로 개발자가 이전에 구현했던 모듈과 비슷한 기능을 하는 모듈을 만들고 싶을 때 문제를 발견하게 된다.
개발 환경이 느리고, 효율적이지 못한 경우를 점착성이 높다고 한다.
Robert C. Martin은 5가지 Software design principles을 정의하였고 앞글자를 따서 SOLID라고 부른다.
객체는 단 하나의 책임만을 가져야 한다. 즉, 클래스는 오직 하나의 이유로 수정이 되어야 한다. 책임이 많아지면 클래스 내부의 함수끼리 강한 결헙을 발생할 가능성이 높아지며 이는 유지보수에 비용이 증가하게 되므로 책임을 분리시킬 필요가 있다.
자신의 확장에는 열려있고, 주변의 변화에는 닫혀 있어야 하는 것을 의미한다. 즉, 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 한다.
자식 클래스는 부모 클래스에서 가능한 행위를 수행할 수 있어야 한다. 즉 자식이 부모의 자리에 항상 교체될 수 있는 일관성을 가져야 한다.
사용하지 않는 메소드에 의존하면 안된다. 하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다.
의존 관계를 맺을 때 변화하기 쉬운 것보다는 변화하기 어려운 것에 의존해야 한다. 예를 들어 구체적인 클래스보다 인터페이스, 추상 클래스와 관계를 맺는 것이 변화에 유연하게 대처 가능
하다.
일종의 설계 기법이자 방법이다. 효율적인 코드를 만들기 위한 방법론으로 말하기도 한다.
과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 그 방법에 이름을 붙이고 이후에 재사용하기 좋은 형태로 특정 규약을 만들어 정리한 것이다. 따라서 특정한 상황에서 발생하는 구조적인 문제를 해결하는 방식이 디자인 패턴이다.
소프트웨어의 재사용성, 호환성, 유지 보수성 보장
객체의 생성 방식 결정
예시 )
DBConnection을 관리하는 Instance를 하나만 만들 수 있도록 제한. 불필요한 연결을 막음.
객체간의 관계를 조직
2개의 인터페이스가 서로 호환되지 않을 때, 둘을 연결해주기 위해서 새로운 클래스를 만들어 연결시킴.
객체의 행위를 조직, 관리, 연합
하위 클래스에서 구현해야 하는 함수 및 알고리즘을 미리 선언하여, 상속 시에는 이를 필수로 구현하도록 함.