본문 바로가기
Homo Faber/Techniques

설계 원리 (Design Principles)

by javauser 2008. 2. 21.

 현재까지 잘 알려진 설계 원리들은 다음과 같다.

DRY (Don't Repeat Yourself) - 한번 이상 동일하거나 유사한 코드를 작성하지 말라. 'Once and Only Once' 원리라고도 함.

SCP (Speaking Code Principle) - 코드는 그 목적과 상호교류해야 함. 코드에 있는 주석은 코드가 그 목적과 비효율적으로 상호교류함을 나타낼 수 있음.

OCP (Open Closed Principle) - 설계 단위는 변화(adjustment)에 열려있어야 함. 그러한 변화(adjustment, 조정)은 기존 클라이언트를 쓸모없게 만들어서는 안됨. 상속은 이러한 목적을 달성하게 하는 메커니즘 중의 하나임. 하위클래스는 상위클래스의 클라이언트들이 유효하게 유지한 채로 변경이 될 수 있음.

LSP (Liskov Substitution Principle) - 클래스의 한 인스턴스는 타입이 상위클래스인 모든 인스턴스에 대해서 사용될 수 있어야 함. 컴파일러가 소스 코드를 해석하는게 필요할 뿐만 아니라, 수정 후에 시스템은 여전히 올바르게 동작해야 함.

DIP (Dependency Inversion Principle) - 높은 차원의 개념들은 낮은 차원의 개념/구현체에 종속되어서는 안됨. 높은 차원의 개념들은 낮은 차원들의 개념들보다 덜 변경이 발생되기 때문에 의존성(dependency)은 반대로도 똑같이 종속되지 않아야 함. 원리를 고수하기 위해서 추가적인 인터페이스를 도입할 수 있음.

ISP (Interface Segregation Principle) - 인터페이스는 작아야 함. 단지 몇개의 메소드만을 포함해야 하지만, 인터페이스에 포함된 메소드들은 밀접하게 연관되어야 함.

REP (Reuse/Release Equivalency Principle) - 재사용되는 요소들은 릴리즈(배포)되는 요소들임.

CRP (Common Reuse Principle) - 패키지의 클래스들은 전체적으로 재사용됨.

CCP (Common Closure Principle) - 패키지의 클래스들은 동일한 유형의 변경에 대해서 닫혀있어야 함. 만일 클래스가 변경되어야 한다면 패키지의 모든 클래스들은 마찬가지로 변경되어야 함.

ADP (Acyclic Dependencies Principle) - 패키지들 간의 의존성 구조는 비순환구조이어야 함.

SDP (Stable Dependencies Principle) - 패키지는 최소한 그 자체로 안정적인 패키지들에만 의존해야 함.

SAP (Stable Abstractions Principle) - 패키지가 점점 더 안정될수록 점점 더 추상화되어야 함. 안정적이지 못한 패키지들은 구체적이어야(concrete) 함.

TDA (Tell, Don't Ask) - 객체에 대해서 객체에게 묻지 말고, 무엇을 하는지 물어라. 'Law of Demeter'와 유사함. 각각의 객체는 '친구'에게만 말을 해야함. 즉, 필드로 있거나 파라미터를 받아들이는 객체.

SOC (Separation Of Concerns) - 하나의 클래스 내에 여러 관심사를 혼합시키지 마라. 'Single Responsibility Principle' 로도 알려져 있음.
반응형