-
Notifications
You must be signed in to change notification settings - Fork 2
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] Coordinator Pattern 적용 (#139) #140
Conversation
수정 사항 없는 것 같아요 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
6시간의 사투끝에..뿌듯하네요😁 주석 남은 것만 마저 지우고 머지합시다!
ViewController는 자신 이외의 다른 ViewController에 대한 어떠한 정보도 가져서는 안됩니다. 하지만 네이밍에서 이미 다른 ViewController에 대한 정보를 내포하고 있기에 이러한 이유로 캡슐화에 위반됩니다. (상세 이유 추가)
해당 문장 protocol 메서드 이름 캡슐화 위반 내용관련해서 이유를 상세하게 조금 더 추가했습니다 ! 한번 확인부탁드립니다.
LionHeart-iOS/LionHeart-iOS/Global/UIComponents/LHNavigationBarView.swift
Outdated
Show resolved
Hide resolved
LionHeart-iOS/LionHeart-iOS/Global/UIComponents/LHNavigationBarView.swift
Outdated
Show resolved
Hide resolved
좋네요 |
👏👏👏👏👏분명한 의도와 그에 맞게 구현하신게 인상깊네요 몇 가지 궁금한 점과 얘기해보고 싶은게 있어서 커멘트 남깁니당 1.
|
오랜만이네요 승찬쿤😀@LentoAssai 1.
|
많은 고민을 한 것이 여실히 드러나네요 멋집니다👍 1.
|
[#139] REFACTOR : Coordinator Pattern 적용
🌱 작업한 내용
🌱 PR Point
Why? - 코디네이터 패턴을 도입한 이유
현재 라이언하트는 MVC 아키텍처인데 리팩터링방향이
MVC에서 massive해지는 ViewController를 최대한 줄여보자
입니다 물론 줄인다는게 물리적으로 코드자체를 줄이는것도있겠지만 그것보다 중요한건ViewController의 역할을 나눠주는것
이라고 생각했습니다. 그중에서도 화면전환로직을 그동안 viewcontroller가 담당하고 있었는데 이를 위해서 1️⃣다른 객체를 생성하고 2️⃣해당 객체로의 화면전환의 역할까지 viewcontroller가 맡는건 너무 많은 역할을 맡게한다고 생각했습니다그래서 화면전환 로직을 담당해주는 coordinator pattern을 도입하게 되었습니다
Preview
Coordinator 구조 및 설계
Coordinator Pattern 사용법
Navigation(Coordinator Interface)분리
따라서 아래와같은 세가지의 interface를 통해서 중복구현을 방지하였습니다
예를들어서 todayviewcontroller의 경우에 화면전환의 경우가 세가지가있는데
공통되는 navigationbar의 interface를 분리함으로서 아래와같은 navigation interface를 가질 수있게됩니다
앱종료관련 navigation interface
잘못된접근
이라는 앱재실행이 필요한 오류가존재합니다해당 상황이 발생하는 경우를 추상화하기위해서 아래와같은 interface로 분리를 해줬습니다
그리고 해당 interface의 동작이 모든 경우에 동일하기때문에 채택한 모든 coordinator에서 구현해줄 필요가 없으며 coordinator라는 프로토콜을 채택한 객체에서 해당 interface를 구현해줄 필요가 있기때문에 protocol의 extension을 활용해 기본구현을 해주고 where절을 통해 coordinator객체 내부에서만 기본구현이 존재하도록 구현했습니다
하지만 이런 코드를 protocol의 extension으로 뺄수 없습니다
가장 큰 이유는 bookmark의 화면전환 로직을 bookmakrcoordinator가 담당하고 mypage의 화면전환로직을 mypagecoordinator가 담당하고있기때문에 해당 coordiantor를 상위 coordinator의 child에 append해줘야하는데 이를 extension을 통해서 기본구현을 제공하게 된다면 어떤 coodinator의 child에 append를 해줘야할지 알 수가 없습니다
다른 앱을 보면 각각의 tab의 navigationbar가 동일한 view로 이동할수있게 되어있는 앱이 거의 존재하지 않지만 라이온하트앱은 모든 tab의 viewcontroller에서 모두 동일한 뷰로 이동할 수 있는 navigationvbar 형태를 가지고 있기때문에 이러한 상황이 발생했습니다
해당 부분을 해결하기 위해서는 ux와ui적인 수정이 필요합니다
Coordinator pattern 도입 후기
viewcontroller객체 생성
+데이터 전달
+화면전달 코드
가 결코 적지 않았는데 해당 코드들이 확실히 줄어서 깔끔해 보이긴했다. 또한 화면전환 분기처리도 viewcontroller의 user action에 따라 coordinator내부에서 분기처리를 해줘서 viewcontroller자체의 역할도 줄어들었지만 코드의 양도 줄어들었다📮 관련 이슈