변수를 private으로 하는 이유
- 다른 사람들이 변수에 의존하지 않게 만들기위해
- 최초 개발의도에 맞지않게 변수가 다른 개발자에의해 수정될 수 있다.
그렇다면 왜 getter와 setter는 public으로 공개해 외부에 노출하는걸까?
→ 내부 구조를 노출하지않고, 함수를 통해 객체를 다루기위함
디미터의 법칙
- 모듈은 자신이 조작하는 객체의 내부 구조를 몰라야한다.
- “Class C의 Method F는 다음과 같은 객체의 메서드만 호출해야한다.”
- 클래스 C
- F가 생성한 객체
- F 인수로 넘어온 객체
- C 인스턴스 변수에 저장된 객체
- 쉽게말한 친구들은 가까이하고 낯선이는 경계하자는 이야기.
기차 충돌
final String outputDir = ctxt.getOption().getScratchDir().getAbsolutePath();
여러개의 객체가 한 줄로 이어진 기차처럼 보여 기차 충돌이라한다.
조잡해보이는 방식으로 피하는게 좋다.
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
위와 같이 리팩토링을 하자.
자료 전달 객체 (Data Transfer Object)
자료 구조체의 전형적인 형태는 공개 변수만 있고 함수는 없는 상태
이러한 자료구조체를 때로는 자료 전달 객체 DTO 라고 한다.
가공되지 않은 정보를 전달하기위해 사용되는 객체.
- 활성 레코드
- DTO만의 특수한 형태
- 공개 변수가 있거나, 비공개 변수에 조회/설정 함수 와 더불어 save, find같은 함수도 제공함.
- 이러한 비지니스 규칙 메서드가 추가된 상태는 바람직하지 않다.
- 로버트 마틴은 이러한 활성 레코드를 잡종 구조라고 말한다.
결론
객체는 동작을 공개하고 자료를 숨긴다. → 함수를 공개하고 변수를 숨긴다.
- 동작을 추가하기는 쉽지만, 기존 함수에 새 자료 구조를 추가하기는 어렵다.
따라서,
어떠한 시스템을 구현할 때,
새로운 자료타입을 추가하는 유연성이 필요하다면 객체지향적 코드가 적합.
새로운 동작의 추가가 필요하다면 절차적인 코드가 적합.