JD의 블로그

[Software engineering] Refactorin 본문

-프로그래밍 언어

[Software engineering] Refactorin

GDong 2019. 11. 9. 20:21

리펙토링은 많이 들어본 단어이다. 

"리펙토링(refactoring)은 주로 '결과의 변경 없이 코드의 구조를 재조정함'을 뜻한다."

 

그러나 정확하게 리펙토링이 무엇을 뜻하는지 자세히 생각해본 적은 없는데 이번 기회에 공부할겸 한 번 정리해보려고 한다. 

 

Code refactoring은 

기존의 기능을 변경하지 않고, 프로그램 내부 구조를 변경하는 과정이다.

왜?, 소프트웨어 내부적인 quality attribute를 향상시키기 위해!

"A quality attribute (QA) is a measurable or testable property of a system that is used to indicate how well the system satisfies the needs of its stakeholders. "

 

또한 Code refactoring은 유지보수성을 향상시켜준다.

( 코드를 좀 더 쉽게 이해할 수 있고, 확장성을 늘려준다.)

 

1. 복잡한 표현은 지양하라

위의 코드에 비해, 아래 코드의 명확함을 보아라!

 

 

2. 내부 클래스의 메서드보다 외부 클래스의 메서드를 많이 사용한다면, 그것은 좋지 못하다.

overdraftCharge() 메서드는 AccountType 클래스의 메서드를 많이 이용하므로 AccountType 클래스 안으로 !

 

언제 리펙토링을 고려해야하는가?

1. 프로그램에 무엇인가 추가해야한다는 것을 찾았을 때 (추가해야할지도 모를때!)

2. 그리고 새로운 것을 추가할 때 개발자가 수정하기에 편리한 방식의 구조를 가진 코드가 아닐 때!

 

소스 코드를 리펙토링할 때 도와주는 도구를 활용하는 것은 필수이다!

(Java 를 위한 리펙토링 툴은 많지만 C++을 위한 것은 별로 없다..)

 

 

[1] Split Temporary Variable

loop varaible과 collecting temporary varaible이 아닌 임시 변수가 두 번 이상 할당되면 다른 변수 이름으로 선언해라

temp가 두 번 할당됨

 

[2] Introduce Assertion

Assert로 가정을 명확하게 만든다 

 

[3] Replace Error Code with Exception

메서드가 에러를 알리기 위해 특수한 코드를 return하게 만든다. '

[4] Replace Nested Conditional with Guard Clauses

분명하지 않는 작동 방식을 가진 메서드를 수정한다.

 

 

[5] Replace Magic Number with Symbolic Constant

특정한 의미를 가지는 고유한 숫자는 literal number로 변환해서 써라

 

[6] Extract Method

함께 합쳐질 수 있는 코드는 합쳐라

메서드의 목적을 나타낼 수 있는 이름을 가진 메서드로 합쳐라

[7] Replace Parameter with Explicit Methods

enumerated paramter의 값에 따라 다른 코드가 돌아가는 메서드의 경우 각각의 파라미터에 따른 분리된 메서드를 만들어서 사용해라