[CleanCode] 시스템
시스템
시스템 제작과 시스템 사용을 분리하라
- 시스템 생성과 시스템 사용을 분리라는 한 가지 방법으로 생산과 관련한 코드는 모두 main이나 main이 호출하는 모듈로 옮기고, 애플리케이션은 생성한 객체를 사용한다.
- 사용과 제작을 분리하는 강력한 메커니즘 하나가
의존성 주입
이다.- 스프링 프레임워크는 가장 널리 알려진 DI컨테이너를 제공한다. 객체 사이 의존성은 XML 파일에 정의한다. 그리고 자바 코드에서는 이름으로 특정한 객체를 요청한다.
- 확장
- 처음부터 올바르게 시스템을 만들 수 있다는 믿음은 미신이다. 대신에 우리는 오늘 주어진 사용자 스토리에 맞춰 시스템을 구현해야 한다. 내일은 새로운 스토리에 맞춰 시스템을 조정하고 확장하면 된다. 이것이 반복적이고 점진적인 애자일 방식의 핵심이다. 테스트 주도 개발 TDD, 리팩토링, (TDD와 리팩터링으로 얻어지는) 깨끗한 코드는 코드 수준에서 시스템을 조정하고 확장하기 쉽게 만든다.
-
용어 정리
- 영속성 : 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.
- 모듈화 : 규모가 큰 것을 여러 개로 나눈 조각, 하나 또는 몇 개의 논리적인 기능을 수행하기 위한 명령어들의 집합, 따라서 독립 프로그램도 하나의 모듈이 될 수 있고, 함수들도 하나의 모듈이 될 수 있다. 독립적인 기능을 갖는 단위(unit),
- 관심사 : 보안, 로깅, 트랜젝션등과 같은 기능들
- 황단 관심사 : 관심사가 한 애플리케이션의 여러부분에 걸쳐 있는 기능
- 관점 : 여러 클레스에 걸친 관심사의 모듈화이다.
-
횡단 괌심사
- 모듈화되고 캡슐화된 방식으로 영속성 방식을 구상한다. 영속성 방식을 구현한 코드가 온갖 객체로 흩어진다. 이런 것을 횡단 관심사라고 한다.
관점 지향 프로그래밍
(AOP)는 횡단 관심사에 대처해 모듈성을 확보하는 일반적인 방법론이다.
- 모듈화되고 캡슐화된 방식으로 영속성 방식을 구상한다. 영속성 방식을 구현한 코드가 온갖 객체로 흩어진다. 이런 것을 횡단 관심사라고 한다.
-
자바에서 사용하는 관점 혹은 관점과 유사한 메커니즘
- 자바 프록시
- 순수 자바 AOP 프레임워크
- AspectJ 관점
-
의사 결정을 최적화하라
- 관심사를 모듈로 분리한 POJO 시스템은 기민함을 제공한다. 이런 기민함 덕택에 최신 정보에 기반해 최선의 시점에 최적의 결정을 내리기가 쉬워진다. 또한 결정의 복잡성도 줄어든다.
-
명백한 가치가 있을 때 표준을 현명하게 사용하라
- 표준을 사용하면 아이디어와 컴포넌트를 재사용하기 쉽고, 적절한 경험을 가진 사람을 구하기 쉬우며, 좋은 아이디어를 캡슐화하기 쉽고, 컴포넌트를 엮기 쉽다. 하지만 때로는 표준을 만드는 시간이 너무 오래 걸려 업계가 기다리지 못한다. 어떤 표준은 원래 표준을 제정한 목적을 잊어버리기도 한다.
-
결론
- 시스템 역시 깨끗해야 한다. 깨끗하지 못한 아키텍처는 도메인 노리를 흐리며 기민성이 떨어뜨린다. 도메인 노리가 흐려지면 제품 품질이 떨어진다. 버그가 숨어들기 쉬워지고, 스토리를 구현하기 어려워지는 탓이다. 기민성이 떨어지면 생산성이 낮아져 TDD가 제공하는 장점이 사라진다.
- 모든 추상화 단계에서 의도는 명확히 표현해야 한다. 그러려면 POJO를 작성하고 관점 혹은 관점과 유사한 메커니즘을 사용해 각 구현 관심사를 분리해야한다.
- 시스템을 설계하든 개별 모듈을 설게하든, 실제로 돌아가는 가장 단순한 수단을 사용해야 한다.
창발성
- 창발적 설계로 깔끔한 코드를 구현하자
- 모든 테스트를 실행하라
- 테스트 케이스를 작성하면 설계 품질이 높아진다.
- 중복을 없애라
- 표현하라
- 좋은 이름을 선택한다.
- 함수와 클래스 크기를 가능한 줄인다.
- 표준 명칭을 사용한다.
- 단위 테스트 케이스를 꼼꼼히 작성한다.
- 클래스와 메서드 수를 최소로 줄여라
- 함수와 클래스 크기를 작게 유지하면서 동시에 시스템 크기도 작게 유지하는데 있다. 하지만 우선순위가 가장 낮다.
- 모든 테스트를 실행하라