SlideShare uma empresa Scribd logo
1 de 23
리펙터링
DevRookie JINN
참고자료
리펙터링
• 코드의 동작은 바꾸지 않으면서 내부 구조를 개선하는 방식으
로 소프트웨어 시스템을 수정하는 과정
• 버그가 생길 가능성을 최소로 줄이면서 코드를 정리하는 기법
리펙터링의 장점
• 코드를 이해하기 쉬워진다
즉 버그를 찾기 쉬워지고 확장성이 증가하여 기능을 추가하는 속도가
증가하여 개발 속도가 빨라진다
개발 속도가 빨라짐으로서 경제적 이익을 추구할 수 있음
리펙터링의 목적은 코드를 예쁘게 꾸미는 것이 아닌
오로지 개발 기간을 단축해 경제적인 이익을 얻고자 할 뿐이다
리펙터링 기법 -함수 추출
• 함수를 언제 분리할 것인가
1. 함수가 길 경우
2. 두 번 이상 사용될 경우
3. 목적 & 구현을 분리할 수 있을 경우
함수 추출 절차
1. 어떻게가 아닌 무엇을 하는지 드러나는 이름을 짓는다
2. 만든 함수로 코드 복붙
3. 추출한 함수의 유효범위를 벗어나는 변수가 있다면 매개변수로 전달한다.
4. 기존의 코드를 새로 만든 함수로 치환한다
5. 컴파일하고 테스트한다
6. 비슷한 코드가 있는지 살피고 추출한 함수로 바꿀지 검토한다
리펙터링 기법 – 함수 인라인
• 함수 인라인 절차
1. 다형성 함수(가상 함수)인지 확인한다
2. 해당 함수를 호출하는 곳을 모두 찾아 교체한다
3. 하나씩 교체할 때마다 테스트한다
4. 함수 정의를 삭제한다
여기서 말하는 리펙터링은 레거시 코드를 대규모로 고치는 행위가 아닌
개발과 동시에 조금 조금씩 개선해나가는 것임을 명심
리펙터링 기법 – 변수 추출
// 가격 = 기본가격 – 수량 할인 + 배송비
return ProductCount * ProductPrice –
max(0,order.quantity - 500) * ProductPrice * 0.05 +
min(ProductCount * ProductPrice * 0.1, 100);
• 변수 추출 절차
1. 추출하려는 식에 부작용이 없는지 확인한다
2. 변수를 선언하고 식을 추출해 복붙한다
3. 원본 표현식을 변수로 교체
4. 테스트
5. 중복된 표현식이 있는지 확인하고, 테스트와 함께 하나씩 교체한다
리펙터링 기법 – 변수 추출하기
• 추출된 변수는 디버깅에도 도움이 된다
• 클래스 멤버 함수의 동작이라면 가능하다면 함수로
추출하는게 좋다
// 가격 = 기본가격 – 수량 할인 + 배송비
return ProductCount * ProductPrice –
max(0,order.quantity - 500) * ProductPrice * 0.05 +
min(ProductCount * ProductPrice * 0.1, 100);
int basePrice = ProductCount * ProductPrice;
int discount = max(0, order.quantity - 500) * ProductPrice * 0.05;
int shipping = min(ProductCount * ProductPrice * 0.1, 100);
return basePrice - discount + shipping;
리펙터링 기법 – 변수 인라인
int& basePrice = order.basePrice
return basePrice > 1000;
return order.basePrice > 1000;
• 변수 자체가 원래 표현식과 다를 바 없을 때는 인라인하는 것이 좋다
리펙터링 기법 – 함수 이름 변경
class A
{
...
public:
setSize() { … getSize()};
};
…
class B
{
...
public:
setSize() { … getSize()};
};
class C
{
...
public:
setSize() { … getSize()};
};
호출하는 곳이 많거나
호출과정이 복잡하거나
인자를 많이 추가해야하거나 등등
쓰는 곳이 많고, 커플링이 심한 함수일 때
리펙터링 기법 – 마이그레이션
• 마이그레이션 절차
1. 새로운 함수 추출
2. 테스트
3. 기존의 함수는 Deprecated 주석을 달아준다
4. 천천히 테스트와 함께 하나씩 교체
5. 모든 함수가 교체되었을 때 삭제한다
리펙터링 기법 – 반복문 쪼개기
• 반복문 하나에서 여러가지 일을 수행할 경우
반복문이 변경될 때마다 모든 일을 파악하고 있어야함
하나의 함수가 여러가지 일을 하고 있다는 의미
리팩터링은 최적화가 아니다!
최적화는 코드를 정리하고 난 뒤에 하자
반복문이 증가되어 문제가 생길 경우 다시 하나로 합치는 건 식은 죽 먹기
아니 이거 반복문이
두 번 돌아버리는데?
리펙터링 기법 – 변수 분리
int temp = 2 * SizeX + SizeY
cout << temp << endl;
temp = SizeX * SizeY
cout << temp << endl;
const int perimeter = 2 * boxSizeX + boxSizeY;
cout << perimeter << endl;
const int area = SizeX * SizeY;
cout << area << endl;
• 변수 분리 절차
1. 변수 선언과 값을 첫번째 대입하는 곳에서 변수명을 바꾼다, 가능한 const로
2. 두번째 대입할 곳의 앞까지 변수명을 전부 새로운 변수명으로 변경한다
3. 두번째 대입하는 곳의 변수명을 원래 이름으로 바꾼다
4. 테스트하면서 위 과정을 반복
리펙터링 기법 – 함수를 클래스로 묶기
void 시계보기(핸드폰);
void 영화보기(핸드폰);
void 만화보기(핸드폰);
void 똥싸기(핸드폰);
void 친구만나기(핸드폰);
class 사람
{
public:
void 시계보기();
void 영화보기();
void 만화보기();
void 똥싸기();
phone _핸드폰;
};
• 클래스 묶기 절차
1. 함수들이 공유하는 공통 데이터를 캡슐화한다.
2. 함수들을 새 클래스로 옮긴다
3. 데이터를 조작하는 로직은 함수로 추출해서 클래스 멤버로 놓는다
리펙터링 기법 – 죽은 코드 제거
• 코드는 자기가 무시해도 되는 코드인지 말해주지 않는다
타인이 죽은 코드를 파악하는데 시간을 허비하게 되는 일이 없도록 하자 (미래의 나도 타인이다)
void 존나중요한함수()
{
아주중요한변수
존나중요한코드()
아무튼안쓰는함수인데귀찮아서놔뒀음ㅋㅋ()
}
리펙터링 기법
• 기법이라고 하기엔 너무 당연한 것들 아닌가?
결국 리펙터링도 좋은 코드를 짜기 위한 목적인데
우리 역시 코딩 절차를 무조건 FM대로 거치지는 않겠지만
좋은 코드를 위해 무의식 적으로 리펙터링을하고있지 않았을까
리펙터링은 언제 해야되는가?
3의 법칙
그냥 한다
비슷한 일을 두번 째 하게되면 그래도 계속 한다
비슷한 일을 세번 째 하게되면 이펙터링한다
악취나는 코드
• 1. 기이한 이름
2. 중복 코드
3. 긴 함수
4. 반복되는 조건문
등등등
감사합니다

