티스토리 뷰
이 글은 "실용주의 프로그래머" 도서를 읽고 내용과 느낌을 정리한 글입니다 :)
결합도 줄이기
- 코드의 의존성 증가는 변화가 코드에 미치는 영향을 크게 만들기 때문에 문제가 된다.
- 의존 관계가 큰 경우 다음과 같은 징후가 발견된다.
: 단위 테스트를 링크하기 위한 명령어가 테스트 프로그램 자체보다 긴 대규모 c 혹은 c++ 프로젝트
: 한 모듈의 간단한 수정이 이와 관계없는 모듈을 통해 시스템 전역에 퍼저나가는 경우
: 개발자가 수정한 부분이 시스템에 어떤 영향을 미칠지 몰라 코드의 수정을 두려워하는 경우
디미터 함수 법칙
- 디미터 함수 법칙은 프로그램에서 모듈간 결합도를 최소화하려 시도한다.
- 디미터 법칙은 코드를 더 적응성 있고 강하게 만들어 주지만 '주계약자'로서의 대가를 치러야 한다. 즉, 주계약자는 모든 하부 계약자를 직접 관리하고, 이들에게 일을 위임해주어야 한다. 이는 위임 메서드 들을 만들어야 함을 의미하는데 이러한 메서드는 성능 저하와 메모리 과부하 같은 문제를 야기할 수 있다. (이는 어떤 프로젝트냐에 따라서 고려해야한다.)
세부사항을 코드에서 몰아내라
- 세부사항은 우리의 깔끔한 코드를 어질러 놓는다. 세부사항을 코드에서 몰아내어 코드를 설정 가능하게 만들면 변화에 쉽게 적응할 수 있게 된다.
통합하지 말고 설정하라
- 메타데이터를 이용하여 시스템이 되도록 설정 가능하게 만들어라.
- 메타데이터란, 데이터에 관한 데이터 뿐 아니라 애플리케이션을 기술하는 모든 데이터이다.
: 데이터베이스 스키마, 데이터 디렉터리 뿐만 아니라 런타임에 접근 사용되는 데이터
메타데이터 주도 애플리케이션
- 코드에는 추상화를 메타데이터에는 세부 내용을 기술하면 다음과 같은 이점이 생긴다.
: 설계의 결합도를 줄여 더 유연하고 적응성 있는 프로그램이 된다.
: 세부사항을 코드 밖으로 몰아냄으로써 강하고 추상적인 디자인을 만들 수 있다.
: 애플리케이션을 커스터마이징하기 위해 다시 컴파일할 필요가 없다.
: 메타데이터는 범용 프로그래밍 언어보다 문제 도메인에 가까운 방식으로 표현될 수 있다.
: 동일한 애플리케이션 엔진과 상이한 메타데이터를 이용해 여러 다른 프로젝트를 진행할 수 있게 된다.
시간적 결합(temporal coupling)
- 예를들어 a 메서드는 b 메서드 보다 먼저 호출해야 한다와 같은 시간적 결합은 유연하지 못하게 만든다.
- 우리는 동시성을 허용할 필요가 있고, 시간이나 순서에 따른 의존성 결합을 끊는 방법을 생각할 필요가 있다.
- 위의 결합을 끊는다면 유연성, 작업흐름 분석, 아키텍처, 설계, 배포와 같은 개발의 여러 측면에서 시간 관련된 모든 의존성도 줄일 수 있다.
작업흐름 분석을 통해 동시성을 개선하라.
- 사용자들의 작업흐름을 모델화 하고 분석하면, 동시성을 개선할 수 있다. (일 처리의 순서를 효율적이게)
언제나 동시성을 고려하여 설계하라.
- 동시성과 시간 순서에 따른 의존성을 고려하는 것은 더 깔끔한 인터페이스를 설계하는 방향으로 이끌어준다.
잘 정의된 모듈은 단 하나의 책임만 가진다.
- 우리는 프로그램을 커다란 하나의 덩어리로 짜지 말고, 나눠서 정복하는 방법을 써서 여러 모듈로 나누어 짜야 한다고 배웠다.
- 여러 모듈로 나눈 다음에 오는 문제는 다음과 같다.
: 런타임에 객체들이 어떻게 서로 이야기하게 만들어야 하나?
: 모듈 사이의 논리적 의존성은 어떻게 관리해야 하나?
: 다른 객체들의 상태 변화를 어떻게 동기화해야 할까?
출판/구독 패턴
- 출판/구독 패턴을 이용하면, 객체들 사이의 결합을 최소화할 수 있다. 이벤트 전송자는 수신자에 대해 아무런 지식을 가질 필요가 없다.
- 단, 모든 이벤트를 루틴 하나에 몰아넣는 일은 객체 캡슐화에 위배되기 때문에 나쁘다. 이는 하나의 루틴이 여러 객체들 사이의 상호작용에 대한 상세한 지식을 지니게 되어 결합도도 증가된다.
- 즉, 객체가 자기가 필요한 이벤트들만 구독해서 받아보고 필요하지 않은 이벤트들은 받아오지 않도록 해야 한다.
- 그럼에도 불구하고, 출판자와 구독자 사이에는 서로에 대한 약간의 지식이 남아있다.(공통의 인터페이스 정의와 호출 방식에 대해 동의하고 있어야한다는 것) 이는 아래쪽의 칠판 시스템을 이용하여 해결할 수 있다.
MVC 패턴
- 모델과 뷰/컨트롤러를 분리하면 적은 비용으로 큰 유연성을 얻게 된다.
칠판 시스템을 사용해 작업흐름을 조율하라.
- 칠판 시스템을 이용하면, 지식의 소비자와 생산자들이 익명으로 그리고 비동기적으로 데이터를 주고받는 공간이 생긴다. 그 덕분에 객체들 사이의 결합을 완전히 끊을 수 있다.
- 칠판 시스템은 원래 음성 인식, 지식 기반 추론 시스템 등등 해결해야 할 문제의 규모가 크고 복잡한 인공 지능 애플리케이션에서 사용할 목적으로 발명되었다.
- JavaSpaces나 T Spaces 같은 분산 칠판 유형의 시스템들은 키/값 쌍의 모델에 기반을 두고 있다. 이 시스템을 이용하면, 객체 전체를 칠판에 저장한 후 필드의 부분일치(템플릿, 와일드카드 등을 통한) 또는 유형별 검색을 통해 다시 가져올 수 있다.
- JavaSpaces 중심 기능 : 읽기, 쓰기, 가져오기, 알리기
칠판 정리하기
- 규모가 클 경우, 칠판이 난잡해지므로 칠판을 여러 구획으로 나누고 어떤 방식으로든 자료를 정리하기 시작하는 것이다.
- 예를들어, 평면적인 지대, 관심 모임, 트리구조 등등을 채택
'Book > 실용주의 프로그래머' 카테고리의 다른 글
7장. 프로젝트 전에 (0) | 2018.09.29 |
---|---|
6장. 코딩하는 동안 해야 할 일들 (0) | 2018.09.29 |
4장. 실용주의 편집증 (0) | 2018.09.29 |
3장. 기본적인 도구 (0) | 2018.09.18 |
2장. 실용주의 접근법 (0) | 2018.09.14 |