소스코드 리팩토링

2021. 5. 2. 14:44공부/오픈소스를 활용한 DevOps 환경 이해

반응형

Code Smell

코드가 시간이 지나면서 요구사항과 기능들이 추가되면서 추상화, 모듈화, 캡슐화가 되지 않고 높은 결합성, 낮은 응집성, 낮은 가독성으로 이루어진 코드로 변하면서 점점 유지, 보수 및 확장이 어려운 애플리케이션이 되어가는 상태

-> 리팩토링이 필요

코드 리팩토링

기존 코드를 재구성하여 외부 동작을 변경하지 않고 내부구조를 변경하는 체계적 코딩 기술

소스코드의 로직을 단순화하고 불필요한 수준의 복잡성을 제거하게 됨

버그나 취약점을 쉽게 발견하고 수정할 수 있어 유지보수 및 확장성이 좋아짐

->버그 수정, 기능 추가 등과는 달리 외부에서 보는 프로그램 동작은 변하지 않았지만 프로그램 내부 구조 개선을 통해 쉽게 버그를 발견하고 기능 추가 및 리뷰하기 쉽게 만든다.

리팩토링 개념 및 기법

  • 성명 변수로 전환 : 의미를 알기 쉬운 이름의 변수로 Logic을 쉽게 표현
  • 제어 플래그 삭제 : 처리 흐름을 제어하는 플래그로 인해 코드가 복잡해질 경우, break, continue, return 등을 사용
  • 배열을 객체로 전환 : 서로 다른 의미를 가진 요소들이 한 배열에 있을 경우
  • 메서드 : 메서드는 15줄 이내로 작성 (커질 경우 분리) 
    • -> 작은 단위는 이해하고, 재사용하기 쉬워 유지보수성이 좋아짐
  • 메서드 추출 : 하나의 메서드는 한 가지 기능에만 충실
  • 메서드 객체로 대체 : 전달하는 Parameter 수가 많은 경우 객체로 전달하는 것을 고려할 것
  • 점점 복잡해지는 소스코드 : 분기점이 줄면 코드 수정 및 테스트가 쉬워지게 됨
  • 분기문 중첩 해소
  • 분기분 분해 (알고리즘 교체)
    • 알고리즘 대상을 추출하여 대체
    • 메서드 내 분기문은 4개 이내 (복잡한 단위는 작게 나누고 서로 뭉치지 않게 한다)
    • 분기 코드마다 다른 동작을 할 경우 객체지향 다형성을 이용해 하위 클래스로 치환
  • 클래스 추출 : 하나의 클래스는 한 가지 작업에만 충실
  • 코드 복사 금지 : 재사용 가능한 코드 형태 또는 기존 메서드를 추출 
    • -> 코드를 복사하면 향후 버그가 발생한 경우 복사한 만큼 많은 지점에서 버그를 고쳐야 하기 때문에 에러 발생 가능성이 높아짐
  • 상위 클래스 (Super Class)로 추출
  • 인터페이스를 작게 유지 (4개까지)
  • 관심사의 분리 (낮은 결합도, 높은 응집도) : 모듈 간 결합을 느슨하게 하고, 되도록 큰 모듈은 지양
    • 클래스로 분리하고, 상세한 구현은 인터페이스를 통해 캡슐화
  • 수레바퀴의 재발명 : Custom Code를 Java Lib., 3rd Party Lib., Framework 등으로 대체
  • 아키텍처의 균형 : 최상위 수준의 컴포넌트 간 결합도를 낮춰라 
    • -> 독립 컴포넌트는 유지 보수성이 올라감
    • 타 컴포넌트 모듈에 호출을 받는 형태로 공개된 모듈 내부의 상대적인 코드량을 최소화하라
반응형