Table of Contents
SOLID 원칙 이해
SOLID 원칙은 개발자가 유지, 확장 및 테스트를 쉽게 만드는 시스템을 만드는 데 도움이되는 5 가지 목표 지향적 디자인 가이드라인입니다. 그들은 2000 년 초에 Robert C. Martin에 의해 도입되었으며 현대 소프트웨어 아키텍처의 코너스톤이되었습니다. 각 원칙은 소프트웨어 디자인의 특정 측면을 요구합니다.
- 단일 책임 원칙(SRP): 클래스는 하나의 이유가 있어야 하며, 이는 단일 기능에 대해 책임야 합니다.
- Open/Closed Principle (OCP): Classes는 확장을 위해 열려야 하며 수정을 위해 닫아야 합니다. 기존 코드를 변경하지 않고 새로운 행동을 추가할 수 있습니다.
- Liskov 대용법 (LSP): 서브타입은 시스템의 파괴 없이 기본형을 위해 하위식이 있어야 한다.
- Interface Segregation Principle (ISP): 클라이언트는 사용되지 않는 인터페이스에 따라 강제하지 않아야 한다; 큰, 다목적 인터페이스보다 많은 작고 특정 인터페이스를 가지고 있다.
- Dependency Inversion Principle (DIP): 고수준 모듈은 저수준 단위에 의존하지 않아야 합니다; 둘 다 추상에 달려야 합니다. Abstraction는 세부사항에 의존하지 않아야 합니다 — 세부사항은 요약에 달려야 합니다.
소프트웨어 아키텍처 시각화의 UML 역할
통합 모델링 언어 (UML)은 시각화 시스템 설계에 대한 표준화 된 표기를 제공합니다. 다이어그램은 개발자, 건축가 및 이해 관계자 중 공유 언어 역할을하며 복잡한 구조를 쉽게 의사소통합니다. SOLID-compliant 아키텍처에 적용 할 때 UML 다이어그램은 설계가 원칙과 강조 영역에 어떻게 준수하는지 알 수 있습니다.
UML에는 14 다이어그램 유형이 포함되어 있지만 SOLID 시각화에 가장 관련한 것은 클래스 다이어그램, 구성 요소 다이어그램, 시퀀스 다이어그램 및 패키지 다이어그램입니다. 각 다이어그램 유형은 원칙의 다른 측면을 강조 할 수 있습니다. 예를 들어, 클래스 다이어그램은 클래스 리서치 및 인터페이스를 보여줍니다. 구성 요소 다이어그램은 의존도 방향과 확장성 점을 강조합니다.
UML 다이어그램을 각 SOLID 원칙으로 매핑
단일 책임 원리 및 클래스 다이어그램
클래스 다이어그램은 SRP 준수를 검증하는 데 이상적입니다. 잘 설계 된 클래스 다이어그램은 속성과 방법의 명확하고 집중된 세트를 가진 각 클래스를 보여줍니다. 클래스가 여러 책임이있는 경우 다이어그램의 상자는 관련 작업을 포함 할 것입니다. SRP 위반의 빨간색 플래그.
예를 들어, `InvoiceManager`라는 클래스는 송장 계산과 이메일 전송을 모두 처리하는 송장 SRP. 클래스 다이어그램은 `calculateTotal()`와 `sendEmail()` 같은 박스에 같은 메서드를 보여준다. `InvoiceCalculator`와 `EmailService`로 클래스를 나눌 필요가 있다. 표시된 책임은 시각적으로 팀의 위반을 조기에 공격하는 데 도움이 된다.
Open/Closed 원리 및 구성 요소 다이어그램
구성 요소 다이어그램은 구성 요소 (예, 모듈, 서브 시스템)가 인터페이스를 통해 연결되는 방법을 보여주는 시스템의 고도 구조를 설명합니다. OCP에 부착하려면 구성 요소는 기존의 하나 수정 없이 새로운 구현을 허용하면서 고정 인터페이스를 노출해야합니다.
구성 요소 다이어그램에서 제공 및 필요한 인터페이스를 사용하여이를 표시 할 수 있습니다. 예를 들어 'PaymentProcessor' 구성 요소는 'Payment` 인터페이스를 정의 할 수 있습니다. 새로운 지불 방법 (신용 카드, PayPal)은 인터페이스를 구현하는 별도의 구성 요소로 추가됩니다. 다이어그램은 코어 프로세서가 변경할 필요가 없다는 것을 명확하게합니다. 그것은 추상에 달려 있습니다.
Liskov 대용법 및 Inheritance Hierarchies
상속 관계와 클래스 다이어그램은 직접 LSP를 테스트합니다. 예상 행동을 위반하는 방법에 하위 클래스의 기본 클래스 방법 인 경우, hierarchy는 의심합니다. UML은 컨트랙트 (예 : 노트 또는 OCL - Object Constraint Language)를 사용하여 미리 조건, 자세, 및 비동기 모델을 허용합니다.
LSP의 경우, LSP의 경우, LSP의 경우, LSP의 경우, LSP의 경우, LSP의 경우, LSP의 경우, 'Rectangle`의 계약에 따라 'height`를 설정할 수 있습니다. 다이어그램은 'Square`가 true로 하위stitutable가 아니라는 것을 보여주어야 합니다. 이것을 수정하려면, 'Rectangle`과 `Square`의 구현과 공통 `Shape` 인터페이스를 사용할 수 있습니다. 클래스 다이어그램은 그 중 아무런 상속을 표시하지 않습니다.
공용영역 분리 원리 및 공용영역 도표
UML은 인터페이스 박스를 명시적으로 사용할 수 있습니다 (<
예를 들어, `MultiFunctionPrinter` 인터페이스와 `print()`, `scan()`, `fax()`로 나뉘어 `Printable`, `Scannable`, `Faxable`로 나눕니다. 클래스 다이어그램은 `BasicPrinter`를 구현하는 것만으로 `Printable`를 구현합니다. `AdvancedPrinter`는 세 가지를 구현합니다. 이 접근은 인터페이스를 유지하고 강제로 클라이언트를 방지하여 작업에 의존할 수 있습니다.
종속력과 종속력
두 가지 클래스 다이어그램 및 패키지 다이어그램은 DIP 준수를 설명 할 수 있습니다. DIP는 높은 수준의 모듈 (예 : 비즈니스 논리)가 저수준 모듈 (예 : 데이터베이스 드라이버)에 따라 달라지지 않아야합니다. 대신 두 가지는 추상 (인터페이스 또는 추상 클래스)에 따라 다릅니다.
패키지 의존도 다이어그램에서, 당신은 종속의 방향을 보여줄 수 있습니다. 저수준 패키지에 직접 높은 수준의 패키지 포인트가 있다면, DIP 위반의 다이어그램 경고. 이 솔루션은 높은 수준의 패키지에서 요약 (interface)를 도입하는 것입니다, 그 인터페이스에 따라 낮은 수준의 패키지. 업데이트 된 다이어그램은 역류 의존성을 보여줍니다 - SOLID 준수의 명확한 기호.
SOLID 아키텍처를 위한 UML 다이어그램 만들기
이 가이드라인을 따라 깨끗한 UML 다이어그램을 생성하고, SOLID 원칙을 강화하는 것이 좋습니다.
- ] 스테레오타입과 노트를 사용:] <
>`, `< ]>`, `< ]>` 스테레오타입을 적용한다. 디자인 결정에 대해 설명하는 메모를 추가하면, 왜 클래스가 하나의 책임이 있다. - Keep 다이어그램 집중: 단일 다이어그램은 하나의 원리 또는 관련 원칙의 작은 집합을 지정해야 합니다. 각 클래스를 하나의 거대 다이어그램으로 cramming 피하십시오.
- 디지털은 관련 관계:]쇼 상속, 협회, 집계, 그리고 그 문제에 대한 의존도. 관련 화살표가 SOLID 준수를 과부하.
- 높은 조명 위반:다른 색상 또는 다shed 라인은 문제 관계에 표시. 예를 들어, 높은 수준의 낮은 수준 코드에서 빨간색 의존도가 DIP 위반을 플래그 수 있습니다.
- :] SOLID를 충족하기 위해 디자인을 재구성하여 다이어그램을 업데이트합니다. UML은 생활의 예술적 사실입니다. 코드와 동반자로 치료하는 것은 한 번 스케치가 아닙니다.
일반적인 Pitfalls 및 Them을 방지하는 방법
경험 많은 개발자는 SOLID 아키텍처를 설계하기 위해 UML을 사용할 때 함정으로 떨어질 수 있습니다. 다음은 종종 실수와 측면에 대한 방법입니다.
- 초기:] 너무 많은 인터페이스 또는 클래스로 시작 YAGNI (You Aren't Gonna Need It). 간단한 클래스 다이어그램과 시작, 그 후 다시 공장에 따라 일반적으로 필요한 경우, 초록을 추가.
- UML 표기법: 미수싱 화살표 타입(예: 통용 화살표가 정확하다)가 잘못 해석될 수 있는 일반화 화살표를 사용하여. UML 2.5 사양 기본을 연구하는 것은 주변을 피하기 위해. OOMG UML 사양은 정의 참조입니다.
- 순서도에서 LSP를 무시: Sequence diagrams show runtime interactives. 하위 클래스 객체가 기본 클래스 객체를 대용하고, 상호 작용이 예기치 않게 동작하는 경우, LSP는 끊어집니다. 하위 클래스 인스턴스를 가진 유효성 검사.
- Neglecting Dependency direction: DIP는 의존도 방향에 관한 것입니다. 패키지 다이어그램에서 항상 클라이언트에서 서버로 화살표를 그릴 수 있습니다. 만약 사이클이나 화살표가 잘못된 방법을 지적하면, 추상적을 재구성합니다.
- Making diagrams 너무 상세: 각 getter와 setter clutters를 보여주는 클래스 다이어그램. SOLID 원칙을 시행하는 공공 인터페이스 및 키 관계에 초점을 맞추고 있습니다.
UML 다이어그램 만들기 도구
여러 도구는 코드와 동기화 된 UML 다이어그램을 만들 수 있습니다. 워크플로우에 맞는 것을 선택하세요:
- PlantUML: 버전 컨트롤과 통합되는 텍스트 기반 다이어그램 도구. 일반 텍스트 설명을 작성하고 다이어그램을 자동으로 생성합니다. 코드로 다이어그램을 원하는 팀에 이상적입니다. Learn More at PlantUML].
- Draw.io (diagrams.net): 무료, 웹 기반 다이어그램 편집기. UML 스텐실 및 쉬운 수출 지원. 협업 화이트 보드에 좋은.
- Lucidchart: UML 템플릿과 실시간 협업을 가진 유료 플랫폼. Confluence와 Jira와의 통합을 제공합니다.
- Modelio:] UML 및 BPMN을 지원하는 오픈 소스 모델링 도구. 클래스 다이어그램과 역 엔지니어링 기존 코드에서 코드를 생성할 수 있습니다.
- IntelliJ IDEA Ultimate: 클래스, 패키지, 의존도 다이어그램 기능 포함. 라이브 동기화에 대한 코드베이스와 직접 작동.
SOLID 원칙과 UML 통합의 더 깊은 이해를 위해, 당신은 에 로버트 C. Martin의 원본 쓰기를 참조 할 수 있습니다 OOD의 원리 (PDF)[ 및 에 Wikipedia 기사 ].
관련 기사
UML 다이어그램은 개발자가 검사, 토론 및 개선 할 수있는 구체적인 시각적 모델로 요약 SOLID 원칙을 변환합니다. 각각의 원리를 SRP 및 ISP, OCP 및 DIP 용 구성 요소 다이어그램 및 LSP에 대한 상속 계층 구조에 매핑하여 조직이 유연하고 유지 보수가 용이하며 확장 할 수 있음을 체계적으로 검증 할 수 있습니다.
핵심은 UML을 국화 아트 퍼펙트로 사용하지만 코드를 진화하는 생활 도구로 사용하도록 합니다. 자동화된 다이어그램 생성 및 일반 코드 리뷰와 결합된 UML은 시간의 테스트를 거둔 SOLID-compliant 시스템 구축에서 강력한 ally된다.