inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Readable Code: Cách tư duy để viết code dễ đọc

Giới thiệu dự án thực hành

질문 제목을 뭐라 적어야할지 모르겠습니다. 죄송합니다

Đã giải quyết

323

PrivilegeEscalate

27 câu hỏi đã được viết

0

우선 강의 너무 재밌게 잘 보고있단 말씀 드리고 싶습니다.

 

일단 새로운 도메인에서 혼자 리팩토링을 하고있었는데요, 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 가 맞는거같은데 강사님의 기준이 있으실까요

(질문이 제가 봐도 이상한것같은데.. 죄송합니다)

객체지향 리팩토링 클린코드-기획전

Câu trả lời 2

0

wbluke

안녕하세요, PrivilegeEscalate 님!

좋은 질문이네요 ㅎㅎ 아래 추가 내용 남겨주신 부분에서 시작하자면,

 

아 리팩토링 (1) - 추상화 레벨 25분 10초쯤부터 해당과 비슷한 내용이나오네요!! 그렇다면 왜 StudyCafeLockerPass 가 아닌, StudyCafePass 에 질문을 던진 이유를 알 수 있을까요?

메서드의 설계는 곧 도메인에 대한 이해에서부터 시작되는데요.
(제가 만들었지만..) 제가 이 도메인을 이해한 내용 중 하나는, "StudyCafeLockerPassStudyCafePass 에 종속적이다" 입니다.

실제로 사물함 이용권은 스터디카페 이용권을 구입하지 않으면 사용할 수 없기 때문이죠.

두 객체 A와 B가 동등하고, 크게 관련이 없는 상태에서 내부 타입만 공통으로 가지고 있다면, 말씀주신 V2 처럼 type, duration 만 넘겨서 해당하는 pass를 찾았을 것 같은데요.
객체 A와 B가 종속적인 관계라고 저는 해석했기 때문에, 좀 더 주체가 되는 Pass가 LockerPass를 받아서 해당 데이터를 꺼내어 처리하는 방식을 선택하였습니다.

정답이 없고, 도메인을 이해하는 방식에 따라 달라질 수 있는 점이긴 한데요 ㅎㅎ 다만 메서드 설계 시 제가 설명드린 것처럼 명확한 이유에 근거하여 설계해보는 습관을 들이는 게 중요한 것 같습니다.

도움이 되셨기를 바랍니다.
감사합니다. 🙂

0

PrivilegeEscalate

아 종속적인 관계.. 이해했습니다. 그런 시야가 필요하군요. 감사합니다! 그리고 완강했습니다!! 진짜 너무 너무 많은 도움이 되었어요. 궁금한게 생기면 다시 찾아오겠습니다.

0

PrivilegeEscalate

아 리팩토링 (1) - 추상화 레벨 25분 10초쯤부터 해당과 비슷한 내용이나오네요!! 그렇다면 왜 `StudyCafeLockerPass` 가 아닌, `StudyCafePass` 에 질문을 던진 이유를 알 수 있을까요?

[강의 질문] 메서드 선언부

0

90

1

[강의 질문] 메서드와 추상화

0

61

2

DIP 개념에 대한 질문입니다.

0

64

1

만약 보드를 이용한 게임의 종류가 더 다양해진다면 어떻게 될 수 있을지에 대한 고민

0

86

2

DIP 설명 후반부에 IOC에 대한 질문 드립니다.

0

80

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

194

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

253

3

리팩토링을 하고 난 뒤 다시보면 오히려 더 복잡해 보이는것 같은 느낌입니다..

0

255

2