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

조예진·2022년 5월 21일
0
  • 2022. 05. 21(토)
  • 5장. 구부러지거나 부러지거나

  • 변화에 유연한 코드를 작성해야 한다. 이를 위해 결합도를 낮추는 게 좋다.
  • 결합도를 낮추기 위해 디미터 함수 법칙을 지키거나, 시간적 결합을 끊기 위해 배고픈 소비자 모델을 사용하거나, 설정 옵션을 코드 밖으로 빼내기 위해 메타데이터를 사용할 수도 있다.

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

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

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

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

  • 자기 자신의 메서드
  • 메서드로 넘어온 인자의 메서드
  • 자신이 생성한 객체의 메서드
  • 직접 포함하고 있는 객체의 메서드

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

27. 메타프로그래밍

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

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

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

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

28. 시간적 결합

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

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

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

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

profile
https://oooooroblog.com 으로 이사갔어요

0개의 댓글