《재구성-기존 코드 개선 디자인》 독서노트
재구성
임시 변수를 질의로 대체
임시 변수의 문제는 일시적이며 소속 함수에서만 사용할 수 있다는 점이다.임시 변수는 소속 함수에서만 볼 수 있기 때문에 더 긴 함수를 쓰는 추세를 보일 것이다. 그래야 필요한 임시 변수에 접근할 수 있기 때문이다. 임시 변수를 하나의 검색어로 바꾸면 같은 클래스의 모든 함수에서 이 정보를 얻을 수 있다.
예제
double getPrice() {
int basePrice = number * itemPrice;
double discountFactor;
if (basePrice > 1000) discountFactor = 0.95;
else discountFactor = 0.98;
return basePrice * discountFactor;
}
임시 변수를final로 성명
double getPrice() {
final int basePrice = number * itemPrice;
final double discountFactor;
if (basePrice > 1000) discountFactor = 0.95;
else discountFactor = 0.98;
return basePrice * discountFactor;
}
부치 동작의 오른쪽 표현식을 추출하다
double getPrice() {
final int basePrice = getBasePrice();
final double discountFactor = getDiscount();
return getBasePrice() * discountFactor;
}
int getBasePrice() {
return number * itemPrice;
}
double getDiscount() {
if (getBasePrice() > 1000) return 0.95;
else return 0.98;
}
최후
double getPrice() {
final int basePrice = getBasePrice();
return getBasePrice() * getDiscount();
}
int getBasePrice() {
return number * itemPrice;
}
double getDiscount() {
if (getBasePrice() > 1000) return 0.95;
else return 0.98;
}
해석성 변수 도입
복잡한 표현식이 있습니다. 이 복잡한 표현식 (또는 그 중 일부) 의 결과를 임시 변수에 넣고, 이 변수 이름으로 표현식의 용도를 설명합니다.
if ((platform.toUpperCase().indexOf("MAC") > -1) &&
(browser.toUpperCase().indexOf("IE") > -1) &&
wasInitialized() && resize > 0)
{
// do something
}
다음과 같이 재구성할 수 있습니다.
final boolean isMacOS = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = platform.toUpperCase().indexOf("IE") > -1
final boolean wasResized = resize > 0;
if (isMacOS && isIEBrowser && wasInitialized() && wasResized)
{
// do something
}
임시 변수 분해
만약에 프로그램에 임시 변수가 한 번 이상 부여된다면 순환 변수도 결과 수집 변수도 아니다. 이것은 이 임시 변수가 함수에서 하나 이상의 책임을 진다는 것을 의미한다. 만약에 임시 변수가 여러 개의 책임을 진다면 매번 부여에 대해 독립적이고 대응하는 임시 변수를 만들어야 한다.
double temp = 2 * (height + width);
System.out.println(temp);
temp = height * width;
System.out.println(temp);
다음과 같이 덮어써야 합니다.
final double perimeter = 2 * (height + width);
System.out.println(perimeter);
final double area = height * width;
System.out.println(area);
함수 대상으로 함수를 대체하다
이 함수를 단독 대상에 넣으면 국부 변수가 대상 내의 필드가 되고, 같은 대상에서 이 대형 함수를 여러 개의 소형 함수로 분해할 수 있다
class Account {
int gamma(int inputVal, int quantity, int yearToDate) {
int importantValue1 = (inputVal * quantity) + delta();
int importantValue2 = (inputVal * yearToDate) + 100;
if ....
....
....
return importantValue3 - 2 * importantValue1;
}
}
첫 번째 단계: 이 함수를 하나의 함수 대상으로 바꾸고 구조 함수를 넣는다
class Gamma {
private final Account account;
private int inputVal;
private int quantity;
private int yearToDate;
private int importantValue1;
private int importantValue2;
pirvate int importantValue3;
Gamma(Account account, int inputVal, int quantity, int yearToDate) {
this.xx = xx
...
...
...
}
}
이제 원래의 함수를 컴퓨터 ()로 옮길 수 있습니다.
int compute() {
int importantValue1 = (inputVal * quantity) + account.delta();
int importantValue2 = (inputVal * yearToDate) + 100;
if ....
....
....
return importantValue3 - 2 * importantValue1;
}
그런 다음 이전 함수를 수정합니다.
int gamma(int inputVal, int quantity, int yearToDate) {
return new Gamma(this, inputVal, quantity, yearToDate).compute();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.