1. 시스템 제작과 시스템 사용을 분리하라
- 제작은 사용이 아니다.
👉 소프트웨어 시스템은 (애플리테이션 객체를 제작하고 의존성을 서로 '연결' 하는) 준비과정과
(준비 과정 후에 이어지는) 런타임 로직을 분리해야한다.
시작단계 : 관심사 분리
1) Main 분리
: 시스템생성과 시스템 사용을 분리하는 방법
생성과 관련한 코드는 모두 main이나 main 이 호출하는 모듈로 옮기고,
나머지 시스템은 모든 객체가 생성되었고 의존성이 모두 연결되었다고 가정할 때,
main에서 시스템에 필요한 객체를 생성한 후 이를 애플리케이션에 넘겨 사용하도록 한다.
2) 팩토리
ABSTRACT FACTORY 패턴 (추상 팩토리 패턴)
추상 팩토리 패턴은 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용하다. 이 패턴을 사용하여 상황에 알맞은 객체를 생성할 수 있다.
애플리케이션은 객체가 생성되는 구체적인 방법을 모른다.
이는 main에 구현한 팩토리 인터페이스에서 알고 있다.
그렇지만 애플리케이션은 인스턴스가 생성되는 시점을 완벽하게 통제하며,
필요하다면 애플리케이션에서만 사용하는 생성자 인수도 넘길 수 있다.
3) 의존성 주입
: 제어역전기법을 의존성 관리에 적용한 매커니즘이다.
제어 역전에서는 한 객체가 맡은 보조 책임을 새로운 객체에게 넘김으로써 단일 책임원칙을 지킬 수 있게 된다.
의존성 측면에서 인스턴스를 만드는 전담 메커니즘으로 DI 컨테이너를 이용한다.
처음부터 올바르게 시스템을 만들 수는 없다.
오늘은 오늘의 사용자 스토리에 맞춰 시스템을 구현해야한다.
이것이 반복적이고 점진적인 애자일 방법의 핵심이다.
4) 횡단 관심사
: 다른 관심사에 영향을 미치는 프로그램의 애스펙트
특정 관심사를 지원하려면 시스템에서 특정 지점들이 동작하는 방식을 일관성 있게 바꿔야한다.
AOP 프레임워크 는 대상 코드에 영향을 미치지 않는 상태로 동작 방식을 변경한다.
자바에서 사용하는 관점과 유사한 메커니즘 3가지
- 자바 프록시
- 순수 자바 AOP 프레임 워크
- AspectJ 관점 (가장 강력)
자바에서 사용하는 관점
- 테스트 주도 시스템 아키텍처 구축
BDUF(Bog Design Up Front)를 추구할 필요가 없다.
단순하면서도 멋지게 분리된 아키텍처로 소프트웨어 플제글 진행하여 결과물을 빨리 출시한 후
기반 구조를 추가하며 조금씩 확장해가도 괜찮다.
단, 프로젝트를 시작할 때는 일반적인 범위, 목표, 일정, 결과로 내놓을 시스템의 일반적인 구조도 생각해야한다.
최선의 시스템 구조는 각기 POJO (또는 다른) 객체로 구현되는 모듈화된 관심사 영역(도메인) 으로 구성된다.
이렇게 서로 다른 영역은 해당 영역 코드에 최소한의 영향을 미치는 관점이나 유사한 도구를 사용해 통합한다.
이런 구조 역시 코드와 마찬가지로 테스트 주도 기법을 적용할 수 있다.
- 의사결정을 최적화하라
최대한의 정보를 모아 최선의 결정을 내릴 수 있기에, 가능한 마지막 순간까지 결정을 미루는 방법이 최선이다.
성급한 결정은 불충분한 지식으로 내린 결정이다.
- 명백한 가치가 있을 때 표준을 현명하게 사용하라.
어떤 표준은 원래의 표준을 제정한 목적을 잊어버리기도 한다.
반드시 표준을 맞출 필요는 없다고 말하고자 하는 듯 하다.
- 시스템은 도메인 특화 언어가 필요하다
DSL (Domain-Specific Language,도메인 특화 언어) : 특정한 도메인을 적용하는데 특화된 컴퓨터 언어
간단한 스크립트 언어나 표준 언어로 구현한 API 이다.
효과적으로 사용하면 DSL 추상화 수준을 코드 관용구나 디자인 패턴이상으로 끌어올릴 수 있다.
결론
깨끗한 아키텍처로 도메인 논리를 뚜렷하게 하고 기민성(애자일)을 높이자.
각 구현 관심사를 분리하여 모든 추상화 단계에서 의도를 명확히 표현하자.
실제로 돌아가는 가자 단순한 수단을 사용해야한다는 것을 명심하자!
참고문헌 ) 클린코드 : 애자일 소프트웨어 장인 정신
'Study Log > 클린코드' 카테고리의 다른 글
[클린코드] 동시성 : 여러 스레드를 동시에 돌리는 이유와 어려움 (0) | 2021.09.22 |
---|---|
[클린코드] 창발성을 높이는 네가지 설계 규칙 (0) | 2021.09.22 |
[클린코드] 클래스의 기본이 되는 주요 개념과 지향 방향 (0) | 2021.07.23 |
[클린코드] 단위테스트 TDD 법칙 세가지 (0) | 2021.07.23 |
[클린코드] 휴리스틱(heuristics)이란? : 휴리스틱 이론과 휴리스틱 알고리즘 (0) | 2021.07.21 |