반응형
가독성 높이는 습관 - 캡슐화
캡슐화를 처음 배웠을 때
객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉한다.
... 접근지정자를 두어 은닉의 정도를 기술하여 구현한다. - wikipedia
class User {
/* 속성 */
private String name;
private int age;
/* 메서드 */
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
- 속성 : name, age
- 메서드 : getName(), getAge()
- 접근지정자 : private, protected, public
자바빈 규약
- 기본 생성자를 가지고 있으며,
- 모든 멤버가 private으로 선언되어 있고,
- 멤버를 접근하기 위해 Getter, Setter가 public으로 열려있는 클래스를 뜻함
현실
- 두가지 예시모두 user의 나이를 직접가져오므로 캡슐화에 의한 은닉이 수행되지 않음
- 접근제어자만 private로 지정한다고 캡슐화가 지켜지는 것은 아님
/* 자바빈 규약을 따르나 캡슐화를 지키지 않음 */
final static int ADULT_AGE = 19;
final static int MARRIAGEABLE_AGE = 18;
final static int DRIVER_LICENCE_AGE = 18;
if (user.getAge() >= ADULT_AGE)
// ...doSomething
if (user.getAge() >= MARRIAGEABLE_AGE)
// ...doSomething
if (user.getAge() >= DRIVER_LICENCE_AGE)
// ...doSomething
/* 자바빈 규약을 따르지 않고 모든 필드를 열어둠 */
final static int ADULT_AGE = 19;
final static int MARRIAGEABLE_AGE = 18;
final static int DRIVER_LICENCE_AGE = 18;
if (user.age >= ADULT_AGE)
// ...doSomething
if (user.age >= MARRIAGEABLE_AGE)
// ...doSomething
if (user.age >= DRIVER_LICENCE_AGE)
// ...doSomething
Tell, Don't Ask (TDA 원칙)
- 헐리우드 원칙 - Martin Fowler
- https://martinfowler.com/bliki/TellDontAsk.html
bliki: TellDontAsk
a bliki entry for TellDontAsk
martinfowler.com
/* User.java */
class User {
int age;
public boolean isAdult() {
return age >= ADULT_AGE;
}
public boolean isMarriageableAge() {
return age >= MARRIAGEABE_AGE;
}
}
if (user.isAdult())
// ...doSomething
if (user.isMarriageableAge())
// ...doSomething
캡슐화로 얻을 수 있는 것
- 데이터와 그 처리 방법을 숨길 수 있다.
- 비지니스 로직과 그 구현 방법을 외부로부터 보호한다.
- 외부에 대한 영향도가 줄어듬 → 버그 포인트가 줄어듬
주의할 점
basket.getProduct().get(0)
.getProductOption()
.getProductOptionDetail()
.getProductOptionDetailType();
반응형
'cs > java-spring-boot' 카테고리의 다른 글
[Zero-base] 9-8. null (0) | 2022.03.16 |
---|---|
[Zero-base] 9-7. enum (0) | 2022.03.16 |
[Zero-base] 9-5. 이름짓기 (0) | 2022.03.16 |
[Zero-base] 9-4. 왜 좋은 코드를 작성해야할까? (0) | 2022.03.16 |
[Zero-base] 9-3. 레거시 코드 (0) | 2022.03.16 |