재구성 노트 2 함수 재구성 Extract Methord

5661 단어
함수 재구성
 
Extract Methord
동기: Extract Methord는 가장 자주 사용하는 재구성 기법 중 하나이다. 내가 너무 긴 함수나 주석이 있어야만 사람들이 용도를 이해할 수 있는 코드를 볼 때 나는 이 코드를 독립된 함수에 넣을 것이다.만약 함수의 입도가 매우 작다(finely grained)면 함수 간에 서로 복용할 기회가 더욱 크다. 그 다음으로 고위층 함수를 일련의 주석처럼 읽을 수 있고 함수의 복사(override)도 쉽다.하나의 함수 길이는 문제가 아니다. 관건은 함수 이름과 함수 본체 간의 의미 거리(semantic distance)가 추출된 동작이 코드의 선명도를 강화할 수 있다면 추출된 코드 자체보다 함수 이름이 더 길어도 상관없다는 것이다.
 
방법:
  1.새로운 함수를 만들어라. 이 함수의 의도에 따라 그것을 명명하고, 어떻게 하지 않고, 어떻게 명명하는지, 더 좋은 이름이 떠오르지 않으면 움직이지 말고, 작은 걸음으로 나아가는 것을 기억해라.
  2.추출된 함수 중원 함수를 목표 함수로 복사하다
  3.추출된 코드에 인용된 변수가 있는지 확인하기
  4.임시 변수가 있는지 확인하십시오. 만약 목표 함수에서 임시 변수로 성명한다면
  5.추출된 코드가 국부 변수의 값이 바뀌었는지 확인하십시오.임시 변수 값이 수정되면 추출된 코드를 검색어로 처리하고 결과를 관련 변수에 부여할 수 있는지 확인하십시오.만약 이렇게 하거나 수정하기 어려운 변수가 한 개가 아니라면, Split Temporay variable를 사용해서 추출을 시도해야 할 수도 있습니다.Replace Tem With Query를 사용하여 임시 변수를 제거할 수도 있습니다.
  6.추출된 코드에서 읽어야 할 국부 변수를 매개 변수로 목표 함수에 관통시킨다
  7.모든 국부 변수를 처리한 후 컴파일하기
  8.원 함수에서 추출된 코드를 목표 함수에 대한 호출로 바꾸다
9 컴파일 테스트
 
eg:
a. 로컬 변수 없음 NoLocalConnectionVariables
 
private function printOwing():void {
    var outstanding:Number = 0.0;
    var e:Array = _orders;

     //trace the Banner
     trace("***************");
     trace("*Customer Owes**");
     trace("***************");

     //calculate outstanding
     for each(var i:Object in e) {
       outstanding+=  i.getAmount();     
     }

     //trace details
     trace("name: "+ _name);
     trace("outstanding : " + outstanding );
}
 
    ==>
 
private function printOwing():void {
    var outstanding:Number = 0.0;
    var e:Array = _orders;

     printBanner();



     //calculate outstanding
     for each(var i:Object in e) {
       outstanding+=  i.getAmount();     
     }

     //trace details
     trace("name: "+ _name);
     trace("outstanding : " + outstanding );
}

private function printBanner

():void {
     trace("***************");
     trace("*Customer Owes**");
     trace("***************");
} 

 
 
 
b. 로컬 변수 없음 NoLocalConnectionVariables
만약 이렇게 간단하다면 재구성의 난점은 어디에 있는가? 옳은 것은 국부 변수이며, 원함수에 전달된 매개 변수와 원함수가 성명한 임시 변수를 포함한다.국부 변수의 역할 영역은 원래 함수에만 한정되어 있기 때문에 Extract Methord를 사용할 때 이 변수들을 처리하는 데 많은 시간을 들여야 한다.때때로 그들은 우리를 방해해서 우리로 하여금 재구성할 수 없게 할 것이다.
국부 변수의 가장 간단한 상황은 추출된 코드가 이 변수의 값만 읽고 그들을 수정하지 않는다는 것이다. 이런 경우 나는 직접 매개 변수로 목표 함수에 뚫을 수 있다.
 
 
private function printOwing():void {
    var outstanding:Number = 0.0;
    var e:Array = _orders;
 
     printBanner();

     //calculate outstanding
     for each(var i:Object in e) {
       outstanding+=  i.getAmount();     
     }

     //trace details
     trace("name: "+ _name);
     trace("outstanding : " + outstanding );
}

private function printBanner():void {
     trace("***************");
     trace("*Customer Owes**");
     trace("***************");
} 

 
 
  ==》
 
 
private function printOwing():void {
    var outstanding:Number = 0.0;
    var e:Array = _orders;
 
     printBanner();

     //calculate outstanding
     for each(var i:Object in e) {
       outstanding+=  i.getAmount();     
     }

     printDetails

(outstanding );
}

private function printBanner():void {
     trace("***************");
     trace("*Customer Owes**");
     trace("***************");
} 

private fuction printDetails

(outstanding :Number):void {
   trace("name: "+ _name);
   trace("outstanding : " + outstanding );
}

 
 
c. 국부 변수에 값을 부여한다. 추출된 코드가 국부 변수에 값을 부여하면 문제가 복잡해진다. 여기서 임시 변수의 문제만 본다. 만약에 원 함수의 파라미터가 값을 부여받는 것을 발견하면 바로 Remove Assignments 게시판을 사용해야 한다. Parameters.부여된 값이 임시로 바뀌는 것도 두 가지 상황으로 나뉜다.비교적 간단한 상황은 이 변수는 추출된 코드에만 있다. 만약 그렇다면 이 임시 변수의 성명을 추출된 코드에 넣고 함께 추출할 수 있다.또 다른 상황은 추출된 코드 이외의 코드도 이 변수를 사용했다는 것이다.이것은 또 두 가지 상황으로 나뉜다. 만약에 이 변수가 추출된 후에 사용된다면 목표 함수에서 그녀를 직접 수정하면 된다.만약 추출된 코드가 이 변수를 사용한다면, 목표 함수를 변경된 값으로 되돌려 주어야 한다.
 
 
private function printOwing():void {
    var outstanding:Number = 0.0;
    var e:Array = _orders;
 
     printBanner();

     //calculate outstanding
     for each(var i:Object in e) {
       outstanding+=  i.getAmount();     
     }

     printDetails(outstanding );
}

private function printBanner():void {
     trace("***************");
     trace("*Customer Owes**");
     trace("***************");
} 

private fuction printDetails(outstanding :Number):void {
   trace("name: "+ _name);
   trace("outstanding : " + outstanding );
}

 
 
==> 계산된 코드 추출
 
 
 
private function printOwing():void {
     printBanner();
     var outstanding:Number = getOutSatnding

();
     printDetails(outstanding );
}

private function printBanner():void {
     trace("***************");
     trace("*Customer Owes**");
     trace("***************");
} 

private fuction printDetails(outstanding :Number):void {
   trace("name: "+ _name);
   trace("outstanding : " + outstanding );
}

private funtion getOutSatnding

():Number{
    var e:Array = _orders;
    var outstanding:Number = 0.0;
    for each(var i:Object in e) {
       outstanding+=  i.getAmount();     
     }

    return outstanding;

}

좋은 웹페이지 즐겨찾기