Mais conteúdo relacionado

Semelhante a DevRookie 리펙터링.pptx

자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기Wonchang Song
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical MethodologyKyeongUkJang
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8문익 장
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 pptInjae Lee
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
Test Driven Development (TDD) basic
Test Driven Development (TDD) basicTest Driven Development (TDD) basic
Test Driven Development (TDD) basicCurt Park
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2문익 장
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptInjae Lee
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDSuwon Chae
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven DevelopmentChangHyeon Bae
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learningSunggon Song
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraftbbongcsu
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
Programming java day2
Programming java day2Programming java day2
Programming java day2Jaehoonyam
 

Semelhante a DevRookie 리펙터링.pptx (20)

자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical Methodology
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
 
6 function
6 function6 function
6 function
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
Test Driven Development (TDD) basic
Test Driven Development (TDD) basicTest Driven Development (TDD) basic
Test Driven Development (TDD) basic
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 
Refactoring Seminar
Refactoring SeminarRefactoring Seminar
Refactoring Seminar
 
More effective c++ 챕터3~4ppt
More effective c++ 챕터3~4pptMore effective c++ 챕터3~4ppt
More effective c++ 챕터3~4ppt
 
EC 789
EC 789EC 789
EC 789
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDD
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
06장 함수
06장 함수06장 함수
06장 함수
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learning
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraft
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
Programming java day2
Programming java day2Programming java day2
Programming java day2
 

