본문 바로가기

Programming/SW Engineering , Architecture, etc.

How to refactoring, 리팩토링 하는 방법, 코드 리팩토링이란? What is code refactoring? / Java/c++/clean code/oop

How to refactoring, 리팩토링 하는 방법, 코드 리팩토링이란? What is code refactoring? / Java/c++/clean code/oop


 딱 순서를 정해두고 리팩토링을 하지는 않지만, 리팩토링시에 고려할 만한 것들이 이것저것 들어있는 글이라서 해석함
끝에선 모호한 표현이 좀 있음

I didn't do refactoring with exact ordering, but it has some considerable things when we refactoring. So i translated.
There is kinda grey area in the end of the post



Origin ( Here )
원문 ( 여기 )



How do I learn refactoring in Java?

 



What is refactoring?  리팩토링이란 무엇인가?


 Refactoring is eliminating unused and duplicated code, and making the logic of the code and its design clearer to understand.
Refactoring, as originally defined by Martin Fowler and Kent Beck, is “A change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior… It is a disciplined way to clean up code that minimizes the chances of introducing bugs.”

 Refactoring is often confused for: optimization, debugging, adding defensive code and making the code more testable. Regardless of the fact that these are good programming practices, they are not refactoring.
What refactoring is, is protecting yourself from making mistakes. This can be done by making small and safe structural changes to the design of your code, while keeping the behaviour the same. You should continuously test your code to make sure it is operating correctly and the behaviour is not affected.

 Your reason for refactoring should be to make fixes or changes to your code. The process should be aimed at making your code easily understandable and more maintainable.


 리팩토링은 사용하지 않는 코드나 중복된 코드를 지우고, 코드의 로직을 더 깨끗하고 이해하기 쉽게 디자인하는 것이다.
리팩토링은 처음에 Martin Fowler 과 Kent Beck 에 의해 정의되었는데, 소프트웨어의 내부 구조를 바꿔서 이해하기 쉽고, observable behavior 의 변화 없이 수정하기 쉽도록 하는 것이다. 이것은 버그를 만들 확률을 최소화하기 위해 코드를 깨끗이 하는 방법이다.

 리팩토링은 종종 최적화, 디버깅, 방어코드 추가, 테스트하기 좋은 코드로 만드는 것과 혼동된다. 앞의 것들이 좋은 프로그래밍 연습인 것과 상관없이, 저것들은 리팩토링이 아니다.
 리팩토링은 실수를 만드는 것을 방지하는 것이다.이것은 코드 디자인에 작고 안전한 구조적 변화를 추가하는 것으로 할 수 있는데, 같은 동작을 유지해야 한다. 지속적으로 코드가 정상 동작을 하는지 확인해야하고, 동작에 영향을 주면 안된다.

 리팩토링의 이유는 코드를 고치거나 바꾸는 것이 될 수 있다. 이 과정은 코드를 쉽게 이해하고 유지보수에 좋게 하는 것에 초점이 맞춰져야 한다.


 


Process of refactoring  리팩토링의 과정


Detect a problem  문제를 찾는다.

Is there a problem? What is the problem?

문제가 있나? 
무엇이 문제인가?


Characterise the problem  문제를 특징 짓는다.

Why is it necessary to change something? What are the benefits? Are there any risks?

왜 뭔가를 바꿔야 하는가? 
이점은 무엇인가? 
위험한 점은?


Design a solution  솔루션을 디자인한다

What should be the "goal state" of the code? Which code transformation(s) will move the code towards the desired state?

코드의 최종목적이 무엇이 되어야 하나?
어떤 코드의 변환이 적당한 상태를 위해 움직일 코드인가?


Modify the code  코드를 수정한다

Steps that will carry out the code transformation(s) that leave the code functioning the same way as it did before.

코드 변환이 수행될 것의 코드 기능은 이전에 기능하던 것과 동일하게 되도록 남겨두어야 한다.



Examples of refactoring  리팩토링 예제, 예시


Rename  이름 재설정

Methods, variables, classes or other java items. Changing the name of a Java item to make it less confusing and misleading.

메소드, 변수, 클래스들, 다른 자바 아이템. 자바 아이템의 이름을 덜 혼동가고 오해가 없도록 수정한다.

Move Class  클래스의 이동

Moving a class into a package where it would fit better. All import statements should refer to the given class.

 클래스를 더 잘 맞는 패키지로 이동시킨다. 모든 추가된 구문들은 주어진 클래스를 참조하는게 좋다. ??

Extract Method  메소드를 추출해낸다.

Break up long methods to improve readability and maintainability. Replace a section of code that accomplishes a single task with a new method with a descriptive name. This will also allow methods to be reused for a specific function.

 긴 메소드를 쪼개서 가독성과 유지성을 높인다. 한가지 일을 수행하는 코드의 부분을, 서술적인 이름의 새로운 메소드로 만든다. 이것은 또한 특정 기능을 재사용하도록 해준다.

