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] 약속 추가 플로우 데이터 전달 간소화 #400

Merged
merged 2 commits into from
Nov 3, 2024

Conversation

JinUng41
Copy link
Contributor

🔗 연결된 이슈

📄 작업 내용

  • 연속된 화면 간 데이터 전달을 간소화 하고자 빌더 패턴을 차용하여 약속을 만들기 위해 입력받고 전달되는 내용을 수정하였습니다.

💻 주요 코드 설명

AddPromiseRequestModel 내용에 따른 빌더 객체 구현과 사용

  • 여러 화면에서 입력받아야 하는 정보를 보다 간단하게 관리하기 위해서 빌더 패턴을 도입하였습니다.
  • 각 단계에서 필요한 내용을 빌더 객체를 통해 구성하고 뷰모델은 빌더 객체를 이용하여 네트워크 통신 시, 필요한 구성물을 만들어 낼 수 있습니다.
  • 각 뷰모델의 생성자가 매우 간단하게 바뀌었습니다.
AddPromiseRequestModelBuilder.swift
extension AddPromiseRequestModel {
    final class Builder {
        private(set) var id = 0
        private var name = ""
        private var placeName = ""
        private var address = ""
        private var roadAddress = ""
        private var time = ""
        private var dressUpLevel = ""
        private var penalty = ""
        private var x = 0.0
        private var y = 0.0
        private var participants = [Int]()
        
        @discardableResult
        func setName(_ name: String) -> Self {
            self.name = name
            return self
        }
        
        @discardableResult
        func setPlaceName(_ placeName: String) -> Self {
            self.placeName = placeName
            return self
        }
        
        @discardableResult
        func setAddress(_ address: String) -> Self {
            self.address = address
            return self
        }
        
        @discardableResult
        func setRoadAddress(_ roadAddress: String) -> Self {
            self.roadAddress = roadAddress
            return self
        }
        
        @discardableResult
        func setTime(_ time: String) -> Self {
            self.time = time
            return self
        }
        
        @discardableResult
        func setDressUpLevel(_ dressUpLevel: String) -> Self {
            self.dressUpLevel = dressUpLevel
            return self
        }
        
        @discardableResult
        func setPenalty(_ penalty: String) -> Self {
            self.penalty = penalty
            return self
        }
        
        @discardableResult
        func setCoordinates(x: Double, y: Double) -> Self {
            self.x = x
            self.y = y
            return self
        }
        
        @discardableResult
        func setId(_ id: Int) -> Self {
            self.id = id
            return self
        }
        
        @discardableResult
        func setParticipants(_ participants: [Int]) -> Self {
            self.participants = participants
            return self
        }
        
        func build() -> AddPromiseRequestModel {
            return AddPromiseRequestModel(
                name: name,
                placeName: placeName,
                address: address,
                roadAddress: roadAddress,
                time: time,
                dressUpLevel: dressUpLevel,
                penalty: penalty,
                x: x,
                y: y,
                id: id,
                participants: participants
            )
        }
    }
}

@JinUng41 JinUng41 added ♻️ refactor 기존 코드를 리팩토링하거나 수정하는 등 사용 (생산적인 경우) 💙 JinUng 걸스 토크에 미쳐보고 싶다면 labels Oct 25, 2024
@JinUng41 JinUng41 self-assigned this Oct 25, 2024
@JinUng41 JinUng41 linked an issue Oct 25, 2024 that may be closed by this pull request
1 task
Copy link
Member

@youz2me youz2me left a comment

Choose a reason for hiding this comment

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

빌더 패턴은 처음 알았는데 객체 생성 시에 간편하게 활용해볼 수 있겠네요! 저도 약속 수정이나 약속 상세 뷰모델 생성자로 많은 객체를 넘기는 게 힘들었는데 빌더 패턴 도입해보면 좋을 것 같습니다.
고생하셨습니다 🔥

