데이터와 기능에 대한 접근을 제한하는 캡슐화에 초점을 맞춰 불변속성이 지역에만 영향을 주게 만드는 데 중점.
6.1 getter와 setter 제거하기
- 객체의 필드에 대한 getter가 존재하는 순간 캡슐화를 해제하고 불변속성을 전역적으로 만들게 된다. setter도 마찬가지
- 필드를 비공개로 하는 것의 가장 큰 장점은 그렇게 하는 것이 push-based 아키텍처를 장려하기 때문
- 데이터를 가져오는 대신 인자로 데이터를 전달한다.
- 모든 클래스가 자신의 기능을 가지고 있으며, 코드는 그 효용에 따라 분산된다.
[디미터 법칙(Law of Demeter)](https://en.wikipedia.org/wiki/Law_of_Demeter)
에서 유래했다.
https://github.com/FiveLinesofCodeStudy/2D-Puzzle-Compose/commit/73c66dc8cba79ceeeaddd42f65f59358e9b2b193
6.2 간단한 데이터 캡슐화하기
- 코드에는 공통 접두사나 접미사가 있는 메서드나 변수가 없어야 한다.
- SRP에서 파생됨
- 2D 퍼즐 예제에서
playerx
,playery
,drawPlayer
Player 클래스로 묶기
https://github.com/FiveLinesofCodeStudy/2D-Puzzle-Compose/commit/0f2a12259c7d0ac7b8c5e773cd1ab28126d032d9
6.3 복잡한 데이터 캡슐화
- 전역변수로 사용되고 있던 변수들 캡슐화해서 class안에 넣기
https://github.com/FiveLinesofCodeStudy/2D-Puzzle-Compose/commit/536f83e8908ecc98baea293dc58c1c5dfba40872
6.4 순서에 존재하는 불변속성 제거하기
- 6.3내용에 조금 들어가긴 했는데, 객체 생성 시 호출할 수 있는 초기화 함수를 이용해 리팩터링 수행
- 다른 메서드보다 먼저 호출해야하는 불변속성을 제거!
- 마지막으로 실행되어야 하는 메서드에 데이터 캡슐화를 적용한다.
- 생성자가 첫 번째 메서드를 호출하도록 한다.
- 두 메서드의 인자가 연결되어 있으면 이러한 인자를 필드로 만들고 메서드에서 제거한다.
6.5 열거형을 제거하는 또 다른 방법
https://github.com/FiveLinesofCodeStudy/2D-Puzzle-Compose/commit/4e66e072f74f9d13021f6372495bea5c3133c3ca