Introduce Parameter Refactoring  

 

섹션은 Introduce Parameter   리팩토링 위에서  overview 제공하고  how  리팩토링이 IntelliJ IDEA에서 사용될 있는가를 제공합니다.

개요


만일 당신이 메소드 콜에서 넘어가는 일부 값을 필요로 하면 Introduce Parameter  리팩토링 매개 변수를 메소드 선언에 추가하기 위해 사용됩니다.  메소드 사용은 또한 변경됩니다.  매개 변수에 참조는 메소 시그너쳐 변경 리팩토링(생성된 스테이트먼트가 단순히 텍스트로서 삽입된 ) 같지 않게 해결됩니다.

예를 들면, 리팩토링 전에 다음 코드가 있습니다:

 
    public int myMethod(int aParam) {
        return aParam + (aParam + 1);
    }
 
    public void anotherMethod() {
        myMethod(5);
    }


그리고 당신은 다른 매개 변수를 (aParam + 1) 표현식 대신에 myMethod 생성하는 것을 결정했습니다.  리팩토링 이후 당신은 다음 코드를 가질 것입니다:  

 

 
    public int myMethod(int aParam, int newParam) {
        return aParam + newParam;
    }
 
    public void anotherMethod() {
        myMethod(5, (5 + 1));
    }
 

새로운 매개 변수 newParam 생성되었고 메소드 콜에서 실제 값은 초기화되었습니다.

매개 변수 생성


매개 변수를 생성하기 위해, 에디터에서 매개 변수로 교체될 표현식을 선택하십시오.


Introduce Parameter 리팩토링을 적용한 표현식을 선택하기 위해 Ctrl + W  (단어 선택) 사용하는 것은 아주 편리합니다. 코드의 블록 확장을 선택하고 당신은 캐럿을 내부의 어느 곳에 배치하고, Ctrl + W 눌러서 어떤 표현식이라도 쉽게 코드에서 선택해도 좋습니다.


메인 메뉴에서 또는 에디터에서 오른쪽 버튼을 클릭하여 불려지는 팝업 메뉴에서 Refactor Introduce Parameter...  클릭합니다. 또는 Ctrl + Alt + P   단축키를 사용합니다.


로컬 변수 위에서 리팩토링을 적용하면서, 당신은 오로지 그것 위에서 캐럿을 배치할 있습니다.  그러나 필드 위에서 리팩토링을 적용하기 위해, 필드가 에디터에서 선택되어야만 한다라는 점에 주의하십시오.



다음 Introduce Parameter  다이얼로그 나타납니다:



다이얼로그는 다음의 제어를 가집니다:

Parameter of type  

생성된 매개 변수를 위해 타입을 선택하십시오.

Name  

생성된 매개 변수를 위한 이름을 타이프하거나, IDEA 의해 제안된 하나를 사용합니다.

Declare final  

만일 선택되면, 생성된 매개 변수는 최종적으로 선언됩니다.

Preview usages  to be changed  

체크 박스를 선택하면 당신은 어떤 사용이 발견되었는지 추적하고, 그들의 교체를 승인하도록 허락합니다.   체크 박스가 선택되지 않을 , IDEA 교체를 자동적으로 수행합니다.


심지어 체크 박스가 선택되지 않았을 때도, 만일 발견된 사용이 어떤 읽기 전용 파일에서 존재하면 당신은 사용 교체를 확인하는 프롬프트가 당신에 대기될 입니다.


리팩토링을 적용하기 위해 Enter 누르십시오.

특별한


다음 특정의 이슈는 언급되어야만 합니다:

  만일 필드가 메소드 선언에서 새로운 매개 변수로서 제공되기를 원하면, 메소드 콜에서 필드는 클래스 인스턴스의 필드로서 제공될 것입니다.
 

위의 예제를 사용하고 있는 필드를 추가합니다:  
 
    public class AClass {
        public int myField;
 
        public int myMethod(int aParam) {
            return aParam + (myField + 1);
        }
    }
 
    public class AnotherClass {
        AClass aClass = new AClass();
 
        public void anotherMethod() {
            aClass.myMethod(5);
        }
    }
 
