Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[REFACTOR] 출발지 모드 세팅 / Enum Class 활용 #272

Merged
merged 1 commit into from
Nov 9, 2023

Conversation

unam98
Copy link
Contributor

@unam98 unam98 commented Nov 6, 2023

📌 개요

closed #260 출발지 모드 세팅 / Enum Class 활용

✨ 작업 내용

  • 매직 리터럴 -> Enum Class

✨ PR 포인트

  • 생성한 Enum Class 파일을 우선 Util에 넣어놨는데 어떤 폴더에서 관리하는 것이 적절할지 고민이 됩니다.
  • 보통 Enum Class는 가독성 목적으로 많이 쓰는 것으로 알고 있는데 이전과 비교해서 가독성이 높아진 것 같나요?! 저는 체감이 잘 안 돼서 혹시 Enum Class를 더 효과적으로 쓸 수 있는 방법이 있을지 궁금합니다.
  • 단순히 매직 리터럴을 지양하려는 목적이라면 Enum Class 말고 companion object에 상수를 만들어서 쓰는 방법이랑 큰 차이가 없는 것 같은데 어떤 부분이 다르다고 생각하시나요?

📸 스크린샷/동영상

@unam98 unam98 added 우남 🐼 우남 담당 REFACTOR 🧹 코드 리팩토링 labels Nov 6, 2023
@unam98 unam98 requested a review from leeeha November 6, 2023 11:44
@unam98 unam98 self-assigned this Nov 6, 2023
Comment on lines +142 to +144
DepartureSetMode.SEARCH.mode -> initSearchLocationMode()
DepartureSetMode.CURRENT.mode -> initCurrentLocationMode()
DepartureSetMode.CUSTOM.mode -> initCustomLocationMode()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SEARCH, CURRENT, CUSTOM 뒤에 붙는 .mode가 불필요하게 코드를 길어지게 만들어 조금 거슬리는 느낌도 들었습니다.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum 클래스를 사용하면 관련된 상수들을 집합처럼 묶어서 관리할 수 있으므로 가독성이 올라갈 것이라고 생각했습니다!

음 현재 DepartureSetMode 클래스에 mode 라는 변수가 꼭 필요한가요?? 아래처럼 이넘 클래스를 구현하면 중복되는 코드가 줄어들 거 같습니다!

enum class DepartureSetMode {
    SEARCH,
    CURRENT,
    CUSTOM
}

참고로 이 블로그 글을 읽어보면, 상수와 관련된 변수나 함수의 관리를 일원화 할 수 있다는 점에서도 enum class 사용을 권장하는 거 같습니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

링크 감사합니다! 제가 enum 클래스 안에 변수를 만들어준 이유는, 분기처리가 searchResult.mode란 값에 따라 이루어져야 하기 때문입니다. enum 클래스에 어떠한 변수 값 할당 없이 이걸 구현할 수 있나요?!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Parcelize
data class SearchResultEntity(
    val fullAddress: String,
    val name: String,
    val locationLatLng: LatLng?,
    val mode: String
) : Parcelable

위의 코드에서 mode 타입을 String 대신에 DepartureSetMode 타입으로 선언하면 되지 않을까 싶습니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분 예전에 mode라는 속성이 이 data class 안에 같이 포함되는 게 부적절해보인다고 같이 얘기나눴어서 #274 pr에서 걷어냈습니다! 기억나실까요?! 그때의 의견이 지금도 유효한지 궁금합니다.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 동의합니다! 관련 코드에 대한 리뷰 #274 PR에 코멘트로 남겨뒀습니다!

@leeeha
Copy link
Member

leeeha commented Nov 6, 2023

출발지 설정 모드 enum class를 DrawActivity에서만 사용한다면, 이 둘을 같은 패키지 아래에 위치시키는 게 더 좋을 거 같아요! (관련된 코드를 찾아보기 더 편하도록)

만약 enum class를 다른 클래스에서도 유틸처럼 사용한다면 util 패키지 아래에 정의하는 게 좋을 거구요!

@unam98
Copy link
Contributor Author

unam98 commented Nov 7, 2023

출발지 설정 모드 enum class를 DrawActivity에서만 사용한다면, 이 둘을 같은 패키지 아래에 위치시키는 게 더 좋을 거 같아요! (관련된 코드를 찾아보기 더 편하도록)

만약 enum class를 다른 클래스에서도 유틸처럼 사용한다면 util 패키지 아래에 정의하는 게 좋을 거구요!

흠 고민이 되네요. 앞서 여러 곳에서 쓰일 여지가 있으니 enum 클래스를 활용해서 관리 일원화를 하는 효용이 있다고 말씀해주셨는데 DrawActivity 한 곳에만 쓰인다면 이 효용을 온전히 누릴 수 없으면서 괜히 관리 번거롭게 파일 하나만 더 만드는 거 아닌가 싶어서요. enum이 쓰이는 목적은 비슷비슷할 텐데 이 파일들이 여러 폴더에 나눠져있으면 나중에 찾아보기 까다롭겠다는 생각도 조금 드네요.

