메뉴 건너뛰기

목록
2021.01.03 23:42

오늘자 리팩터링

profile
조회 수 171 댓글 9 예스잼 5 노잼 0

refactor.png

안드로이드는 1년 정도 개발하고 런칭 후에 

업데이트나 유지보수를 딴 사람한테 넘겨서

안 한지 1년 정도 됨

 

그래도 가끔 뭐가 추가되나 깃을 통해 확인하는데(사실 수용소에 올릴거리 있는지 찾아봄 머쓱;)

오늘 이런 환장할 코드가 생긴걸 확인했음

 

딱보면 이런 초보적인걸 실수?하나 하는 사람들이 있겠지만

아무 생각도 안 하고 이렇게 네이밍 하는 사람 은근 많음(나도 포함 머쓱;)

 

내가 이상한것 같다고 짚어줘도 사실 다 계획이 있는 코드일 수도 있고

내가 틀릴 수도 있지만 쨋든 이런 논의는 결론이 어떻든 항상 생산적이라고 생각해서

저는 시간날 때마다 팀원들 코드 봐주고 짚어주는 편임

 

자 그럼 뭐가 문제인지 짚어보고 어떻게하면 괜찮을지 생각해보자

 

 

 

첫째로 데이터 클래스의 프로퍼티 이름이 과도하게 지어진 것을 확인할 수 있다

 

이미 클래스의 이름이 StoreUserPaymentCardModel인데

프로퍼티의 접두사로 클래스의 이름을 다시 쓰고 있다

 

덕분에 프로퍼티의 이름이 storeUserPaymentCardSummary 이딴식으로 기본으로 20자가 넘어가서 가독성이 떨어지고

인스턴스화 시키고 프로퍼티에 접근하게 되었을 때는

 

1
let summary = storeUserPaymentCardModel.storeUserPaymentCardSummary
cs

 

이런 끔찍한 재앙이 일어나게 될 것이다!

별로 와닿지 않는가?

 

1
2
3
4
summaryTextView.text = storeUserPaymentCardModel.storeUserPaymentCardSummary
cardCell.name.text = storeUserPaymentCardModel.storeUserPaymentCardName
cardCell.corp.text = getCorp(storeUserPaymentCardModel.storeUserPaymentCardCorpId).name
cardCell.type.text = storeUserPaymentCardModel.storeUserPaymentCardType
cs

 

실제 이런 뺌꼬리 같은 코드를 줄줄이 적다보면 생각이 달라질 것이다.

마치

"""

대한민국 경기도 안산에 사는 프로그래머 이준영씨는 자리에서 일어났다.

대한민국 경기도 안산에 사는 프로그래머 이준영씨는 양치질을 하고 대한민국 경기도 안산에 사는 프로그래머 이준영씨는 아침을 먹고

대한민국 경기도 안산에 사는 프로그래머 이준영씨가 어제 산 양복을 입고 대한민국 경기도 안산에 사는 프로그래머 이준영씨의 직장으로 향했다....

"""

와 비슷한 코드다

 

그럼 알았으니 이제 좀 고쳐보자

StoreUserPaymentCard의 summary니까 프로퍼티이름을

storeUserPaymentCardSummary 에서 summary로 바꿔주면 좋을듯하다.(나머지도 똑같이)

 

1
2
3
4
summaryTextView.text = storeUserPaymentCardModel.summary
cardCell.name.text = storeUserPaymentCardModel.name
cardCell.corp.text = getCorp(storeUserPaymentCardModel.corpId).name
cardCell.type.text = storeUserPaymentCardModel.type
cs

 

이정도만 해도 훨씬 나아졌지만 나는 이정도도 번잡하다. 싶으면

kotlin에는 범위지정함수가 있는데

그걸로 더 간결하게 만들어보자

 

1
2
3
4
5
6
7
8
 
with(storeUserPaymentCardModel) {
    summaryTextView.text = summary
    cardCell.name.text = name
    cardCell.corp.text = getCorp(corpId).name
    cardCell.type.text = type
}
 
cs

 

처음 코드에 비하면 훨씬 훌륭하다.

코틀린의 범위지정 함수는 우리팀은 사용이 능숙하고 눈에 익숙한 편인데

다른 안드로이드 개발자들 보면 안 쓰는 사람들도 꽤 있었다.

