[오브젝트] 16일

da__ell·2023년 8월 17일
0

독서 - 오브젝트

목록 보기
16/25
post-thumbnail

p.198 ~ p. 213

6-3. 원칙의 함정

디미터 법칙은 하나의 도트(.)를 강제하는 규칙이 아니다.

디미터의 법칙은 결합도와 관련된 것이고 객체의 내부 구조가 외부로 노출되는 경우로 한정된다.
따라서 하나 이상의 도트를 사용하는 모든 케이스가 위반인 것은 아니다.

결합도와 응집도의 충돌

일반적으로 어떤 객체의 상태를 물어보고 반환된 상태를 기반으로 결정을 내리고 그에 따라 객체의 상태를 변경하는 코드는 묻지말고 시켜라 스타일로 변경해야 한다.

질문하고 판단하고 상태를 변경하는 코드를 객체의 내부로 옮기는 위임 메서드를 추가하는 방법이 있다.
위임 메서드를 통해 객체의 내부 구조를 감춤으로써 협력에 참여하는 객체의 결합도를 낮추고 응집도를 높이는 방법이다.

무작정으로 위 원칙들을 따르게 되면 같은 퍼블릭 인터페이스 안에 적절치 않은 오퍼레이션이 공존하게 되면서 상관 없는 책임들을 한꺼번에 떠안게 되면서 응집도가 낮아진다.

디미터 법칙의 위반 여부는 묻는 대상이 객체인지 자료 구조인지에 따라 다르다. 객체는 내부 구조를 숨겨야하므로 디미터 법칙을 따를 것이 좋지만 자료 구조라면 당연히 내부를 노출해야 하므로 디미터 법칙을 적용할 필요가 없다.

6-4. 명령-쿼리 분리 원칙

어떤 절차를 호출 가능하도록 이름을 부여한 기능 모듈을 루틴(routine)이라고 부른다. 루틴은 다시 프로시저(procedure)와 함수(function)로 구분할 수 있다.

프로시저는 정해진 절차에 따라 내부의 상태를 변경하는 루틴의 한 종류이다. → 부수효과를 발생시키지만 값을 반환 x
함수는 어떤 절차에 따라 필요한 값을 계산해서 반환하는 루틴의 한 종류이다. → 값을 반환하지만 부수 효과 x

명령과 쿼리는 객체의 인터페이스 측면에서 프로시저와 함수를 부르는 또 다른 이름이다.

명령 : 객체의 상태를 수정하는 오퍼레이션 == 프로시저
쿼리 : 객체와 관련된 정보를 반환하는 오퍼레이션 == 함수

어떤 오퍼레이션도 명령인 동시에 쿼리여서는 안된다.

명령-쿼리 분리 원칙을 요약하면 질문이 답변을 수정해서는 안된다는 것이다. 명령은 상태를 변경할 수 있지만 반환해서는 안되고 반대로 쿼리는 객체의 상태를 반환할 수 있지만 상태를 변경해서는 안된다.

반복 일정의 명령과 쿼리 분석하기

명령과 쿼리를 뒤섞으면 실행 결과를 예측하기가 어려워질 수 있다. 겉으로 보기에 쿼리처럼 보이지만 내부적으로 부수효과를 가지는 메서드는 이해하기 어렵고, 잘못 사용하기 쉬우며 버그를 양산한다. → 명령과 쿼리의 명확한 분리 필요.

따라서 퍼블릭 인터페이스를 설계할 때 명령과 쿼리를 분리해야 한다.

명령-쿼리 분리와 참조 투명성

명령과 쿼리를 분리함으로써 참조 투명성의 장점을 제한적으로 누릴 수 있다.

컴퓨터와 수학을 구분하는 가장 큰 특징이 부수효과(side effect)의 유무다. 프로그램에서 부수효과를 발생시키는 두 가지 대표 문법은 대입문과 함수(정확히는 프로시저)다.

이때 등장하는 개념이 참조 투명성이다.
어떤 표현식 e가 있을 때 e의 값으로 e가 나타나는 모든 위치를 교체하더라도 결과가 달라지지 않는 특성을 의미한다.

이를 만족하는 식은 2가지 장점을 가진다.
1. 모든 함수를 이미 알고 있는 하나의 결괏값으로 대체할 수 있기 때문에 식을 쉽게 계산할 수 있다.
2. 모든 곳에서 함수의 결괏값이 동일하기 때문에 식의 순서를 변경하더라도 각 식의 결과는 달라지지 않는다.

profile
daelkdev@gmail.com

0개의 댓글