Mais de MUUMUMUMU

Recast Detour.pptx
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptxMUUMUMUMU
 
언리얼 애니메이션.pptx
언리얼 애니메이션.pptx언리얼 애니메이션.pptx
언리얼 애니메이션.pptxMUUMUMUMU
 
이벤트 드리븐.pptx
이벤트 드리븐.pptx이벤트 드리븐.pptx
이벤트 드리븐.pptxMUUMUMUMU
 
언리얼 리플렉션 & CDO.pptx
언리얼 리플렉션 & CDO.pptx언리얼 리플렉션 & CDO.pptx
언리얼 리플렉션 & CDO.pptxMUUMUMUMU
 
DevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptxDevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptxMUUMUMUMU
 
DevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptxDevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptxMUUMUMUMU
 
DevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptxDevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptxMUUMUMUMU
 
DevRookie 언리얼 에셋과 패키지.pptx
DevRookie 언리얼 에셋과 패키지.pptxDevRookie 언리얼 에셋과 패키지.pptx
DevRookie 언리얼 에셋과 패키지.pptxMUUMUMUMU
 
DevRookie 언리얼 군중 애니메이션.pptx
DevRookie 언리얼 군중 애니메이션.pptxDevRookie 언리얼 군중 애니메이션.pptx
DevRookie 언리얼 군중 애니메이션.pptxMUUMUMUMU
 
DevRookie 플로킹 알고리즘.pptx
DevRookie 플로킹 알고리즘.pptxDevRookie 플로킹 알고리즘.pptx
DevRookie 플로킹 알고리즘.pptxMUUMUMUMU
 
Dev Rookie 파이썬 GUI.pptx
Dev Rookie 파이썬 GUI.pptxDev Rookie 파이썬 GUI.pptx
Dev Rookie 파이썬 GUI.pptxMUUMUMUMU
 

Mais de MUUMUMUMU (11)

Recast Detour.pptx
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptx
 
언리얼 애니메이션.pptx
언리얼 애니메이션.pptx언리얼 애니메이션.pptx
언리얼 애니메이션.pptx
 
이벤트 드리븐.pptx
이벤트 드리븐.pptx이벤트 드리븐.pptx
이벤트 드리븐.pptx
 
언리얼 리플렉션 & CDO.pptx
언리얼 리플렉션 & CDO.pptx언리얼 리플렉션 & CDO.pptx
언리얼 리플렉션 & CDO.pptx
 
DevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptxDevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptx
 
DevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptxDevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptx
 
DevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptxDevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptx
 
DevRookie 언리얼 에셋과 패키지.pptx
DevRookie 언리얼 에셋과 패키지.pptxDevRookie 언리얼 에셋과 패키지.pptx
DevRookie 언리얼 에셋과 패키지.pptx
 
DevRookie 언리얼 군중 애니메이션.pptx
DevRookie 언리얼 군중 애니메이션.pptxDevRookie 언리얼 군중 애니메이션.pptx
DevRookie 언리얼 군중 애니메이션.pptx
 
