카테고리 없음

SOLID (객체 지향 설계)

JUN0126 2021. 7. 5. 01:59

SOLID 란?

  - 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할떄, SOLID를 적용하여 소프트웨 어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하게 쉽게 될떄 까지 소스 코드를 리팩토링 하여 좋은 코드로 발전하기 위해 적용하는 객체지향 설계이다

 

1. SRP (Single responseibility principle, 단일 책임 원칙)

 - 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화 한다.

 - 쉽게 이야기 하면 변경되는 부분은 따로 클래스화 하여 관리하고 변경관리 클래스와 고정 관리 클래스를 나눈다.

 

 

SRP 적용 전
SRP 적용 후

위 사진과 같이 변경이 일어나는 부분을 객체화 하여 관리한다.

 

2. OCP (Open/closed principle, 개방-페쇄 원칙)

 - 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.

 - 변경에 대한 비용은 줄이고 확장을 위 한 비용은 극대화로 한다, 기존 요소를 확장해서 재사용 해야함 

 - 추상화를 통한 객체 설계로 변경은 최소화 하며 확장하여 객체를 생성해 나갈 수 있게 한다.

 - 요구사항이 변경되었을 때 코드에서 변경되어야 하는 부분과 변경되지 않아야 하는 부분을 명확하게 구분하여 변경하는 부분을 유연하게 작성하는것

 - 외부의 변경에는 유연하게 대응할 수 있으며 내부적으로는 Production 코드를 변경하지 않는다.

 

3. LSP (The Liskov Substitution Principle, 리스코브 치환의 원칙)

 - 서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다.

 - 자식(서브) 클래스는 최소한 자신의 부모(수퍼) 클래스에서 가능한 행위를 수행할 수 있어야한다.

  -> 부모클래스의 인스턴스 대신 자식 클래스의 인스턴스로 대체해도 프로그램의 의미는 변화되지 않는다.

   -> 서브 클래스가 슈퍼 클래스의 책임을 무시하거나 재정의 하지 않고 확장만 수행한다는것을 의미

 

4. ISP (Interface Segregation Principle, 인터페이스 분리의 원칙)

 - 한 클래스는 자신이 사용하지 않은 인터페이스는 구현하지 말아야 한다는 원칙.

 - 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙

 - 인터페이스들을 구체적이고 작은 단위로 분리 시킴으로써 클라이언트들이 꼭 필요한 메서드만 이용할 수 있도록 해야 한다.

 - 인터페이스를 클라이언트에 특화되도록 분리 시키라는 설계 원칙

 

5. DIP (Dependency Lnversion Principle, 의존성 역전의 원칙)

 - 상위 계층이 하위 계층에 의존하는 전통적인 의존관계를 반전 시킴으로써 상위 계층이 하위 계층의 구현으로 부터 독립 되게 할 수 있다.

 - 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.

 - 추상화는 세부 사항에 의존해서는 안된다, 세부사항이 추상화에 의존해야 한다.

 

반드시 위와 같은 설계를 지키며 해야 하는것은 아니지만 SOLID를 참조하여 객체 설계 시 수정 및 확장 용이성이 수월 하다고 생각한다.

 

 

참고 : https://www.nextree.co.kr/p6960/

https://velog.io/@kyle/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-SOLID-%EC%9B%90%EC%B9%99-%EC%9D%B4%EB%9E%80