cleanCode/FiveLinesOfCode

[FiveLinesOfCode] 2장 : 리팩터링 깊게 들여다보기

Mo_bi!e 2023. 10. 3. 20:29

2장 : 리팩터링 깊게 들여다보기

의문점

- 불변속성(invariant), 가정설정문(assertion)
- 불변속성?
- 객체가 정상적으로 작동하기 위해 값, 식, 상태의 일관성 보장하기위해 항상 참이 되기 위한 조건
- 기름양은 0 ≤ oil ≤ 100 사이여야만 함
- 이 범위를 벗어나면 안되는 조건을 불변속성이라 함
-
- 디자인패턴 → 상속보다는 컴포지션

학습목표

  1. 가독성을 통한 의도 전달이란?
  2. 유지보수성 개선을 위한 불변속성(invariant) 지역화란?
  3. 개발속도 향상을 위한, 추가(addition)를 통해 변경가능하게 만들기란?
  4. 리팩터링의 일상 업무화란?

키워드

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) 찾아야함

요약

  1. 가독성을 통한 의도 전달이란?

  2. 유지보수성 개선을 위한 불변속성(invariant) 지역화란?

    • 기능 변경없이 의도전달과 불변속성 범위 제한
  3. 개발속도 향상을 위한, 추가(addition)를 통해 변경가능하게 만들기란?

    • 컴포지션 사용 → OCP 방식 채택 → 속도, 유연성, 안정성 향상
  4. 리팩터링의 일상 업무화란?

    • 리팩터링 연습은 독특한 관점 얻을 수있음

나눔

+: 리뷰문화 너무 중요~ → 리딩할 사람도 필요
→ +코드와 사람의 동일시 기업은 리뷰가 어려움 → 회사의 자산인데, 개개인의 것으로 앎 → 열린자세가 바람직 → 틀림이 아닌 다른것 ㅋㅅㅋ

+: 리딩 필요
→ 리뷰자체가 go to mountain ㅜㅜ → 확고인 + 1명이 있으면 방향성 문제시됨

→ 비즈니스로직은 잘 모르더라도, 코드스멜로 파악할수있지안을까?