본문 바로가기
소프트웨어공학론

Design Principles - Solid

by 학식러 2023. 5. 6.

 

 

4. SOLID

: 객체지향과 연관이 깊다.

 

1) Single Responsibility Principle (SRP, 단일 책임 원리)

: 모든 모듈은 기능의 한 부분에 대한 책임만을 가져야 한다.

= 하나의 기능은 하나의 모듈만을 수행하도록 모듈화되어야 한다.

 

case 1) 한 모듈에 많은 책임들이 있음

원래 Student클래스는 너무 많은 책임을 가짐 -> 각 클래스들이 하나의 책임만 가지도록 4개의 클래스로 나눔

 

 

case 2) 한 책임이 여러 모듈에 분산되어있음

logging : 프로그램의 실행 과정을 저장, 문제가 생겼을 때 log 데이터만 살펴봄. ex.블랙박스

모듈 하나만으로는 동작했는지 모름. 모든 모듈들이 log라는 하나의 책임을 가지고 있어야함.

 

모든 모듈이 관여하기 때문에 설계하기 쉽지 않다.

쉽게 구현하기 위한 프로그래밍 패러다임 : aspect-oriented programming, AspectJ

 

2) Open-Closed Principle (OCP, 개방-폐쇄 원리)

: 모든 모듈은 확장가능해야 한다. (Open)

모듈 안에는 변경하지 않고.(Closed)

A 인터페이스를 구현,realization, implement하는 클래스 A1, 클래스 A2

Client가 A1, A2를 직접 사용x

또다른 A3 클래스 만들 때 A인터페이스를 만족하는 클래스를 구현해서 상속만 하면 된다.

전체 시스템을 확장시켰지만 고치지는 않았다. 끼워넣기만 했다.

 

ex) OCP원리를 만족하지 않는 자바코드

특정 시간이 되면 MP3를 play하는 알람같은 프로그램

사용자에게 deploy, test 하고 싶다.

하지만 test하려면 밤10시까지 기다려야 되고, 딱 한번 test 할 수 있다.

3시에 테스트 하려면 소스코드를 고쳐야 된다. => Closed 위반

 

 

3) Liskov Substitution Principle (LSP, 리스코프 치환 원리)

: 프로그램에 있는 부모 객체들이 자식 객체들로 대체가능해야 한다.

부모클래스 입장에서 본 프로그램의 정확성(명세)를 바꾸지 않으면서.

자식 클래스의 객체가 오더라도 그 명세는 변경되지 않아야 한다.

 

-behavioral subtyping : 부모가 가진 행동은 자식이 어기면 안된다. 어기지 않는 범위에서 확장, 변형

부모 클래스에서 기대하는 동작들이 자식 클래스에서도 그대로 동작한다.

부모 클래스 객체 대신에 자식 클래스 객체가 대신할 수 있다.

 

=> 부모 클래스의 동작과 일관성 있게 자식 클래스를 만드는 것.

A 부모 클래스에 Operation1 메서드가 있다.

오버라이딩 : B 클래스에 Operation1을 새로 만듦

마지막 줄 c에 A를 만든 것이 아니라 B 자식 클래스 객체를 만들어서 넣는 것이 가능하다.

 

 

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

: 클라이언트에게 제공되는 하나의 범용 인터페이스보다 여러개로 나누는 것이 낫다, 인터페이스를 분리해라.

프린터 클라이언트는 팩스 기능과는 상관이 없다. 

여러 클라이언트를 서비스하는 범용 인터페이스, 이것저것 다 가지고 있다.

 

=> 복합기 클래스는 프린터, 팩스 인터페이스를 구현한 클래스로 두고

프린터 클라이언트가 복합기를 직접 association(x), 프린터 인터페이스만 association을 맺음.

자기가 관심있어하는 operation만 제공하는 인터페이스와 상호작용을 함.

=> 장점 : 두 모듈 사이의 결합도를 낮추게 된다.

 

 

5) Dependency Inversion Principle (DIP, 의존 역전 원리)

: 구체적인것이 아니라 추상화된 것에 의존해라.

 

 

'소프트웨어공학론' 카테고리의 다른 글

Structural Pattern  (0) 2023.05.11
Design patterns - Creational Pattern  (1) 2023.05.10
Design Principles - Step-wise Refinement, Abstraction  (0) 2023.05.03
Pipe and Filter architecture  (0) 2023.04.28
Repository architecture  (0) 2023.04.28

댓글