private var y = 0.0
private var participants = [Int]()

@discardableResult
Copy link
Member

Choose a reason for hiding this comment

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

@discardableResult는 왜 사용하신건지 궁금해요!

Copy link
Member

Choose a reason for hiding this comment

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

방금 막 아요 코드리뷰하면서 @discardableResult 보고 똑같이 리뷰 남겼는데 여기 또 있어서 소름

Copy link
Contributor Author

@JinUng41 JinUng41 Oct 28, 2024

Choose a reason for hiding this comment

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

함수의 리턴값에 대해서 사용하지 않아도 경고문을 표시하지 않는 @discardableResult 어노테이션을 사용한 이유는 아래의 코드처럼 메서드 체이닝으로 보다 간단하게 사용하면서도 경고문이 표시되지 않게 하기 위함이었습니다.

메서드 체이닝을 하기 위해서는 인스턴스를 메서드의 리턴값으로 내보내야 하는데요.
만약 메서드 체이닝이 아닌 형태로 구현된다면 빌더의 구현이 아래와 같아질 것 입니다.

final class Builder {
    // 생략..

    // 리턴형이 없는 메서드
    func setName(_ name: String) {
       self.name = name
    }
    
    func setPlaceName(_ placeName: String) {
        self.placeName = placeName
    }
}

// 실제 사용 시

let builder = Builder()
builder.setName(name)
builder.setPlaceName(place.location)

return builder

Copy link
Member

Choose a reason for hiding this comment

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

오 ... 메서드 체이닝을 하려면 무조건 리턴값이 존재해야 하는군요! 좋은 정보 감사합니다 👍

Comment on lines +123 to +130
return AddPromiseRequestModel.Builder()
.setId(meetingID)
.setName(name)
.setTime(time)
.setPlaceName(place.location)
.setAddress(place.address ?? "")
.setRoadAddress(place.roadAddress ?? "")
.setCoordinates(x: place.x, y: place.y)
Copy link
Member

Choose a reason for hiding this comment

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

👍

Comment on lines -14 to 23
let meetingID: Int
let name: String
let place: Place
let dateString: String
let members: [Member]

private let builder: AddPromiseRequestModel.Builder
private let service: SelectPenaltyServiceType
private let levelRelay = BehaviorRelay(value: "")
private let penaltyRelay = BehaviorRelay(value: "")
private let newPromiseRelay = BehaviorRelay<AddPromiseResponseModel?>(value: nil)

init(
meetingID: Int,
name: String,
place: Place,
dateString: String,
members: [Member],
builder: AddPromiseRequestModel.Builder,
service: SelectPenaltyServiceType
) {
self.meetingID = meetingID
self.name = name
self.place = place
self.dateString = dateString
self.members = members
self.builder = builder
self.service = service
Copy link
Member

Choose a reason for hiding this comment

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

너무 간편해졌네요!

Copy link
Member

@hooni0918 hooni0918 left a comment

Choose a reason for hiding this comment

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

LGTM

Copy link
Member

@mmaybei mmaybei left a comment

Choose a reason for hiding this comment

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

빌더 패턴.. 오렵당 수고하셨어유~~

private var y = 0.0
private var participants = [Int]()

@discardableResult
Copy link
Member

Choose a reason for hiding this comment

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

방금 막 아요 코드리뷰하면서 @discardableResult 보고 똑같이 리뷰 남겼는데 여기 또 있어서 소름

@JinUng41 JinUng41 merged commit a74cd88 into suyeon Nov 3, 2024
@JinUng41 JinUng41 deleted the refactor/#399-add-promise-simplify-data branch November 3, 2024 09:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💙 JinUng 걸스 토크에 미쳐보고 싶다면 ♻️ refactor 기존 코드를 리팩토링하거나 수정하는 등 사용 (생산적인 경우)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[refactor] 약속 추가 플로우 데이터 전달 방식 간결화
4 participants