DevRookie 플로킹 알고리즘.pptx
DevRookie 플로킹 알고리즘.pptxDevRookie 플로킹 알고리즘.pptx
DevRookie 플로킹 알고리즘.pptx
 
Dev Rookie 파이썬 GUI.pptx
Dev Rookie 파이썬 GUI.pptxDev Rookie 파이썬 GUI.pptx
Dev Rookie 파이썬 GUI.pptx
 

DevRookie 리펙터링.pptx

  • 3. 리펙터링 • 코드의 동작은 바꾸지 않으면서 내부 구조를 개선하는 방식으 로 소프트웨어 시스템을 수정하는 과정 • 버그가 생길 가능성을 최소로 줄이면서 코드를 정리하는 기법
  • 4. 리펙터링의 장점 • 코드를 이해하기 쉬워진다 즉 버그를 찾기 쉬워지고 확장성이 증가하여 기능을 추가하는 속도가 증가하여 개발 속도가 빨라진다 개발 속도가 빨라짐으로서 경제적 이익을 추구할 수 있음 리펙터링의 목적은 코드를 예쁘게 꾸미는 것이 아닌 오로지 개발 기간을 단축해 경제적인 이익을 얻고자 할 뿐이다
  • 5. 리펙터링 기법 -함수 추출 • 함수를 언제 분리할 것인가 1. 함수가 길 경우 2. 두 번 이상 사용될 경우 3. 목적 & 구현을 분리할 수 있을 경우
  • 6. 함수 추출 절차 1. 어떻게가 아닌 무엇을 하는지 드러나는 이름을 짓는다 2. 만든 함수로 코드 복붙 3. 추출한 함수의 유효범위를 벗어나는 변수가 있다면 매개변수로 전달한다. 4. 기존의 코드를 새로 만든 함수로 치환한다 5. 컴파일하고 테스트한다 6. 비슷한 코드가 있는지 살피고 추출한 함수로 바꿀지 검토한다
  • 7.
  • 8. 리펙터링 기법 – 함수 인라인 • 함수 인라인 절차 1. 다형성 함수(가상 함수)인지 확인한다 2. 해당 함수를 호출하는 곳을 모두 찾아 교체한다 3. 하나씩 교체할 때마다 테스트한다 4. 함수 정의를 삭제한다
  • 9. 여기서 말하는 리펙터링은 레거시 코드를 대규모로 고치는 행위가 아닌 개발과 동시에 조금 조금씩 개선해나가는 것임을 명심
  • 10. 리펙터링 기법 – 변수 추출 // 가격 = 기본가격 – 수량 할인 + 배송비 return ProductCount * ProductPrice – max(0,order.quantity - 500) * ProductPrice * 0.05 + min(ProductCount * ProductPrice * 0.1, 100); • 변수 추출 절차 1. 추출하려는 식에 부작용이 없는지 확인한다 2. 변수를 선언하고 식을 추출해 복붙한다 3. 원본 표현식을 변수로 교체 4. 테스트 5. 중복된 표현식이 있는지 확인하고, 테스트와 함께 하나씩 교체한다
  • 11. 리펙터링 기법 – 변수 추출하기 • 추출된 변수는 디버깅에도 도움이 된다 • 클래스 멤버 함수의 동작이라면 가능하다면 함수로 추출하는게 좋다 // 가격 = 기본가격 – 수량 할인 + 배송비 return ProductCount * ProductPrice – max(0,order.quantity - 500) * ProductPrice * 0.05 + min(ProductCount * ProductPrice * 0.1, 100); int basePrice = ProductCount * ProductPrice; int discount = max(0, order.quantity - 500) * ProductPrice * 0.05; int shipping = min(ProductCount * ProductPrice * 0.1, 100); return basePrice - discount + shipping;
  • 12. 리펙터링 기법 – 변수 인라인 int& basePrice = order.basePrice return basePrice > 1000; return order.basePrice > 1000; • 변수 자체가 원래 표현식과 다를 바 없을 때는 인라인하는 것이 좋다
  • 13. 리펙터링 기법 – 함수 이름 변경
  • 14. class A { ... public: setSize() { … getSize()}; }; … class B { ... public: setSize() { … getSize()}; }; class C { ... public: setSize() { … getSize()}; }; 호출하는 곳이 많거나 호출과정이 복잡하거나 인자를 많이 추가해야하거나 등등 쓰는 곳이 많고, 커플링이 심한 함수일 때
  • 15. 리펙터링 기법 – 마이그레이션 • 마이그레이션 절차 1. 새로운 함수 추출 2. 테스트 3. 기존의 함수는 Deprecated 주석을 달아준다 4. 천천히 테스트와 함께 하나씩 교체 5. 모든 함수가 교체되었을 때 삭제한다
  • 16. 리펙터링 기법 – 반복문 쪼개기 • 반복문 하나에서 여러가지 일을 수행할 경우 반복문이 변경될 때마다 모든 일을 파악하고 있어야함 하나의 함수가 여러가지 일을 하고 있다는 의미 리팩터링은 최적화가 아니다! 최적화는 코드를 정리하고 난 뒤에 하자 반복문이 증가되어 문제가 생길 경우 다시 하나로 합치는 건 식은 죽 먹기 아니 이거 반복문이 두 번 돌아버리는데?
  • 17. 리펙터링 기법 – 변수 분리 int temp = 2 * SizeX + SizeY cout << temp << endl; temp = SizeX * SizeY cout << temp << endl; const int perimeter = 2 * boxSizeX + boxSizeY; cout << perimeter << endl; const int area = SizeX * SizeY; cout << area << endl; • 변수 분리 절차 1. 변수 선언과 값을 첫번째 대입하는 곳에서 변수명을 바꾼다, 가능한 const로 2. 두번째 대입할 곳의 앞까지 변수명을 전부 새로운 변수명으로 변경한다 3. 두번째 대입하는 곳의 변수명을 원래 이름으로 바꾼다 4. 테스트하면서 위 과정을 반복
  • 18. 리펙터링 기법 – 함수를 클래스로 묶기 void 시계보기(핸드폰); void 영화보기(핸드폰); void 만화보기(핸드폰); void 똥싸기(핸드폰); void 친구만나기(핸드폰); class 사람 { public: void 시계보기(); void 영화보기(); void 만화보기(); void 똥싸기(); phone _핸드폰; }; • 클래스 묶기 절차 1. 함수들이 공유하는 공통 데이터를 캡슐화한다. 2. 함수들을 새 클래스로 옮긴다 3. 데이터를 조작하는 로직은 함수로 추출해서 클래스 멤버로 놓는다
  • 19. 리펙터링 기법 – 죽은 코드 제거 • 코드는 자기가 무시해도 되는 코드인지 말해주지 않는다 타인이 죽은 코드를 파악하는데 시간을 허비하게 되는 일이 없도록 하자 (미래의 나도 타인이다) void 존나중요한함수() { 아주중요한변수 존나중요한코드() 아무튼안쓰는함수인데귀찮아서놔뒀음ㅋㅋ() }
  • 20. 리펙터링 기법 • 기법이라고 하기엔 너무 당연한 것들 아닌가? 결국 리펙터링도 좋은 코드를 짜기 위한 목적인데 우리 역시 코딩 절차를 무조건 FM대로 거치지는 않겠지만 좋은 코드를 위해 무의식 적으로 리펙터링을하고있지 않았을까
  • 21. 리펙터링은 언제 해야되는가? 3의 법칙 그냥 한다 비슷한 일을 두번 째 하게되면 그래도 계속 한다 비슷한 일을 세번 째 하게되면 이펙터링한다
  • 22. 악취나는 코드 • 1. 기이한 이름 2. 중복 코드 3. 긴 함수 4. 반복되는 조건문 등등등