▪Remove Control Flag 제어 플래그 제거
제어 플래그는 프로그래머가 항상 함수 (함수 선언 행)와 종료 점 (함수의 맨 끝에 있음)에 대해 한 개의 진입 점을 가지고있는 yore 일까지 거슬러 올라간다.
현대 프로그래밍 언어에서는 루프 및 기타 복잡한 구문에서 제어 흐름을 수정하기위한 특수 연산자가 있으므로이 스타일은 더 이상 사용되지 않는다.
• break : 루프를 중지
• continue : 현재 루프 분기의 실행을 중지하고 다음 반복에서 루프 조건을 확인
• return : 전체 함수의 실행을 중지하고 연산자에 주어진 경우 결과를 반환
Problem & Solution
일련의 boolean식에서 컨트롤 플래그 역할을하는 변수가 있는 경우, break 또는 return을 대신 사용하라.
-Problem
void checkSecurity(String[] people) {
for (int i = 0; i < people.length; i++) {
if (people[i].equals ("Don")) {
sendAlert();
break;
}
if (people[i].equals ("John")) {
sendAlert();
break;
}
}
}
- Solution
void checkSecurity(String[] people) {
boolean found = false;
for (int i = 0; i < people.length; i++) {
if (!found) {
if (people[i].equals ("Don")) {
sendAlert();
found = true;
}
if (people[i].equals ("John")) {
sendAlert();
found = true;
}
}
}
}
절차
* break 또는 continue를 사용
논리문 밖으로 나오도록 하는 컨트롤 플래그의 값을 찾는다.
논리문 밖으로 나오도록, 컨트롤 플래그에 값을 설정하던 부분을 찾아 break나 continue 문으로 바꾼다.
컴파일 및 테스트
* break나 continue를 사용하지 않는 다른 접근 방법
로직을 메소드로 뽑아낸다.
논리문 밖으로 나오도록 하는 컨트롤 플래그의 값을 찾는다.
논리문 밖으로 나오도록 컨트롤 플래그에 값을 설정하던 부분을 return으로 바꾼다.
컴파일 및 테스트
1. 루프 또는 현재 반복을 종료하게하는 제어 플래그에 값 할당을 찾음
2. 루프에서 빠져 나왔다면 break로 바꿈. continue, iteration에서 빠져 나왔다면, 또는 함수에서이 값을 리턴해야 할 경우 리턴
3. 나머지 코드를 제거하고 제어 플래그와 연관된 검사를 수행
Benefits
제어 플래그 코드는 종종 제어 흐름 연산자로 쓰인 코드보다 훨씬 복잡하다.
'컴퓨터 > 이론 및 tools 사용' 카테고리의 다른 글
[리팩토링 refactoring] Dealing with Generalisation 일반화처리 (0) | 2017.01.27 |
---|---|
[리팩토링 refactoring] Simplifying Method Calls - 메소드 호출 단순화 (0) | 2017.01.27 |
[리팩토링 refactoring] Simplifying Conditional Expressions 조건문의 간결화 (0) | 2017.01.27 |
[리팩토링 refactoring] Organizing Data 데이터 체계화 - Replace array with Object 배열을 객체로 전환 (0) | 2017.01.26 |
[리팩토링 refactoring] Organizing Data 데이터 체계화 (0) | 2017.01.26 |
[리팩토링 refactoring] Moving Features between Objects 객체간의 기능 이동 - Move Field 필드이동 (0) | 2017.01.24 |
[리팩토링 refactoring] Moving Features between Objects 객체간의 기능 이동 (0) | 2017.01.24 |