2장 : 리팩터링 깊게 들여다보기
의문점
- 불변속성(invariant), 가정설정문(assertion)
- 불변속성?
- 객체가 정상적으로 작동하기 위해 값, 식, 상태의 일관성 보장하기위해 항상 참이 되기 위한 조건
- 기름양은 0 ≤ oil ≤ 100 사이여야만 함
- 이 범위를 벗어나면 안되는 조건을 불변속성이라 함
-
- 디자인패턴 → 상속보다는 컴포지션
학습목표
- 가독성을 통한 의도 전달이란?
- 유지보수성 개선을 위한 불변속성(invariant) 지역화란?
- 개발속도 향상을 위한, 추가(addition)를 통해 변경가능하게 만들기란?
- 리팩터링의 일상 업무화란?
키워드
1. 가독성을 통한 의도 전달이란?
2. 유지보수성 개선을 위한 불변속성(invariant) 지역화란?
- 가독성 및 유지보수성 향상
- 가독성 :
- 정의 : **의도를 전달**하기 위한 코드의 성질
- 의도 전달 방법 : 커딩컨벤션, 주석, 변수 메서드 클래스 파일이름 지정, 공백
- 유지보수성 :
- 정의 : 얼마나 많은 ‘후보’를 조사해야하는지, 즉 버그수정 기능 추가시 새 코드 어디에 놓을지 ‘후보위치(context)’를 조사하는것으로 시작함
- 취약하다(fragile) : 무언가를 수정하면 관련없어 보이는 다른곳에서 문제가 발생
- 취약성의 근원 : 전역상태(global state) 이다.
- 전역(global)이란 고려한 범위(scope)를 벗어난 것
- 상태(state)란 프로그램 실행동안 변경될 수 있는 모든것
- 전역상태 판단기준 : 중괄호 찾기(중괄호 외부의 모든것이 → 중괄호 내부의 모든 것에 전역상태로 간주됨)
- 전역상태의 문제
- 내부변수에 외부데이터(전역적)할당시 데이터 손상 가능성 존재
- 코드에서 상태(조건)를 명시적으로 확인하지 않는 속성을 **불변속성** 이라고함
(e.g. 식료품과 전구)
- 변수 명시적 체크해서 불변속성 제거해 유지보수성 향상 시킬 수있으나, 리팩터링이 아님
- 여기서 리팩터링은 불변속성을 쉽게 볼수있게끔 가깝게 이동해서 유지보수성을 향상 → **불변속성의 범위제한(localizing invariants)**
- 리팩터링의 핵심
- 가독성, 유지보수성 향상 외 범위 밖 코드 영향 주지않기
- 코드를 블랙박스로 생각하고, 외부에 영향주지않는 내부의 모든 작업 변경 → 리팩터링 전후 동일결과(+ 예외도 )
3. 개발속도 향상을 위한, 추가(addition)를 통해 변경가능하게 만들기란?
- 상속보다 컴포지션 사용
- 리팩터링 패턴은 변수명 변경부터 추상적 전역적인 것 까지 다양한 수준 존재 → 가장큰것이 아키텍처 변경
- ‘상속보다 컴포지션 사용하라’ : 객체가 내부에 다른객체의 참조를 가지기
- 상속과 컴포지션의 결과적 차이
- 상황 : 상위 클래스 메소드 추가 but 하위클래스 해당메소드 구현 X
- 컴포지션 방식: 컴파일 오류
- 상속 방식 : 재정의를 작업자가 기억해야함 → 간과하기 쉬움
- 컴포지션 중심 시스템의 이점
- 유연성 : 더 깔끔하게 코드결합과 재사용가능 → 레고 블럭처럼 빠르게 가능
- 추가(addition)로 변경이 가능 : OCP 원칙
- 프로그래밍 속도 향상
- 다른 코드를 건들이지 않고 변경 → 속도 향상
- 안정성(stability)
- 새코드 실패시 이전기능으로 대체하는 기능을 구현하는것 쉬움 → 기존코드를 항상 보존 가능
4. 리팩터링의 일상 업무화란?
- 리팩터링과 일상 업무
- 보이스카우트 규칙 - 항상 여러분이 왔을 때 보다, 더 좋게 만들어 놓고 떠나세요
- 기술부채 : 리팩터링 X 로 코드를 전달하면 다른 개발자 시간을 빼앗음 → 이자가 붙음
- 도메인 정하기
- 소프트웨어란 실행활의 특정 측면을 모델링한것임
- 소프트에어와 대응되는 실세계는 항상 존재함 → 실제 세계의 구성요소를 SW의 도메인이라고 함
- 도메인이란 ‘사용자와 전문가’, ‘고유한 용어’, ‘고유의 문화’가 있음
- 프로그래밍이란?
- 학습과 의사소통에 관한것
- 도메인 전문과와 긴밀이 협력하고 용어와 문화를 배워야함
- 코딩언어는 모호성은 허용하지않기 때문에 도메인전문가도 낯선 코너케이스(corner case) 찾아야함
요약
가독성을 통한 의도 전달이란?
유지보수성 개선을 위한 불변속성(invariant) 지역화란?
- 기능 변경없이 의도전달과 불변속성 범위 제한
개발속도 향상을 위한, 추가(addition)를 통해 변경가능하게 만들기란?
- 컴포지션 사용 → OCP 방식 채택 → 속도, 유연성, 안정성 향상
리팩터링의 일상 업무화란?
- 리팩터링 연습은 독특한 관점 얻을 수있음
나눔
+: 리뷰문화 너무 중요~ → 리딩할 사람도 필요
→ +코드와 사람의 동일시 기업은 리뷰가 어려움 → 회사의 자산인데, 개개인의 것으로 앎 → 열린자세가 바람직 → 틀림이 아닌 다른것 ㅋㅅㅋ
+: 리딩 필요
→ 리뷰자체가 go to mountain ㅜㅜ → 확고인 + 1명이 있으면 방향성 문제시됨
→ 비즈니스로직은 잘 모르더라도, 코드스멜로 파악할수있지안을까?
'cleanCode > FiveLinesOfCode' 카테고리의 다른 글
[FiveLinesOfCode] 6장: 유사한 코드 융합하기 (1) | 2023.10.29 |
---|---|
[FiveLinesOfCode] 5장 유사한 코드 융합하기 (1) | 2023.10.29 |
[FiveLinesOfCode] 4장 타입코드 처리하기 (1) | 2023.10.08 |
[FiveLinesOfCode] 3장 : 긴 코드 조각내기 (1) | 2023.10.03 |
[FiveLinesOfCode] 1장 : 리팩터링, 리팩터링 하기 (0) | 2023.10.03 |