Agile의 주안점
•
변화에 대한 능동적 대처 : dependency의 최소화
Application의 주요 문제
경직성(rigidity) | 파급 효과로 인한 변경의 난해성. |
취약성(Fragility) | 변경 하나가 여러 부분의 문제를 일으키는 경향.
개발자가 재설계의 필요성을 느끼는 경향, 고칠 수록 점점 문제를 일으키는 모듈 |
부동성(immobility) | 타 시스템에서 유용하게 사용할 수 있지만 분리의 수고와 위험성이 큰 경향 |
점성(viscosity) | 소프트웨어적 점성 : 변경에 대해 설계 원칙에 반하기 쉬운 경향
환경적 점성 : 개발 환경이 느리고 비효율적인 경향(ex. 재컴파일의 느린 속도)
이들 두 점성 모두 설계 유지에 반하도록 개발자를 이끔. |
불필요한 복잡(needless complexity) | 설계가 현재 시점에서 유용하지 않은 요소를 포함하는 상태.
변경에 대한 사전 고려로 만들어진 요소는 종종 사용되지 않으며 복잡도만 유발 |
불필요한 반복(needless repetition) | 중복 코드 |
불투명성(opacity) | 모듈을 이해하기 어려운 상태 |
상기문제를 해결하기 위한 주요원칙 (SOLID)
Cohesion(응집도) 증대 원칙
클래스는 단일 책임 만이 따르도록(단 한가지의 변경 이유만을 가지도록) | |
S/W 개체(class, module, function 등)는 확장에 열려있고, 수정에는 닫혀있어야.
추상화를 통한 변경 사항 격리, 다형성을 이용한 확장의 지원 | |
상속 시 부모와 자식의 관계가 반드시 IS-A 관계를 유지하도록
Subtype은 base type애 대해 치환 가능하여야.
Base class의 사용 조건을 sub class에서 모두 따를 수 있도록 | |
클라이언트 코드가 자신이 사용하지 않는 method에 의존하도록 강제되어서는 아니됨
위 사항을 위해 다수의 interface로 분리 및 해당 interface에 클라이언트 코드가 의존하도록 함. 이로서 서로 다른 클라이언트 코드가 서로에 대해 독립적이 되도록 함. | |
상위 수준의 모듈이 하위 수준의 모듈에 의존하지 말도록
이들 두 모듈 모두 추상화에 의존하도록
참고 : inversion이란 어휘는 구조적 분석 설계 등의 전통적 방법에서 정책이 구체적인 것에 의존하는 경향이 있어, 이들 의존 관계를 역전(inversion) 시킨다는 뜻 |
Conclusion
•
변화에 능동적으로 대처하는 application design의 핵심 원칙을 제시
•
Agile 탄생 이전부터, OOD 기반의 다양한 practice를 통해 숙성, 추출된 원칙들.
•
GOF에 나열된 여러 Design Pattern의 기반이 되는 설계 철학.
References
•
Agile Principles, Patterns, and Practices. Martine C. Robert, Martin Micah