우테코 프리코스가 끝났다!! 그리고 최종 코딩테스트 합격 기원을 바라며 디스코드 채널에 수많은 스터디 모집글이 올라왔다!!
(다들 열정이 ㄷㄷ...)
최종 코테에 합격할지는 모르겠지만 우테코를 하면서 배운점도 많고 무엇보다도 열정 넘치는 동료들과 함께 공부를 이어나가고 싶어서 처음으로 스터디에 가입해 함께 프리코스 문제 복기 + 다른 기수 문제도 풀고 서로 코드 리뷰도 해주는 시간을 갖기로 했다!!
😱 Getter를 지양하라구요??
코드 리뷰를 하면서 객체지향 생활 체조 원칙 9가지 이야기가 나왔다
1. 한 메서드에 오직 한 단계의 들여 쓰기만 한다.
2. else 예약어를 쓰지 않는다.
3. 모든 원시 값과 문자열을 포장한다.
4. 한 줄에 점을 하나만 찍는다.
5. 줄여 쓰지 않는다. (축약 금지)
6. 모든 엔티티를 작게 유지한다.
7. 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
8. 일급 컬렉션을 쓴다.
9. getter/setter/프로퍼티를 쓰지 않는다.
나에게 어려웠던 원칙을 꼽자면 4번, 8번, 9번이 있다! 🥵
setter를 쓰지 않는 이유는 간단하다. 객체 값을 변경해버리기 때문이다.
변경 지점이 많아지면 그만큼 장애가 발생했을 때 대처하기 힘들다. (변경 지점이 많을수록 side effect가 발생하기 쉽상이다...)
그에 반해 getter는??
단지 객체의 상태 값을 조회하는 용도인데?? 왜 쓰지 말라는거지...?
🤷 1. Getter... 조회 기능만 할까??
1. getter를 통해 계좌에 있는 금액을 확인한다.
2. 계좌 금액에서 이체 할 금액을 뺀다.
3. 만약 계좌 금액이 0보다 작으면 예외가 발생한다.
→ validation 로직이 이상하다. 위의 3가지 과정이 꼭 필요할까?? 계좌 객체에서 validate하면 되지 않을까?
🤔 2. Getter... 조건 검사시 변경에 취약하다.
@Getter
class CardPoint {
private long point;
}
public class method() {
...
public void printMemberShip(CardPoint point){
if(point.getPoint() >= 500000) {
System.out.println("Gold");
} else if (point.getPoint() >= 100000) {
System.out.println("Silver");
} else {
System.out.println("Bronze");
}
}
...
}
위 Cardpoint 객체에서 point가 사라진다면?? 당연히 아래 getter도 컴파일 오류...
🙅♂️ 3. Getter 남용은 디미터 법칙에 위배된다!!
※ 디미터 원칙 : "객체에게 자료를 숨기는 대신 함수를 공개"하도록 하는 것!
→ getter 남용은 객체 자료 값을 드러내고 함수를 지양하게 된다!!
🙂 조건을 검사하지 마라! 결과를 반환하라!
@Getter
class CardPoint {
private long point;
public void calcMembershipGrade(){
if(this.point >= 500000) {
System.out.println("Gold");
} else if (this.point >= 100000) {
System.out.println("Silver");
} else {
System.out.println("Bronze");
}
}
}
public class method() {
...
public void printMemberShip(CardPoint point){
System.out.println(point.calcMembershipGrade());
}
...
}
위 코드 수정해보았다. 이젠 Gettter를 통해 값을 조회하는게 아닌 결과를 반환하게 된다! (객체지향 생활 체조 원칙 3번 원칙에 따라 Gold, Silver, Bronze 원시값도 포장해주면 Best!!)
💡 이런 방법도 있었다니!!
코드 리뷰를 하면서 알게된 getter 지양 방법도 있다!
public class Car implements Comparable<Car> {
...
public boolean isSamePosition(Car other) {
return other.position == this.position;
}
@Override
public int compareTo(Car other) {
return this.position - other.position;
}
...
}
public class Cars {
...
public List<String> findWinners() {
final Car maxPositionCar = findMaxPositionCar();
return findSamePositionCars(maxPositionCar);
}
private Car findMaxPositionCar() {
Car maxPositionCar = cars.stream()
.max(Car::compareTo)
.orElseThrow(() -> new IllegalArgumentException("차량 리스트가 비었습니다."));
}
private List<String> findSamePositionCar(Car maxPositionCar) {
return cars.stream()
.filter(maxPositionCar::isSamePosition)
.map(Car::getName)
.collect(Collectors.toList());
}
}
위와 같이 객체의 상태를 비교해 max 값을 찾거나 isSamePosition을 통해 직접 Position 값을 비교하여 getter를 지양할 수 있다!!
★ 객체의 상태를 꺼내 로직을 처리하도록 하지말고 객체에 메시지를 보내 일을 하도록 하자!
https://tecoble.techcourse.co.kr/post/2020-04-28-ask-instead-of-getter/
getter를 사용하는 대신 객체에 메시지를 보내자
getter는 멤버변수의 값을 호출하는 메소드이고, setter는 멤버변수의 값을 변경시키는 메소드이다. 자바 빈 설계 규약에 따르면 자바 빈 클래스 설계 시, 클래스의 멤버변수의 접근제어자는 private
tecoble.techcourse.co.kr
🙅♀️ 하지만... 무조건 Getter를 지양하라는 뜻은 아니다!!
관련된 블로그 링크를 남겨두겠다! 꼭 읽어보길 바란다!
getter 쓰지 말라고만 하고 가버리면 어떡해요
설명 좀 해주고 가요
velog.io
https://kong-dev.tistory.com/m/226
우리 당당하게 getter 씁시다!
학습을 위해 작성된 포스팅 입니다. 잘못된 내용이 있으면, 지적해주세요! 객체지향을 공부하다 보면, 한번쯤은 맞닥뜨리는 문장이 있다. getter/setter/property를 쓰지 않는다. 객체지향 생활체조 9
kong-dev.tistory.com
https://uhanuu.tistory.com/entry/Getter-%EC%97%86%EC%9D%B4-Test%ED%95%B4%EB%B3%B4%EA%B8%B0
Getter 없이 Test해보기
getter를 지양하라는 의미는 객체의 책임을 더욱 명확하게 하기 위해서 지양하는 것이지 자료구조나 Test에서는 사용하는게 맞다고 생각합니다.getter를 사용했을 때 편리함을 몸으로 느껴보고 작
uhanuu.tistory.com
위 블로그들의 공통된 결론은 "Getter를 무작정 사용해서는 안된다. 사용하는 이유가 분명하다면 사용해라!" 이다.
※ 참고 자료
https://blogshine.tistory.com/241
[Refactoring] 객체지향 생활 체조 원칙
The ThoughtWorks Anthology을 일부 읽고 정리한 내용 입니다. 객체지향 생활 체조 원칙 9가지 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 1. 한 메서드에 오직 한 단계의 들여 쓰기만 한다. 2. else
blogshine.tistory.com
https://colabear754.tistory.com/173
[OOP] Getter와 Setter는 지양하는게 좋다
목차 들어가기 전에 얼마 전 사내에서 Getter와 Setter를 함부로 사용하면 안되는 이유에 대한 세미나가 있었다. Setter에 대한 이야기는 워낙 많이 알려져있었지만 Getter에 대한 이야기는 잘 하지 않
colabear754.tistory.com
디미터 원칙 : https://mangkyu.tistory.com/147
'2023-woowacourse-precourse' 카테고리의 다른 글
일급 컬렉션이요?? 그게 뭐죠? (0) | 2023.11.26 |
---|---|
2023 우아한 테크코스 4주차 회고 (0) | 2023.11.17 |
2023 우아한 테크코스 3주차 회고 (0) | 2023.11.17 |
2023 우아한 테크코스 2주차 회고 (0) | 2023.11.17 |
2023 우아한 테크코스 1주차 회고 (2) | 2023.10.27 |