설계에 정답은 없으나 품질을 올리려는 시도들은 존재함.

아래 나열되는 몇가지 원칙들과 이를 잘 적용한 BP 사례들은 존재한다. 

- 최대한의 독립성으로 재사용성을 늘리고 유지보수를 쉽게 한다

. 높은 응집성 : 클래스에 연관성 있는 기능들만 모여있는지

. 낮은 연결성 : 객체간 의존성을 낮춤


 

DRY ( Don't Repeat Yourself ) : 같은 코드를 반복하지 말아라. 계속 사용된다면 모듈화를 고민해 볼 것

 

KISS ( Keep It Simple and Stupid ) : 코드를 단순하고 읽기 쉽게 만들어라

 

SOLID 원칙

 

ㅁ SRP ( Single Reponsibility Principle )

- 하나의 클래스에는 하나의 책임만 지도록 단일 기능으로 구현

 

여러개의 기능으로 이루어진 클래스는 책임의 수 만큼, 기능의 수 만큼 변경될 여지가 생겨버린다.

이를 해결하기 위해 Facade 패턴을 사용할 수 있다. 

Facade는 건물의 정면을 뜻하는 단어로, 클라이언트는 Facade 인터페이스 하나만 보고 접근한다.

내부의 기능은 어떻게 구현되어있는지 모르며, 각 기능별로 담당하는 클래스들이 내부에 따로 존재하는 패턴

뒷단의 복잡한 구조를 감추고, 깔끔한 Facade를 바라보게 하는 용도로 사용한다.

 

ㅁ OCP ( Open Close Principle )

- 확장에는 열려있고, 변경에는 닫혀있는 원칙

변경하는 대상과 불변 대상을 구분하여, 요구사항이 변경되어도

코드를 변경하지 않고 다른 클래스를 확장하여 해결 가능한 설계

 

간단하게 말하면 변경이 일어나는 부분에 대해서 인터페이스로 추상화 하고,

클라이언트는 불변하는 인터페이스를 참조 하면 된다.

 

전략 패턴을 예로 들어, 결제를 하려할 때

고객은 어떤 결제방식을 선택할지 전략을 지정하기만 하면 된다.

 

 

 

여기에 결제 방식이 추가된다면, 기존 코드는 건들지 않고 클래스를 하나 더 만들면 된다.

 

ㅁ LSP ( The Liskov Substitution Principle ) 

자식 타입의 클래스는 부모 클래스의 역할을 수행할 수 있어야한다.

 

상속과 관련된 내용으로, 상속관계 클래스간의 일관성과 유연성을 보장한다.

가장 대표적인 예로 직사각형의 하위 클래스인 정사각형을 생각하면 된다.

상속관계가 아니거나, 자식 클래스에서 잘못된 오버라이딩을 했거나...

  • 정사각형은 직사각형의 모든 속성과 동작을 가지고 있어야 하므로, 직사각형 객체를 정사각형 객체로 대체할 수 있다.
  • 하지만 정사각형 클래스에서 setWidth()와 setHeight() 메서드를 오버라이딩하여 가로와 세로의 길이가 항상 같도록 구현한다면, LSP를 위반하게 된다.

 

ㅁ ISP ( Interface Segregation Principle )

SRP와 유사하게 , 다양한 기능을 가진 인터페이스를 선언하기 보다는 기능별로 인터페이스를 분리하자

 

인터페이스를 기능별로 잘게 나누어, 클래스는 사용하고자 하는 인터페이스만 구현하면 된다.

복합기의 예시를 들 수 있다. 복합기는 인쇄, 복사, 팩스 등 다양한 기능이 사용 가능하지만

이를 복합기라는 하나의 인터페이스로 제공하면 ISP를 위반한다.

모든 사용자가 기능을 다 쓰지는 않기때문에, 각 기능별로 인터페이스를 분리하여 사용자가 원하는 기능만 구현하게 하자.

 

ㅁ DIP ( Dependency Inversion Principle )

하위 모듈을 참조할 때 직접 참고하지 않고, 추상화된 상위 인터페이스를 참조하는 것.

하위 모듈의 변경에 영향을 받지 않는다.

+ Recent posts