-
Notifications
You must be signed in to change notification settings - Fork 1
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: BindingAdapter 분리 및 리팩토링 #469 #472
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.
빙티!! BIndingAdpater 분리하느나 고생많으셨습니다ㅠㅠ
BIndingAdpater 찾기 너무 힘들었는데 빙티 덕분에 이제 쉽게 찾을 수 있겠네용 헤헤 👍😘
@ColorRes val colorSrc: Int?, | ||
@ColorRes val graySrc: Int?, |
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.
@ColorRes 명시 좋네요!! 👍
val hour = if (setNowDateTime.hour % 12 == 0) 12 else setNowDateTime.hour % 12 | ||
val noonText = if (setNowDateTime.hour < 12) "오전" else "오후" |
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.
하드코딩된 값들은 상수화하는 건 어떨까요?
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.
12는 상수로, 오전 & 오후는 strings.xml로 분리했습니다!
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.
파일 이름에 오타가 있는 것 같아요..!! Etc~
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.
뷰 종류에 상관 없는 메서드들을 담은 파일은 BindingAdapters.kt
로 수정했습니다!
@BindingAdapter("recoveryButtonEnabled") | ||
fun Button.setRecoveryButtonEnabled(recoveryCode: String?) { | ||
isEnabled = | ||
if (recoveryCode.isNullOrBlank() || recoveryCode.length < 36) { |
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.
36도 상수화하면 좋을 것 같아요~
@BindingAdapter( | ||
value = ["coilImageUri", "coilPlaceHolder"], | ||
) | ||
fun ImageView.loadCoilImageByUri( | ||
uri: Uri?, | ||
placeHolder: Drawable? = null, | ||
) { | ||
load(uri) { | ||
placeholder(placeHolder) | ||
error(placeHolder) | ||
} | ||
} |
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.
해당 BindingAdapter는 사용되고 있지 않는데 제거해도 되지 않을까요?
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.
제거했습니다!
|
||
@BindingAdapter("photoDragHintVisibility") | ||
fun TextView.setPhotoDragHintVisibility(currentPhotoNumbers: Int) { | ||
isGone = currentPhotoNumbers < 2 |
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.
여기도 상수화하면 좋을 것 같아요~
android:visibility="@{viewModel.isPeriodActive ? View.VISIBLE : View.GONE }" | ||
app:layout_constraintEnd_toEndOf="parent" | ||
app:layout_constraintStart_toStartOf="parent" | ||
app:layout_constraintTop_toBottomOf="@id/tv_memory_creation_period_description" | ||
bind:endDate="@{viewModel.endDate}" | ||
bind:periodSelectionVisibility="@{viewModel.isPeriodActive}" |
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.
EtcBindingAdapter에 있는 setVisibility 함수를 활용해도 될 것 같아요~
fun TextView.formatVisitedAtHistory(visitedAt: LocalDateTime?) { | ||
text = visitedAt?.let { | ||
getFormattedLocalDateTime(it) + resources.getString(R.string.visit_at_history) | ||
} ?: "" |
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.
""
도 전반적으로 상수화하면 좋을 것 같아요!
fun TextView.formatVisitedAtHistory(visitedAt: LocalDateTime?) { | ||
text = visitedAt?.let { | ||
getFormattedLocalDateTime(it) + resources.getString(R.string.visit_at_history) |
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.
fun TextView.formatVisitedAtHistory(visitedAt: LocalDateTime?) { | |
text = visitedAt?.let { | |
getFormattedLocalDateTime(it) + resources.getString(R.string.visit_at_history) | |
@BindingAdapter("visitedAtHistory") | |
fun TextView.formatVisitedAtHistory(visitedAt: LocalDateTime?) { | |
text = visitedAt?.let { | |
resources.getString(R.string.visit_at_history).format(getFormattedLocalDateTime(it)) |
// fragment_visit
<string name="visit_at_history">%s에 방문했어요</string>
visit_at_history
에 %s
를 추가하고 format을 활용하는 건 어떠신가용?
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.
반영했습니다!
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.
바인딩 어댑터 리팩터링 너무 고생하셨습니다! 💯
정말 깔끔하게 잘 나누어주신 것 같아요~~
이제 바인딩 어댑터를 찾으러 몇백줄을 뒤져보지 않아도 되겠군요....! 🥹
너무 좋습니다!! 😆
몇 가지 확인해보면 좋을 부분에 대해서 코멘트 남겨드렸으니, 확인 부탁드립니다!
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.
Etc 를 Etx 로 오타를 내신 것 같네요! 😂
분리를 하고 나머지 뷰들의 바인딩 어댑터임을 명시하기 위해 파일 이름을 이와 같이 변경하신 것 같은데,
저는 기존의 BindingAdapters.kt
가 좋아보여요!
기존에 존재하던 BindingAdapters 에서 너무 많은 메서드를 가진 View의 경우만 분리를 해주신 것이니,
"남은 자잘한 뷰들의 바인딩 어댑터에요~" 하고 파일 이름에 나타낼 이유는 크게 없어보였어요!
그리고 빙티가 파일 분리를 하면서 어떤 View의 바인딩 어댑터인지 파일 이름에 잘 명시해주셨어요.
그래서 이를 활용할 동료 개발자의 입장에서도 혼란이 일어날 것 같지 않아요~
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.
반영했습니다!
@BindingAdapter("scrollableToBottom") | ||
fun ScrollView.isScrollableToBottom(isScrollable: Boolean) { |
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.
다른 화면의 스크롤 뷰에도 적용할 수 있도록 메서드와 파라미터 이름을 변경하신 것 같네요!
메서드의 파라미터로 들어온
Boolean
값이true
인 경우, 스크롤을 맨 하단으로 강제 이동
해당 바인딩어댑터는 위와 같이 조건에 의해 수행되고 강제성을 띄기 때문에, 가능성을 나타내는 scrollable
이라는 이름이 들어간 것이 어색하게 느껴졌어요.
비슷한 예로 View의 가시성을 설정하는 바인딩어댑터의 메서드 명은 가능성을 나타내고있지 않죠!
@BindingAdapter("visibleOrGone")
fun View.setVisibility(isVisible: Boolean?)
바인딩 어댑터 메서드 명의 통일성을 유지하고,
값이 true인 경우 맨 아래로 스크롤한다 라는 동작이 잘 나타나도록 아래와 같은 예시를 참고해보는 것은 어떨까요?
@BindingAdapter("scrollableToBottom") | |
fun ScrollView.isScrollableToBottom(isScrollable: Boolean) { | |
@BindingAdapter("scrollToBottom") | |
fun ScrollView.setScrollToBottom(isActive: Boolean) { |
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.
좋은 의견 감사합니다! 확실히 scrollable이란 표현은 어색하네요..ㅎㅎ 반영하였습니다
다만, 파라미터로 들어온 Boolean 값에 따라 스크롤을 맨 하단으로 강제 이동하는 메서드이므로
파라미터 명은 isScrollable: Boolean
가 더 자연스럽다고 생각해 기존처럼 유지했습니다~!~!
format( | ||
periodFormatString, | ||
startAt.year, | ||
startAt.monthValue, | ||
startAt.dayOfMonth, | ||
endAt.year, | ||
endAt.monthValue, | ||
endAt.dayOfMonth, | ||
) |
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.
해당 바인딩 어댑터에서 사용하는 format 함수가 okhttp3
라이브러리의 Util.kt
에 존재하는 포맷팅 메서드네요...!
전역에서 편하게 사용하기 위해 만들어진 Util 이지만, okhttp3
와 관련이 없는 BindingAdatpers
에 해당 라이브러리의 import가 존재하는 것이 불필요한 의존성을 만든 것 같아 좋은 구현이라고 생각하지 않습니다.
String
의 확장함수로 정의되어있는 String.format()
메서드 등 다른 활용 방안이 많으니, 이로 대체하는 것이 좋아보입니다!
format( | |
periodFormatString, | |
startAt.year, | |
startAt.monthValue, | |
startAt.dayOfMonth, | |
endAt.year, | |
endAt.monthValue, | |
endAt.dayOfMonth, | |
) | |
periodFormatString.format( | |
startAt.year, | |
startAt.monthValue, | |
startAt.dayOfMonth, | |
endAt.year, | |
endAt.monthValue, | |
endAt.dayOfMonth, | |
) |
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.
띠용~ okhttp3의 format import가 숨어있었네요!!
제안해주신대로 String.format()로 변경했습니다 👍
format( | ||
periodFormatString, | ||
startAt.year, | ||
startAt.monthValue, | ||
startAt.dayOfMonth, | ||
endAt.year, | ||
endAt.monthValue, | ||
endAt.dayOfMonth, | ||
) |
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.
해당 코멘트와 같은 의견입니다!
⭐️ Issue Number
🚩 Summary
View 별 파일 분리
ButtonBindingAdapters :
Button
,MaterialButton
,ImageButton
의 확장함수ImageBindingAdapters :
ImageView
의 확장함수TextBindingAdapters :
TextView
의 확장함수BindingAdapters :
View
ViewGroup
등 기타 뷰들의 확장함수추억 수정 화면 DatePicker 버그 수정
isAdded를 검사해 dateRangePicker의 show가 중복 호출되며 앱이 crash되는 버그를 수정했습니다.