6장 - 데이터 보호
6.1 getter 없이 캡슐화하기
📌 Boolean이 아닌 필드에 setter, getter 사용하지 말기
Coupling (결합)
- 서로 상호작용하는 시스템들간의 의존성
Tight Coupling(긴밀한 결합)
- 강하게 결합된 객체는 다른 객체에 대한 많은 정보를 필요로 하고 보통 두 객체간의 인터페이스들에게 서로 높은 의존성을 가지고 있음. 하나의 객체를 변경하는 것은 많은 다른 객체들의 변경을 요구함.
Loose Coupling(느슨한 결합)
- 하나의 컴포넌트의 변경이 다른 컴포넌트들의 변경을 요구하는 위험을 줄이는 것을 목적으로 함. 컴포넌트간의 내부 의존성을 줄이는 것.
👍🏻 푸시 기반 아키텍처
- 가능한 한 데이터에 가깝게 연산을 이관
- 데이터 가져오는 대신 인자로 데이터 전달
👎🏻 풀 기반 아키텍처
- 데이터를 가져와 중앙에서 연산 수행
- 기능 수행하는 메서드 없이 ‘수동적인’ 데이터 클래스와 여기저기서 데이터를 혼합해 모든 작업 수행하는 소수의 ‘관리자’클래스로 이어짐.
- 데이터와 관리자 사이함 데이터 클래스 간에도 긴밀한 결합 가져옴.
Law of Demeter (디미터 법칙 or 데메테르 법칙)
- 최소한의 지식 원칙 (The Principle of Least Knowledge)
- 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다…
6.2 간단한 데이터 캡슐화하기
📌 코드에 공통 접두사나 접미사가 있는 메서드나 변수가 없어야 함.
- 접두사, 접미사를 붙이면 코드를 더 읽기 쉽게 만들 수 있지만 여러 요소가 동일한 접사를 가질 때는 그 요소들의 긴밀성을 나타내기도 함.
- 클래스를 사용해서 메서드와 변수를 그룹화하면 외부 인터페이스를 완전하게 제어할 수 있음.
- 또한 도우미 메서드를 숨겨 전역 범위를 오염시키지 않을 수 있음.
단일 책임 원칙
- 단일 책임 = 특정 주제의 기능 집합
- 단일 책임으로 설계하려면 원칙 & 개요 필요
- 단일 책임 원칙 준수 유무에 따른 가장 큰 특징 기준 척도: 기능 변경이 일어났을 때의 파급 효과
데이터 캡슐화
- 변수와 메서드를 캡슐화하여 접근할 수 있는 지점을 제한하고 구조를 명확하게 만들 수 있음.
- 메서드를 캡슐화하면 이름을 단순하게 만들고 응집력을 더 명확하게 하는 데 도움됨.
- 범위 제한하면 클래스 내의 메서드만 데이터를 수정할 수 있으므로 이 메서드들만 그 속성에 영향을 줄 수 있게 됨. -> 불변속성 검증해야 할 경우 클래스 내부의 코드만 확인하면 됨.