Extract Superclass  수퍼클래스를 추출해낸다.

Methods which are common to a concrete classes are "pulled up" with definitions, while those that will vary in subclasses are left abstract. This aids in efficient code re-use and allows new subclasses to be created and used.

 구체화 시키는 클래스들 중에서 공통된 메소드는 정의를 위로 올리고, 서브 클래스에서 다양한 것들은 추상메소드로 남겨둔다.  이것은 효율적인 코드 재사용을 도와주고, 새로운 서브클래스들이 만들어지고 사용되는 것을 허락해준다. 

Replace Conditional with Polymorphism  다형성을 조건으로 하는 것을 대체한다.

Methods (if or switch statement) used in decision making. An example is a class used to draw a shape defined by its width and type. One can use polymorphism to prevent duplication. If a the class behaviour is specific to the shape, it can be offloaded to that subclass to simplify the code. This makes it easier to draw other shaped without making extensive changes to the code.


 if 나 switch 같은 의사결정 메소드를 만든다. 예를들면, 너비와 타입에 의해 정의된 모양을 그리는데에 사용되는 클래스가 있다. 하나는 중복을 방지하기 위해 다형성을 쓴다. 만약 클래스의 동작이 형태에 특정하다면, 코드를 단순화 하기 위해서 서브클래스로 내릴 수 있다. 이것은 코드의 큰 변화 없이 다른 모양을 그리기 쉽게 만들어 준다.




Something else you might like...?





2019/01/30 - [Programming/Software Architecture] - What is Object Oriented Design/Artchitecture? 객체지향 디자인/설계란? java,c++,softwareArchitecture,designPattern


2019/01/29 - [Programming/Programming Language] - 클린코딩/더 나은 코딩을 하는 10가지 방법, 10 Tips for clean code/ better code/ quality code.



2019/01/31 - [Algorithm/Leet Code] - LeetCode #593 ValidSquare. Algorithm,알고리즘,LeetCode,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive,datastructure,techinterview,coding,코딩인터뷰,기술면접

2019/02/01 - [Algorithm/Leet Code] - LeetCode #905 SortArrayByParity. Algorithm,알고리즘,LeetCode,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive,datastructure,techinterview,coding,코딩인터뷰,기술면접

2019/02/03 - [Algorithm/Leet Code] - LeetCode #398 RandomPickIndex. Algorithm,알고리즘,LeetCode,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive,datastructure,techinterview,coding,코딩인터뷰,기술면접

2019/02/03 - [Algorithm/Leet Code] - LeetCode #393 UTF-8 Validation. Algorithm,알고리즘,LeetCode,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive,datastructure,techinterview,coding,코딩인터뷰,기술면접

2019/02/08 - [Algorithm/Leet Code] - LeetCode #400 NthDigit. Algorithm,알고리즘,LeetCode,Codefights,CodeSignal,코드파이트,코드시그널,예제,문제해결능력,example,c++,java,재귀,recursive,datastructure,techinterview,coding,코딩인터뷰,기술면접



2019/02/06 - [Programming/Android] - How to use Android Device Monitor in current version of AndroidStudio, 안드로이드 스튜디오 최신버전 디바이스 모니터, java c++ process


2019/02/04 - [Programming/C++] - How to add DLL / external lib file to VisualStudio, 비주얼스튜디오 외부라이브러리 dll 파일 추가 방법, example, c++ java api



2018/12/26 - [Programming/Software Architecture] - Perfecting OO's Small Classes and Short Methods. 완벽한 객체지향의 작은 클래스와 짧은 메소드, Book:ThoughtWorks Anthology, Java,cpp,자바,oop,좋은코드,객체지향프로그래밍 (1)

2018/12/28 - [Programming/Software Architecture] - Perfecting OO's Small Classes and Short Methods. 완벽한 객체지향의 작은 클래스와 짧은 메소드, Book:ThoughtWorks Anthology, Java,cpp,자바,oop,좋은코드,객체지향프로그래밍 - (#9, Tell, Don't Ask)



2018/12/26 - [Life/Health care] - Selenium 셀레늄 usage/side effects/dosage 효능/부작용/성인,소아 용법

2018/12/27 - [Life/Health care] - Milk-Thistle 밀크시슬 usage/side effects/dosage/fatigue/supplement,효능/부작용/성인,소아 용법/건강/피로회복/영양제

2019/01/25 - [Life/Health care] - L-Arginine 아르기닌 usage/side effects/dosage 효능/부작용/성인,소아 용법(3)

2019/01/17 - [Life/Health care] - Zinc 아연 usage/side effects/dosage/fatigue/supplement/antioxidant/효능/부작용/성인,소아 용법/건강/피로회복/영양제/항산화