R.C. Martin’s Software design principles (SOLID)
원칙 | 설명 | |
SRP | The Single-Responsibility Principle | A class should have one, and only one, reason to change 클래스는 하나의 (오직 하나의) 변경의 이유를 가져야 한다 -> 변경에 영향을 적게 받아야 함 - Responsibility (책임) . a contract or obligation of a class . reason to change (변경의 이유) - Separate coupled responsibilites into separate classes 결합된 책임들은 분리된 클래스로 분리하라 |
OCP | The Open-Closed Principle |
Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification Software entities들은 확장을 위해 Open되어야 하고 수정을 위해서는 Closed 되어야 함 - 기존의 코드를 변경하지 않고 (Closed) 기능을 수정하거나 추가할 수 있도록 (Open) 설계 되어야 함 . Open for extension . Closed for modification - Abstraction is the Key - 변화가 발생할 것에 대한 전략이 필요함 . 변화가 확실한 경우에만 추상화 적용 . 처음에는 변화지 않을것이라 생각하고 개발 -> 변화가 발생하면 그때 추상화 적용 |
LSP | The Liskov Substitution Principle | Subtypes must be substitutable for their base types Subtype은 base type을 대체할 수 있다 - Subtyping : interface inheritance (IS_A relationship) - Implementation Inheritance * Inheritance를 사용할 때에는 항상 조심해야 함 . 객체간의 결합 등을 통해서 재사용에 활용 (Composition 등) |
ISP | The Interface Segregation Principle | Client should not be forced to depend on methods they do not use 클라이언트는 그들이 사용하지 않는 method에 대한 dependency를 가지지 않아야 함 - Interface를 너무 크게 만들면 내가 사용하지 않는 기능을 사용하게 됨 -> Interface를 기능별로 나눠서 만들어 줘야함 |
DIP | The Dependency Inversion Principle |
High-level modules should not depend on low-level modules. Both should depend on abstractions High-level modules은 low-level modules에 의존적이지 않아야 하며, 둘 다는 추상화에 의존적이어야 함 - High-level resource (= Interface and abstract classes) Low-level resource (=Concrete classes) - Dependency의 방향 뿐만 아니라 ownership의 방향도 기존의 구조적 설계방식과 비교해서 역전됨 - Interface와 Implementation을 분리 |
Design principles 은
- Dependency 관리를 도와줌
- 유지보수성(maintainability), 유연성(flexibility), 견고성(robustness) 및 재사용성(reusability)이 향상됨
- 추상화가 중요함
'Development (Python, Django, C..)' 카테고리의 다른 글
[Python] (OLD) Chart 생성 - matplotlib 활용 - 2 (0) | 2021.12.08 |
---|---|
[Python] (OLD) Chart 생성 - matplotlib 활용 - 1 (0) | 2021.12.08 |
[vscode] 내부망 서버의 remote server 접속 연결 (0) | 2020.11.03 |
[HANA] Monitoring 시스템 - 분석기능 보완 (LogAnalyzer) (0) | 2020.08.12 |
[Django] Migration 파일 제거 (0) | 2020.08.11 |