객체지향 설계의 5원칙: OCP, SRP, LSP, DIP, ISP

Posted by epicdev Archive : 2012. 7. 29. 20:27

1) OCP (Open Closed Principle)

소프트웨어의 구성요소(클래스, 모듈, 함수 등) 들은 확장에 대해서는 열려있어야 하지만, 변경에 대해서는 닫혀있어야 한다.


2) SRP (Single Responsibility Principle)

모든 클래스는 하나의 책임만을 지녀야 한다.

이는 또한, 객체를 변경해야 하는 이유는 단 하나여야 한다는 것과도 상통한다.

예를 들어 클래스 A는 출력에 대한 책임만 가지고 있고, 클래스 B는 입력과 출력에 대한 책임을 모두 가지고 있다고 했을 때

SRP를 지키고 있는 클래스 A가 그렇지 않은 B보다 상대적으로 복잡도가 낮을것이며, 또한 코드가 수정 될 가능성도 적을 것이다.


3) LSP (Liskov Substitution Principle)

Parent형의 변수에 Child 클래스의 인스턴스를 대입해도 문제없이 사용할 수 있어야 한다.

http://epicdevs.com/119


4) DIP (Dependency Inversion Principle)

상위 레벨 모듈은 하위 레벨 모듈에 의존하지 않아야 한다. 상위 레벨, 하위 레벨 모두 추상에 의존하여야 한다.

추상은 구상에 의존하지 않아야 한다. 구상 또한 추상에 의존하여야 한다.

http://epicdevs.com/117


5) ISP (Interface Segregation Principle)

클라이언트가 사용하지 않는 인터페이스에 클라이언트가 영향을 받아서는 안된다.

여러개의 클라이언트가 함께 사용하는 매우 큰 인터페이스를 만들지 말고,

좀 더 작고 구체적인 인터페이스를 만들어서, 하나의 인터페이스가 하나의 기능만을 담당하도록 만들어야 한다.

http://extern.tistory.com/14

http://www.oodesign.com/interface-segregation-principle.html

  
상속을 사용해서 좋은지 나쁜지를 판단할 때에는 리스코프의 치환원칙을 사용합니다.

FUNCTIONS THAT USE POINTERS OR REFERENCES TO BASE
CLASSES MUST BE ABLE TO USE OBJECTS OF DERIVED CLASSES
WITHOUT KNOWING IT.

Child 클래스가 Parent 클래스의 서브클래스라고 해봅시다.

리스코프의 치환원칙은 "Parent형의 변수에 Child 클래스의 인스턴스를 대입해도 문제없이 사용할 수 있다" 라는 원칙입니다.

위 처럼 Parent를 상속받은 Child의 인스턴스로 Parent의 메소드인 foo나 bar를 호출해도 아무런 문제없이 잘 실행이 되어야 한다는 것입니다.

그런데 만약 Child에서는 foo라는 메소드는 제대로 구현이 되지 않아서 UnsupportedOperationException이 throw 되도록 구현해 놓았다면

이는  리스코프의 치환원칙에 위배되는 것입니다.

참고:  http://www.objectmentor.com/resources/articles/lsp.pdf 


리팩토링입문
카테고리 컴퓨터/IT > 프로그래밍/언어
지은이 히로시 유키 (한빛미디어, 2007년)
상세보기
 
  
 «이전 1  다음»