프로젝트를 같이 하는 팀원이 이런 문법에 익숙하지 않다면 안 쓰는 것도 고려해보자

오히려 더 헷갈리기만 한다.

 

 

 

둘째로 class이름이 좆같다

 

여기선 코드만으로 알기 어렵지만

이 데이터클래스는 매장페이지에서 사용자의 결제카드를 표시해주는 데이터의 model임

그렇다면 클래스 이름을 그냥 UserPaymentCardModel 혹은 payCardModel 이렇게 지어도 됐을텐데 왜 이렇게 길게 지었을까?

 

항상 변수나 함수, 클래스 이름이 길어지거나 뭔가 좆같아지면

저는 네임스페이스를 제대로 나누지 못했다고 생각함

말인즉 분명 클래스 이름을 StoreUserPaymentCardModel으로 지은 이유는

Store가 아닌 곳에서 UserPaymentCardModel을 표시해주는 일이 있었을것이고

분명 다른 곳에 MainUserPaymentCardModel 이딴식으로 페이지 이름을 접두사로 쓰는 클래스가 존재한다는 것을 유추할 수 있다.

그래서 똑같은 이름의 데이터클래스를 피하기 위해 페이지 이름을 접두사로 일일이 넣어주었을 것으로 예상된다.

(그게 아니라면 굳이 이름을 이렇게 길게 지을 이유가 있었을까?)

 

해결 방법은 두가지인데 

적당히 네임스페이스를 나눠서 data class가 사용되는 곳(이 경우엔 Store클래스가 되었다.)에서 innner로 선언해주어서

클래스이름을 UserPayCardModel 정도로 줄여주면 Store만 빼도 훨씬 간결하게 눈에 들어오는 것을 기대할 수 있다.

혹은 이러라고 만든건 아니긴 한데 코틀린이나 swift에서 typealias를 통해 특정 클래스에서 renaming해서 사용할 수도 있다.(근복적인 해결방안은 아님)

 

쨋든 네이밍과 네임스페이스를 잘 나눠주는 것은 10글자가 넘어가면 눈이 팽글팽글 돌아버리는 나에게는 너무 중요한 일이기 때문에

나의 코딩 시간은 많은 부분은 이름을 지을려고 생각하는데 소비되곤 한다. 그냥 영어가 딸려서 그런걸지도 모르고

 

 

 

셋째로 storeUserPaymentCardId가 var로 선언이 되어있는데

바뀔 일이 없기 때문에 val으로 선언해주는게 더 좋지 않았나..?

이 부분에 있어서는 var로 선언했을 때 치명적인 실수가 발생될 수 있는 상황이 그려지지 않아서

확답은 못하겠음

 

그외 이 코드만 봐선 알 수 없지만 

additionalSummaryId같은 경우에는 처음 로컬 DB에서 넘어왔을 땐 nullable하지만

로컬에서 첨 받아서 이 데이터 클래스로 넘겨주는 순간 null 체크로 null이면 공백문자가 들어가게 되어있는데

특별한 이유가 있나 하고 사용처를 확인해보니

뒤에서 결국 if payCardModel.additionalSummaryId == "" {} 이딴식으로 공백문자 체크하는거 보면

그냥 additionalSummaryId를 nullable타입으로 선언해주고 kotlin의 편한 null처리 연산자를 사용하는게 맞음

 

 

 

 

좆도 아닌 코드에 설명이 길어졌는데

이유는 항상 수용소에 올리는 문제는 읽는건지 마는건지 설명이 부족한건지 의견이 안 달리길래

확실히 이해해줬으면 해서 예시까지 좀 더 세세하게 써봤다

