반응형

리팩터링이란?

리팩터링은 겉으로 드러나는 코드의 기능 (겉보기 동작)은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어 시스템을 수정하는 과정이다. 버그가 생길 가능성을 최소로 줄이면서 코드를 정리하는 정제된 방법이다. 

즉 => 선 코딩, 후 개선

리팩터링
리팩터링


리팩터링 REFACTORING

[명사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법

[동사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다.


'프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형태로 리팩터링 하고 나서 원하는 기능을 추가한다. '

리팩터링이 필요한 이유

-새로운 요구사항을 쉽게 반영하기 위해서

-함수가 복잡하면 수정이 어렵고, 수정 과정에서 실수할 가능성도 커짐->단순하게 만들기

-나중에 변경할 일이 절대 없는 코드는 거의 없음 <-요구사항 변경됨

-리팩터링 하면 소프트웨어 설계가 좋아짐

-소프트웨어를 이해하기 쉬워짐

-버그를 쉽게 찾을 수 있음

-프로그래밍 속도를 높임


리팩터링 하는 타이밍

1. 처음에는 그냥 한다.

2. 비슷한 일을 두 번째로 하면, 일단 계속 진행한다.

3. 비슷한 일을 세 번째 하게 되면 리팩터링 한다.


리팩터링의 첫 단계

TDD: Test Driven Development

꼼꼼하게 검사해 줄 테스트 코드들을 작성한다. 그리고 코드가 하는 일을 파악한다.

<장점>

-성공/실패 여부를 빠르게 파악할 수 있다.

-논리가 예상대로 잘 작동하는지 일일이 검사하기 힘들다.

-버그를 검출해 주기 때문에 실수를 방지해 준다.

-신경 써서 만들면 디버깅 시간이 줄어 전체 작업 시간은 단축된다.


함수 쪼개기

긴 함수 안에 작은 함수가 있는지 살펴본다. 여러 가지 기능이 포함되었는지 살펴본다. 

-입/출력 부분을 밖으로 뺄 수 있는지?

-switch/if, else 구문을 함수로 추출할 수 있는지?

-함수 이름에 맞지 않은 일을 하는지?

예를 들어 printInvoice라는 함수인데, 안에서 복잡한 계산을 한다던가..

-복잡하게 얽힌 덩어리를 잘게 쪼갠다는 느낌으로 함수 쪼개

주의사항

값을 변경하지 않는 변수라면 매개변수로 전달

함수 안에서 값이 바뀐다면, 새로운 함수에서 정의하고 return

function amountFor(perf, play){ //값이 바뀌지 않는 변수는 매개변수로 전달
    let thisAmount =0; //변수를 초기화하는 코드
    ...
    return thisAmount;
}

리팩터링 후에는 항상 테스트하는 습관을 들일 것.


임시 변수 함수로 선언

임시 변수였던 format을 함수 호출로 대체하는 리팩터링

//before
function statement(invoice, plays){
...
const format = new Intl.NumberFormat("en-US",
        {style:"currency",currency:"USD", minimumFractionDigits:2}).format;
...
result +=`총액: ${format(totalAmount/100)}\n`;
}

//after
function format(aNumber){
    return new Intl.NumberFormat("en-US",
        {style:"currency",currency:"USD", minimumFractionDigits:2}).format(aNumber);
}

function statement(invoice, plays){
...
result +=`총액: ${format(totalAmount/100)}\n`;
}
반응형