이 의견에 대해서 어떻게 생각하시나요?! (어떤 방향을 강하게 어필하려는 뉘양스가 아니라 단순히 의견이 궁금해서 물어보는 것)

@leeeha
Copy link
Member

leeeha commented Nov 7, 2023

앞서 여러 곳에서 쓰일 여지가 있으니 enum 클래스를 활용해서 관리 일원화를 하는 효용이 있다고 말씀해주셨는데

저는 이 의도로 말한 게 아니었어요! 상수와 관련된 변수나 함수를 외부에서 관리하지 않고 enum 클래스 안에 같이 묶어서 관리할 수 있다는 점에서 관리가 일원화 된다고 말한 거였습니다!

enum이 비슷한 목적으로 쓰이는데 파일이 여러 개로 분리되는 게 오히려 가독성에 저해가 된다 느끼신다면, DrawActivity.kt 파일 안에 enum class를 같이 선언하는 건 어떨까요..??

@leeeha
Copy link
Member

leeeha commented Nov 7, 2023

private fun initMode() {
    when (searchResult.mode) {
        "searchLocation" -> initSearchLocationMode()
        "currentLocation" -> initCurrentLocationMode()
        "customLocation" -> initCustomLocationMode()
    }
}

이렇게 when문에서 하드코딩한 문자열로 케이스를 구분하다 보면, 오타가 발생하거나 어떤 한 가지 케이스를 빠뜨려도 컴파일 에러가 발생하지 않기 때문에, 그 대안으로 enum class를 제안해본 것이었습니다!

enum class DepartureMode {
    SEARCH,
    CURRENT,
    CUSTOM
}

private fun initMode(mode: DepartureMode) {
    when (mode) {
        DepartureMode.SEARCH -> initSearchLocationMode()
        DepartureMode.CURRENT -> initCurrentLocationMode()
    }
}

이렇게 한 가지 케이스라도 빠뜨리면 아래 스크린샷 처럼 컴파일 에러가 발생합니다!

image

private fun initMode() {
    when (searchResult.mode) {
        "searchLocation" -> initSearchLocationMode()
        "currentLocation" -> initCurrentLocationMode()
    }
}

그런데 이렇게 문자열로만 구분하는 경우에는 컴파일 에러가 발생하지 않아서 오류를 감지하기 힘들 수 있겠더라구요..!
(물론 이와 연관된 부분의 코드가 꼬여서 빌드하면 에러가 발생할 수 있는데, enum class 처럼 IDE가 바로 감지하지는 못하더라구요)

@unam98
Copy link
Contributor Author

unam98 commented Nov 9, 2023

private fun initMode() {
    when (searchResult.mode) {
        "searchLocation" -> initSearchLocationMode()
        "currentLocation" -> initCurrentLocationMode()
        "customLocation" -> initCustomLocationMode()
    }
}

이렇게 when문에서 하드코딩한 문자열로 케이스를 구분하다 보면, 오타가 발생하거나 어떤 한 가지 케이스를 빠뜨려도 컴파일 에러가 발생하지 않기 때문에, 그 대안으로 enum class를 제안해본 것이었습니다!

enum class DepartureMode {
    SEARCH,
    CURRENT,
    CUSTOM
}

private fun initMode(mode: DepartureMode) {
    when (mode) {
        DepartureMode.SEARCH -> initSearchLocationMode()
        DepartureMode.CURRENT -> initCurrentLocationMode()
    }
}

이렇게 한 가지 케이스라도 빠뜨리면 아래 스크린샷 처럼 컴파일 에러가 발생합니다!

image

private fun initMode() {
    when (searchResult.mode) {
        "searchLocation" -> initSearchLocationMode()
        "currentLocation" -> initCurrentLocationMode()
    }
}

그런데 이렇게 문자열로만 구분하는 경우에는 컴파일 에러가 발생하지 않아서 오류를 감지하기 힘들 수 있겠더라구요..! (물론 이와 연관된 부분의 코드가 꼬여서 빌드하면 에러가 발생할 수 있는데, enum class 처럼 IDE가 바로 감지하지는 못하더라구요)

맞네요! 개인적으로 하고 있는 스터디에서도 들었던 내용인데 짚어주셔서 감사합니다!

@unam98 unam98 merged commit 66c20f1 into develop Nov 9, 2023
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
REFACTOR 🧹 코드 리팩토링 우남 🐼 우남 담당
Projects
Development

Successfully merging this pull request may close these issues.

[REFACTOR] 출발지 모드 선택 / enum 클래스 활용
2 participants