공부/객체지향2011. 7. 2. 20:28


디자인원리는 코드를 좀 더 유지보수하기 쉽고 유연하고 확장하기 쉽게 만들어준다.
이전에 배웠던 디자인원리
캡슐화, 구현에 의존하기 보다 인터페이스에 의존하도록 코딩, 각 클래스는 변경요인이 하나여야 한다, 클래스는 행동과 기능에 관한 것이다.

Open-Closed principle, OCP 
클래스는 확장에는 열려있고, 수정에는 닫혀있어야 한다.

OCP의 예

 
CRT와 LCD는 Monitor를 상속한다. Monitor 클래스는 수정에는 닫혀 있다. display 메소드는 변경되지 않는다.
하지만 서브클래스들이 오버라이드를 통해 display의 행동을 변경할 수 있기 때문에 확장에는 열려있다.

OCP는 단순히 상속에 대한 내용은 아니고 유연성에 대한 내용이다. 또 다른 예 : private 가 있는 클래스.
OCP는 잘 동작하여 고객을 만족시키고 있는 코드를 건드리지 않고도 부모 클래스의 행동을 추가 확장할 수 있다.
OCP는 캡슐화와 추상화의 조합. 변하지 않는 클래스의 기능을 찾아 부모 클래스에 추상화하여 변경하지 못하게 한다. 새롭거나 다른 기능이 필요할 때, 부모 클래스를 확장하여 변경을 해결한다.

DRY (Don't Repeat Yourself)
공통되는 부분을 추출하여 추상화하고 한 곳에 두어 중복 코드를 피하기.
하나의 요구 사항은 한 곳에 두어야 한다는 원리.(시스템의 정보와 기능이 한 곳에 있어야 한다)
코딩할 때 뿐만아니라 요구사항 수집때부터 요구사항이나 유스케이스가 겹치지 않도록 해야 한다.

 SRP (Single Responsibility Principle)
 한가지 일만 잘하게 하자. (클래스 변경의 요인이 한가지여야 한다.)
응집도와 같은 의미
SRP인지 테스트 하는 방법.
(클래스이름)가 자신을 (클래스의 각 메소드)한다.
이게 말이 되면 SRP.

리스코프 치환 원리(LSP)
상속에 대한 내용. 부모클래스가 사용되는 곳은 아무 문제없이 자식 클래스도 사용될 수 있어야 한다.

위임(Delegation)
특정 일의 책임을 다른 클래스나 메소드에 맡길 때
다른 클래스의 기능을 사용해야 하지만 그 기능을 변경하고 싶지 않을때 사용.
예) 악기 인벤토리 클래스에서 사용자가 악기를 검색할 때, 검색기능을 악기스펙 클래스에게 맡기는 것.

구성(Composition)
비슷한 여러 종류의 기능을 참조하는 경우.
예 ) 병사가 여러 무기를 사용하고 싶을 때 무기 인터페이스를 참조해서 실행중에 특정무기 클래스로 바꿀 수 있도록 할 때.
구성되어 있는 객체들은 그것들을 참조하는 객체에 속한 거라 그 객체가 없어지면 구성 객체들도 없어지는 특징이 있다.
하지만 안 사라지게 하고 싶을땐? 즉, 클래스 외부에서도 존재하도록 하고 싶을 때는 어떻게 할까? 집합(Aggregation)을 사용한다.

집합(Aggregation)
한 클래스가 다른 클래스의 부분으로 사용되지만 다른 클래스의 외부에서도 여전히 존재하는 경우.

리스코프 치환 원리(LSP)는 언제 상속을 사용할 것인가에 대한 원리. LSP가 성립하지 않는 다면, 즉 부모클래스가 사용된 곳에 자식클래스가 대체되어 사용될 수 없으면, 집합이나 구성, 위임등 다른 객체지향 방법을 찾아봐야 한다.
 

'공부 > 객체지향' 카테고리의 다른 글

10장 종합하기  (0) 2011.07.07
9장 반복하기, 테스팅하기  (0) 2011.07.03
7장 아키텍쳐 (architecture)  (0) 2011.06.30
6장 큰문제 해결하기  (0) 2011.06.29
5장 좋은디자인 = 유연한 소프트웨어  (0) 2011.06.28


Posted by skyjumps