Pragmatic#05 구부러지거나 부러지거나

2022. 05. 21(토) 5장. 구부러지거나 부러지거나

2022-05-21에 씀


26. 결합도 줄이기와 디미터 법칙

코드를 세포(모듈)로 구성하고, 이들 간의 상호작용을 제한하라. 그러면 한 모듈이 변경되거나 교체된다 하더라도 다른 모듈들은 변경 없이 수행될 수 있을 것이다. p227

위계구조를 헤집고 다니지 말고, 필요한 정보는 직접 물어보도록 한다. p229

디미터 함수 법칙: 프로그램의 모듈 간 결합도를 최소화하려는 시도. 한 객체가 제공하는 메서드에 접근하기 위해 다른 객체를 통하는 것을 허용하지 않는다. 모든 메서드는 다음에 해당되는 것만 호출해야 한다.

이 법칙은 클래스의 응답집합(메서드가 직접 호출하는 함수의 수)을 줄여 에러 가능성을 줄일 수 있다. 그러나 요청을 전달하는 역할만 하는 메서드를 많이 만들어야 하기 때문에, 이로 인해 성능 저하나 메모리 과부하와 같은 문제가 일어날 수 있다. 어쩌면 성능향상을 위해서 디미터 법칙을 어기고 객체의 결합도를 높여야 할 수도 있다. 객체가 서로 결합되어 있다는 것을 잘 알고 있다면 괜찮은 설계라고 할 수 있다.

27. 메타프로그래밍

메타데이터를 이용하여 반환 매개 변수, 사용자 선호사항, 설치 디렉터리와 같은 애플리케이션 설정 옵션을 기술하라. (…) 메타데이터는 애플리케이션을 기술하는 모든 데이터다. p236

우리의 목표는 선언적으로 생각하는 것이고, 이로써 더 동적이고 적응가능한 프로그램을 만드는 것이다. 이를 위해서 다음의 일반 규칙을 따른다. 일반적 경우에 대해서 프로그램을 만들고, 특별한 것들은 컴파일된 코드 밖 어딘가에 내놓는다. p237

가능한 마지막 순간까지 세부 정의를 피하고, 세부사항을 소프트하게, 변화하기 쉽게 남겨 두라. p238

코드로는 일반적인 상황에 대한 프로그램을 작성하고, 자주 변경되는 비즈니스 로직이나 정책이 다양한 경우에는 그 정보를 메타데이터로 작성할 수 있다. 그러면 코드의 변경을 최소화하면서 다양한 상황에 대해 대응할 수 있다. 설정 메타데이터는 일반 텍스트로 나타내는 게 좋다.

28. 시간적 결합

어떤 작업은 특정 작업이 수행된 다음에야 실행될 수 있다. 이런 관계를 시간적 결합이라고 한다. 시간적 결합을 잘 파악하면 병렬적으로 실행될 수 있는 작업을 찾을 수 있다. 의존적이지 않은 작업을 병렬적으로 작업해서 최적화할 수 있다.

배고픈 소비자 모델: 여러 개의 독립적인 소비자 작업과 중앙집중식 작업 큐를 사용한다. 소비자 작업은 큐에서 작업을 가져가서 처리한다. 일을 마치면 다시 큐에서 작업을 가져가 처리한다. 소비자 작업은 여러 개가 있기 때문에, 그 중 하나가 잘못되더라도 큐에 들어오는 일은 다른 소비자 작업들이 처리해 줄 수 있다. 이렇게 시간적 결합을 끊을 수 있다.

호출될 가능성이 있는 모든 시간에 언제나 객체가 유효한 상태에 있도록 만들어야 한다. 이 문제는 생성자와 초기화 루틴을 별개로 정의하는 클래스에서 종종 나타난다. p249~250

Tip 41. 언제나 동시성을 고려해 설계해라.

프로필 사진

조예진

이전 포스트
Pragmatic#04 실용주의 편집증
다음 포스트
Pragmatic#06 코딩하는 동안 해야 할 일들