리팩토링 이후 당신은 다음의 코드를 가질 것입니다:
 
    public class AClass {
        public int myField;
 
        public int myMethod(int aParam, int newParam) {
            return aParam + newParam;
        }
    }
 
    public class AnotherClass {
        AClass aClass = new AClass();
 
        public void anotherMethod() {
            aClass.myMethod(5, (aClass.myField + 1));
        }
    }



 
만일 클래스 구성 요소가 접근하기 어려우면(예를 들면, 위의 예제에서 필드는 private입니다), 그것은 메소드 콜에 삽입될 것입니다. 그러나 파일을 컴파일 안되게 만드는 에러로서 강조될 것입니다.

 
만일 당신이 게터와 함께 Introduce Parameter  리팩토링 위해 필드를 사용하면, 당신에게 확장된 다이얼로그로 프롬프트 것입니다:



 
다이얼로그는 옵션 그룹 Replace fields used in expressions with their getters 갖습니다

Do not replace  

필드의 어느 것도 게터에 콜로 교체되지 않을 것입니다.

Replace fields  inaccessible in usage context  

사용 문맥으로부터 직접 액세스될 없는 필드만이 게터에 콜로 교체될 것입니다.

Replace all fields  

모든 필드는 게터에 콜로 교체될 것입니다.




 
로컬 변수 위에서 리팩토링을 적용하면 개의 부가의 체크 박스와 함께 Introduce Parameter 다이얼로그를 부를 것입니다.  예를 들면, 당신은 다음의 코드를 가집니다:  

 
    public int myMethod(int firstPar) {
        int secondPar = firstPar + 1;
        return firstPar + secondPar;
    }


그리고 당신은 secondPar  변수를 선택하고 있는 Introduce Parameter  리팩토링을 적용합니다 .

당신은 다음의 다이얼로그 윈도우 것입니다:

Replace all  occurrences (<number_of_occurences> occurrences)  

가능하면, 선택된 변수의 모든 발생은 매개 변수로 교체될 것입니다. 그리고 Delete variable 체크 박스는 사용 가능하게 하게 됩니다.  그렇지 않으면, 오로 선택된 변수 사용은 매개 변수로 교체될 것입니다.


오로지 선택된 변수의 이상의 많은 발생이 있을 경우에 체크 박스는 나타납니다.


Delete variable  definition  

가능하면, 변수 정의는 삭제될 것입니다.

Use variable  initializer to initialize parameter  

가능하면, 변수 이니셜라이저는 메소드 콜에서 매개 변수를 초기화하기 위해 사용될 것입니다.


Enter 누르면 리팩토링을 적용할 것입니다.

 

부작용


만일 실제 메소드 매개 변수인 클래스 인스턴스 또는 표현식 위에서 적용된다면, Introduce Parameter  리팩토링 사용하는 것은 예상외의 부작용을 가질 있습니다.  예를 들면, 그런 코드의 경우에는:  

 
class AClass {
    int field;
    int method() {
        return field;
    }
}
 
class Usage {
    void method(List list) {
        int sum = 0;
        for(Iterator it = list.iterator(); it.hasNext(); ) {
            sum += ((AClass) it.next()).method();
        }
    }
}

 

그리고 field 필드를 위해 적용된 리팩토링 후의 코드:

 
class AClass {
    int field;
    int method(int newfield) {
        return newfield;
    }
}
 
class Usage {
    void method(List list) {
        int sum = 0;
        for(Iterator it = list.iterator; it.hasNext(); ) {
            sum += ((AClass) it.next()).method(((AClass) it.next()).field);
        }
}

 

반복 값은 실제로 당신이 예상했던 반응이 아닌 배로 증가됩니다

그러나, IDEA 일시적 변수를 성공적으로 사용할 있고, 증분/감량/대입 연산과 new 키워드 사용과 같은 경우를 해결할 있습니다.

예를 들면

 
    public int myMethod(List list) {
        return list.size();
    }
 
    public void anotherMethod() {
        myMethod(new ArrayList());
    }

그리고 리팩토링 후의 코드:  

 
    public int myMethod(List list, int newPar) {
        return list.size();
    }
 
    public void anotherMethod() {
        final ArrayList list = new ArrayList();
        myMethod(list, list.size());
    }

 

새로운 변수 list  생성되고 메소드 콜을 위해 사용되는 모든 매개 변수는 변수를 사용하면서 제공됩니다.