질문 제목을 뭐라 적어야할지 모르겠습니다. 죄송합니다
우선 강의 너무 재밌게 잘 보고있단 말씀 드리고 싶습니다.
일단 새로운 도메인에서 혼자 리팩토링을 하고있었는데요, List<StudyCafeLockerPass> 를 일급 컬렉션으로 감싸 StudyCafeLockerPasses 를 만들었습니다.
여기서 StudyCafeLockerPass 에게 type 과 duration 이 같은지 비교하는 질문을던질 때 StudyCafePass 자체를 인자로 넘길지, 아니면 StudyCafePass 로부터 type 과 duration 을 꺼내서 넘길지 고민입니다.
public class StudyCafeLockerPasses {
private final List<StudyCafeLockerPass> lockerPasses;
public StudyCafeLockerPasses(List<StudyCafeLockerPass> lockerPasses) {
this.lockerPasses = lockerPasses;
}
public static StudyCafeLockerPasses of(List<StudyCafeLockerPass> lockerPasses) {
return new StudyCafeLockerPasses(lockerPasses);
}
// TODO V1. 여기 (StudyCafeLockerPass 에게 질문을 던질때 StudyCafePass 자체를 넘길지)
public StudyCafeLockerPass findOneBy(StudyCafePass selectedPass) {
return lockerPasses.stream()
.filter(option -> option.isEqualWith(selectedPass))
.findFirst()
.orElse(null);
}
// TODO V2. 여기 (StudyCafeLockerPass 에게 질문을 던질때 StudyCafePass 에서 type 와 duration 을 getter 로 꺼내서 넘길지)
public StudyCafeLockerPass findOneBy2(StudyCafePass selectedPass) {
return lockerPasses.stream()
.filter(option -> option.isEqualWithV2(selectedPass.getPassType(), selectedPass.getDuration()))
.findFirst()
.orElse(null);
}
}
V1 같은 경우의 StudyCafeLockerPass 메서드는 아래와 같습니다.
public class StudyCafeLockerPass {
private final StudyCafePassType passType;
private final int duration;
private final int price;
public boolean isEqualWith(StudyCafePass studyCafePass) {
return isSamePassType(studyCafePass.getPassType()) && isSameDuration(studyCafePass.getDuration());
}
public boolean isSamePassType(StudyCafePassType passType) {
return this.passType == passType;
}
public boolean isSameDuration(int duration) {
return this.duration == duration;
}
}
V2 경우의 StudyCafeLockerPass 메서드는 아래와 같습니다.
public class StudyCafeLockerPass {
private final StudyCafePassType passType;
private final int duration;
private final int price;
public boolean isEqualWithV2(StudyCafePassType passType, int duration) {
return isSamePassType(passType) && isSameDuration(duration);
}
public boolean isSamePassType(StudyCafePassType passType) {
return this.passType == passType;
}
public boolean isSameDuration(int duration) {
return this.duration == duration;
}
}
제가 느끼기에는 Getter 를 사용하지 않으려면 V1 이 맞는거같고.., 의존성을 생각한다면 V2 가 맞는거같은데 강사님의 기준이 있으실까요
(질문이 제가 봐도 이상한것같은데.. 죄송합니다)
回答 2
0
안녕하세요, PrivilegeEscalate 님!
좋은 질문이네요 ㅎㅎ 아래 추가 내용 남겨주신 부분에서 시작하자면,
아 리팩토링 (1) - 추상화 레벨 25분 10초쯤부터 해당과 비슷한 내용이나오네요!! 그렇다면 왜
StudyCafeLockerPass가 아닌,StudyCafePass에 질문을 던진 이유를 알 수 있을까요?
메서드의 설계는 곧 도메인에 대한 이해에서부터 시작되는데요.
(제가 만들었지만..) 제가 이 도메인을 이해한 내용 중 하나는, "StudyCafeLockerPass는 StudyCafePass 에 종속적이다" 입니다.
실제로 사물함 이용권은 스터디카페 이용권을 구입하지 않으면 사용할 수 없기 때문이죠.
두 객체 A와 B가 동등하고, 크게 관련이 없는 상태에서 내부 타입만 공통으로 가지고 있다면, 말씀주신 V2 처럼 type, duration 만 넘겨서 해당하는 pass를 찾았을 것 같은데요.
객체 A와 B가 종속적인 관계라고 저는 해석했기 때문에, 좀 더 주체가 되는 Pass가 LockerPass를 받아서 해당 데이터를 꺼내어 처리하는 방식을 선택하였습니다.
정답이 없고, 도메인을 이해하는 방식에 따라 달라질 수 있는 점이긴 한데요 ㅎㅎ 다만 메서드 설계 시 제가 설명드린 것처럼 명확한 이유에 근거하여 설계해보는 습관을 들이는 게 중요한 것 같습니다.
도움이 되셨기를 바랍니다.
감사합니다. 🙂
0
아 종속적인 관계.. 이해했습니다. 그런 시야가 필요하군요. 감사합니다! 그리고 완강했습니다!! 진짜 너무 너무 많은 도움이 되었어요. 궁금한게 생기면 다시 찾아오겠습니다.
0
아 리팩토링 (1) - 추상화 레벨 25분 10초쯤부터 해당과 비슷한 내용이나오네요!! 그렇다면 왜 `StudyCafeLockerPass` 가 아닌, `StudyCafePass` 에 질문을 던진 이유를 알 수 있을까요?
[강의 질문] 메서드 선언부
0
90
1
[강의 질문] 메서드와 추상화
0
61
2
DIP 개념에 대한 질문입니다.
0
64
1
만약 보드를 이용한 게임의 종류가 더 다양해진다면 어떻게 될 수 있을지에 대한 고민
0
86
2
DIP 설명 후반부에 IOC에 대한 질문 드립니다.
0
79
2
안녕하세요 ! 혹시 자바가 아닌 다른 객체지향 언어를 알고있어도 강의를 들어도 괜찮을까요 ?!
0
71
1
안녕하세요 메서드명 때문에 고민이 있어서 질문드립니다.
1
64
2
자바 record 사용에 대해서 질문 드립니다!
0
128
2
강의 내용 정리 및 자료 제작 툴 문의 드립니다.
0
136
2
사용할 변수 가깝게 선언하기 질문
0
93
1
오버 엔지니어링
0
150
2
학습용 java/spring 오픈소스 추천
1
368
2
중복된 메서드 줄이는 방법
0
184
2
MarketPlace에서 Sonarlint 검색이 안됩니다.
0
417
3
isLandMineCell() 메서드 질문
0
209
1
Cell[][]BOARD 매개변수받기
0
153
2
ConsoleInputHandler에서 왜 final붙여야 하는지
0
193
1
정적 생성자 메서드 of, from
0
265
2
Getter관해서
0
148
3
이름 바꾸기
0
129
2
stack 대신 queue 를 사용해 bfs 로 변경해도 되나요??
0
164
2
현업에서 ISP를 도입하려는데 인터페이스 설계에 있어서 의문이 있습니다.
0
208
2
null을 가질 수 있는 값을 인자로 넘겨야 하는 경우
0
252
3
리팩토링을 하고 난 뒤 다시보면 오히려 더 복잡해 보이는것 같은 느낌입니다..
0
255
2

