inflearn logo
강의

講義

知識共有

Readable Code: 読みやすいコードを書くための考え方

練習プロジェクトの紹介

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

解決済みの質問

323

PrivilegeEscalate

投稿した質問数 27

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 가 맞는거같은데 강사님의 기준이 있으실까요

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

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

回答 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

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