더 좋거나 다른 의견, 궁금증 혹은 "이 병신새끼 틀렸는데?" 하는 부분이 있으면 댓글로 막고라를 떠보자

  • profile
    하야한아이 2021.01.04 00:56
    꼭 안드로이드 뿐 아니라 다른 언어도 마찬가지긴 해서 대체로 맞는말인듯
    1번 줄이는것도 그렇고 2번의 경우 어떤 구조냐에 따라 다르겠지만 userPaymentCardModel을 두고 store 이런거에서 또 각각 상속받아 쓸 수 있게 구성하는것도 방법일듯
    변수형이 상수냐 변수냐는 다른 비즈니스로직 봐야 알거고
  • profile
    마루쉐 2021.01.04 01:26
    아찐콘 라이즈 icon_3
  • profile
    우지챠 2021.01.04 04:03(수정됨)
    .
  • profile
    마루쉐 2021.01.04 08:57
    모든 언어엔 컨벤션이라는 공통된 규칙이 존재함
    이유는 라이브러리나 프레임워크를 만들어서 남이 쓰기 때문인데
    예를 들어 파이썬에서 쓰는 셀레늄?(뭔지 잘몰름)은 님이 만든게 아니라 남이 만든거잖슴
    거기에 보면 함수 이름이 언더스코어로 되어 있을텐데
    셀레늄을 가져다 쓰는 님이 만든 프로젝트에선
    함수이름을 카멜케이스로 쓴다면 남이 님 코드를 봤을때 혼란스러울거임
    그래서 언어마다 이정도는 지켜라~하는 규칙이 존재함

    저는 코틀린 컨벤션에 나와있는대로 쓴거임
    파이썬은 또 다르고 자바스크립트도 다르겠지
    구글에
    python code convention
    python code style
    이렇게 치면 공식 사이트에 공식문서로 나올거임
    정 영어로 읽기 어려우면 남이 번역해둔거 봐도 되고(근데 귀찮아서 그런지 다 번역하는 사람은 본적없음)
  • profile
    하야한아이 2021.01.04 11:17(수정됨)
    js같은건 lowerCamelCase, c#같은건 UpperCamelCase 이런식으로 자기네들 권장 컨벤션이 다 있음
  • profile
    우지챠 2021.01.04 04:04(수정됨)
    .
  • profile
    마루쉐 2021.01.04 09:09
    그냥 동아리였는데
    잘돼서 사업으로 바뀌고 거기에 자연스레 취업느낌으로 묻어감
    서류나 면접 한번도 안 해봐서 뭐라 딱히 할 말은 없음
    편의점 취업은 제가 또 고수긴 한데
  • profile
    MDR 2021.01.05 02:03
    오 ㅆㅅㅌㅊ노 능력자게이 ㄷㄷ
  • profile
    스탈린 2021.01.05 04:36
    나도 alias 먹이는거 생각했는데 더 귀찮겠노

List of Articles
번호 제목 글쓴이 날짜 조회 수 추천
공지 수용소닷컴 이용약관 file asuka 2020.05.16 1312 1
1110 대학생 때 세웠던 목표를 이뤘음 7 file 마루쉐 2021.09.14 188 10
1109 오늘 한 프로젝트: 그래픽 광량 표현 12 file 우지챠 2021.01.05 245 8
1108 키 마우스 매핑 프로그램 만들었음 10 file '`' 2022.08.30 206 6
1107 아두이노 공부 fnd 편 4 file 코르캐쉬 2022.05.05 122 6
1106 서버 3대 렌탈함 4 file 만년필 2021.07.18 110 6
1105 정보) 수용서의 기본소양 1편, 짤검색에 대해서 araboji. 8 file 하루각하 2021.01.06 243 6
1104 좆본 IT 취업 가이드 ~ 간략판 ~ 9 抱き枕 2020.07.22 243 6
1103 노트북 정보 모음 13 file 으ㅇ유ㅏ」 2021.12.14 155 5
» 오늘자 리팩터링 9 file 마루쉐 2021.01.03 171 5
1101 올해 프로그래머로서 제 목표 1 마루쉐 2023.01.04 52 4
1100 이거 키트 절대 사지 마라 12 file 삼육두유 2022.10.10 109 4
1099 우흥 4 file 삼육두유 2021.09.23 108 4
1098 잡아도 잡아도 끊임없이 나오는 버그 2 file 머스크멜론 2021.09.11 96 4
1097 초간단 js 추첨기 4 하야한아이 2021.04.07 126 4
1096 개좆소 이벤트 추첨기 구상 6 스마일 2020.07.17 126 4
1095 UPS 2종 비교 (델타 N-1K, APC SMT750iC) 5 file 만년필 2021.08.29 158 3
1094 swift enum을 활용한 코드 수정 1 file 마루쉐 2021.03.10 69 3
1093 2024년도 기사, 산업기사 시험 일정 및 주요 변경사항 2 file 말랑이 2023.12.29 78 2
1092 그리드 2022.12.06 13 2
1091 이것저것 쓸만한 사이트 2 5 file 저능아 2022.11.22 32 2
목록
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 56 Next
/ 56