반응형
이 내용은 엘레강트 오브젝트
를 읽으면서 정리한 내용을 포함하고 있습니다.
- 객체의 결합
- 객체의 분리
- 연습해보기
- 정리
- 관련해서 참고해볼 내용
객체의 결합
- 객체는 다른 객체들과 의사소통하면서 작업을 지원하고, 다른 객체들에게 도움을 제공한다.
- 결합이 필요한 부분은 다른 누군가가 객체의 서비스를 필요로 하기 때문이다.
- 이렇듯, 객체들이 서로를 필요로 하기 때문에 결합한다. (
coupled
) - 객체들의 수가 수십 개를 넘어가면서부터 객체 사이의 강한 결합도가 심각한 문제가 된다.
- 이러한 결합도 문제는 유지보수성에 영향을 미치게 된다.
객체의 분리
- 애플리케이션 전체를 유지보수 가능하도록 만들기 위해서는 객체를 분리헤야 한다.(
decouple
) - 기술적인 관점에서 객체 분리란 상호작용하는 다른 객체를 수정하지 않고도 해당 객체를 수정할 수 있도록 만든다는 것을 의미한다.
- 가장 훌륭한 도구가 바로
인터페이스
이다.- 인터페이스를 통해서 각각의 경쟁자는 서로 다른 경쟁자를 쉽게 대체할 수 있는데, 이것이 느슨한 결합도(
loose coupling
) 이다.
- 인터페이스를 통해서 각각의 경쟁자는 서로 다른 경쟁자를 쉽게 대체할 수 있는데, 이것이 느슨한 결합도(
연습해보기
- 클래스 안의 모든 퍼블릭 메서드가 인터페이스를 구현하도록 만들어야 한다.
직원의 월급을 담당하는 객체를 통해서 인터페이스 연습을 해보도록 하겠습니다.
월급을 계산하는 행위를 인터페이스로 나타내도록 하겠습니다.
public interface Cash {
Cash multiply(final float factor);
}
계산하는 행위의 대한 세부 구현을 담당하는 객체는 다음과 같습니다.
public class DefaultCash implements Cash {
private final int dollars;
public DefaultCash(final int dlr) {
this.dollars = dlr;
}
@Override
public Cash multiply(final float factor) {
return new DefaultCash((int) (this.dollars * factor));
}
@Override
public String toString() {
return "DefaultCash{" +
"dollars=" + dollars +
'}';
}
}
직원의 월급을 계산하는 부분의 대해서 구현 세부사항의 의존하기 보다는 인터페이스의 의존한다면 다음과 같습니다.
public class Employee {
private Cash salary;
// 비즈니스 로직
}
- 여기서의 핵심은 직원의 월급 계산식은 변경될 수 있기 때문에 확장 포인트를 염두해 두어야 합니다.
- 즉,
Employee
객체 모르게 변경될 수 있도록OCP
를 지켜야 합니다. - 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 변경할 수 있습니다.
정리
- 클래스 안의 변경 가능한 퍼블릭 메서드가 인터페이스를 구현하도록 만들어야 합니다.
관련해서 참고해볼 내용
Spring 환경에서 OCP를 활용한 사례를 참고하고 싶으시면 아래 링크를 확인해보자.
반응형
'독서이야기 > 엘레강트 오브젝트 - 새로운 관점에서 바라본 객체지향' 카테고리의 다른 글
[엘레강트 오브젝트] 2.5 퍼블릭 상수(Public Constant)를 사용하지 마세요 (0) | 2023.03.12 |
---|---|
[엘레강트 오브젝트] 2.4 메서드 이름을 신중하게 선택하세요 (0) | 2023.03.01 |
[엘레강트 오브젝트] 2.2 최소한 뭔가는 캡슐화하세요 (0) | 2023.03.01 |
[엘레강트 오브젝트] 2.1 가능하면 적게 캡슐화하세요 (0) | 2023.03.01 |
[엘레강트 오브젝트] 1.3 생성자에 코드를 넣지 마세요 (0) | 2023.02.19 |
댓글