팁을 리모델링 재고 10 개 코드

우리가이 상대적으로 낮은 수준의 물건을 제외하고 JAVA 가상 머신 소스를 넣어 이번에는 LZ 당신과 함께 부분적으로 책에서 제공되는 몇 가지 팁 코드 리팩토링을 탐험하는 실제적인 경험 중에서 LZ 유지 보수 프로젝트에서 일부입니다. 메시지 원숭이 친구가이 기술을 사용하는 경우, 또한 약간의 경험 사이의 문서에 참여하고자하는 다른 사람과 공유에 대한 약간의 경험도 LZ 자신의 정의의 영향을 도표로 사용할 수 있습니다 LZ 매우 환영하지.

길의 재건은 자연 문서의 양을 커버하는, 상대적으로 말하기, 많은 모두에 언급되지 않은이되어, LZ 여기에 일부 꽤 자주 더 많은 하이 엔드 방식의 일부처럼, 전술의 일부를 사용할 수 있습니다, 그들은 관심에 있습니다 당신이 덮여 일부 전문 도서를 찾을 수 있습니다.

일부 리모델링 팁 JAVA 언어, 또는 밀접하게 객체 지향 언어 있지만, 대부분의 기술과 연계 할 수 있도록 프로세스 지향 언어, 또는 객체 지향 언어인지 LZ는, JAVA 개발을하고 있기 때문에, 또한이 , 모든 서로 공통 될 수 있습니다.

아도는, 리더 실용적인 기술에서 살펴 보자 그것을 재구성.

1 위 : 정제 코드 중복

이유 코드 중복이 재건을 수행하기 위해, 최대 규모의 재건 작은 방법 중 하나입니다 더 이상 말할 필요가 없습니다. 그것은는 크게 감소 총 코드, 유지 관리가 용이 ​​한 많은 명백한 이점을 가지고, 더 읽기 쉬운 코드가 구성되어있다.

그것의 초점은 특정 하위 기능 중 코드를 완료하기 위해 중복 코드를 찾을 수 있습니다, 나중에 찾아 그 (것)들의 사이에서 적절한 방법으로 이동하고 해당 클래스에 저장 주시기 바랍니다.

작은 예

class BadExample {

    public void someMethod1(){
        //code
        System.out.println("重复代码");/* 重复代码块 */
        //code
    }

    public void someMethod2(){
        //code
        System.out.println("重复代码");/* 重复代码块 */
        //code
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod1(){
        //code
        someMethod3();
        //code
    }

    public void someMethod2(){
        //code
        someMethod3();
        //code
    }

    public void someMethod3(){
        System.out.println("重复代码");/* 重复代码块 */
    }

}

2 호 : 분할 긴 과정

사실, 긴 과정에 대해 분할 때로는 추상적이고 코드 중복 밀접하게 무의식적으로 긴 과정의 분할을 완료, 종종 우리의 정제 코드의 과정에서 반복 연결되어 있습니다. 당신이 중복 대부분의 코드를 추출 후, 아직도 긴 방법의 일부를 유지한다면, 우리가 다루는이 긴 특별한 방법을 중지해야합니다.

우리가 그들을 가장 큰 방법을 분할 우리는 메소드 이름의 오른쪽에서 각 아동에게 기능을 줄 필요가 있으므로 부문, 그것은 매우 중요 기능 중 일부에있을 때부터이 한 가지 가치 지적이다. 우리는 방법은 때때로 프로그램 원숭이의 대략적인 수준을 반영 할 수있는, 좋은 이름을 줄 수 있다고 말할 수있다.

작은 예

class BadExample {

    public void someMethod(){
        //function[1]
        //function[2]
        //function[3]
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(){
        function1();
        function2();
        function3();
    }

    private void function1(){
        //function[1]
    }

    private void function2(){
        //function[2]
    }

    private void function3(){
        //function[3]
    }

}

3 번 : 중첩 된 조건 분기의 최적화 (1)

 중첩 된 조건 분기의 많은 수는 매우 간단 금지 코드, 우리는이 코드를 피하기 위해 시도해야합니다. 구조 원리는하지만 중첩 조건 분기의 같은 많은 수의 함수는 하나의 출구를 가질 수 있다는 말을하고 있지만, 우리는이 소위 규칙을 잊어 보자.

 건강 전문 문이라는 용어가있다, 당신은이 끔찍한 중첩 조건문을 처리 할 수 ​​있습니다. 핵심 아이디어는 상황 않도록 판사의 뒷면에 영향을 미치지 않도록, 방법의 앞에 특정 조건을 충족하고 신속 방법을 이동하지 않습니다. 수술 후, 코드는 매우 명확 모양, 다음 LZ 당신에게 고전적인 예를 들어 줄 줄, 당신은 당신이 좀 더 명확 보이게 두 가지 방법으로,이에 자신의 모습을 판단 할 수 있습니다.

작은 예

class BadExample {

    public void someMethod(Object A,Object B){
        if (A != null) {
            if (B != null) {
                //code[1]
            }else {
                //code[3]
            }
        }else {
            //code[2]
        }
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(Object A,Object B){
        if (A == null) {
            //code[2]
            return;
        }
        if (B == null) {
            //code[3]
            return;
        }
        //code[1]
    }

}

4 호 : 최적화 된 중첩 된 조건 분기 (2)

여기에 중첩 된 조건 분기와 위 약간 다른, 건강의 문을 최적화 할 수는 없지만, 분명히 코드의 목적을 달성하기 위해 조건 분기 및 병합해야했다. 그것은 또한 코딩 피해야한다 두 개의 중첩 된 조건 분기에서 볼 수있는, 그것은 크게 코드의 가독성을 감소시킬 것이다.

작은 사례의 전형적인하시기 바랍니다 느낌을 아직 알 수없는 원숭이 친구 리튬 모습 아래.

작은 예

class BadExample {

    public void someMethod(Object A,Object B){
        if (A != null) {
            if (B != null) {
                //code
            }
        }
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(Object A,Object B){
        if (A != null && B != null) {
            //code
        }
    }

}

제 5 호 : 삭제 한 번 임시 변수

우리는 종종 일회용 젓가락을 사용 사는이 나무의 파괴이다. 그러나 작은 폭력의 성능뿐만 아니라 일회성 임시 변수들 사이의 프로그램에서, 그것은 코드의 가독성의 신성 모독이다. 따라서, 우리는 몇 가지 일회성 임시 변수 수술이 필요합니다.

작은 예

class BadExample {

    private int i;

    public int someMethod(){
        int temp = getVariable();
        return temp * 100;
    }

    public int getVariable(){
        return i;
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    private int i;

    public int someMethod(){
        return getVariable() * 100;
    }

    public int getVariable(){
        return i;
    }

}

6 호는 : 매개 변수 목록의 제거가 너무 깁니다

어떤 방법이 매개 변수의 큰 숫자를 통과 할 경우, 코드 깔끔한 프로그램 원숭이에 대한 검색은 받아 들일 수없는 것입니다. 우리는 매개 변수의 긴 목록을 제거하기 때문에 같은 객체와 메서드에 전달 된 매개 변수를 캡슐화 시도 할 수 있습니다. 당신이 그런 객체를 찾을 때 대부분의 경우, 그것은 아직 대부분의 경우, 존재 종종, 우리는 추가 작업을 수행 할 필요가 없습니다.

작은 예

class BadExample {

    public void someMethod(int i,int j,int k,int l,int m,int n){
        //code
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(Data data){
        //code
    }

}

class Data{

    private int i;
    private int j;
    private int k;
    private int l;
    private int m;
    private int n;

  //getter&&setter

}

7 번 : 추출물 또는 클래스 상속 계층 구조 상수

재건의 목적은 마법의 숫자 또는 문자열 상수 등, 말할 필요도없이 발생하는 단점의 매직 넘버의 일부를 제거하는 것입니다,이 프로그램의 의도에 혼란을 만들 것입니다. 등의 문자열 상수의 종류의 제거, 편리한 유지 보수가 더 많은 혜택에 관해서. 우리는 일정을 수정해야하기 때문에, 당신의 상수를 사용하는 프로그램 코드의 모든 수정을 완료 할 수 있습니다.

또한, 이러한 일반적인 유사한 상황이 기본 클래스 액션, 추출 등이 상수 INPUT, LIST, SUCCESS이다.

작은 예

class BadExample {

    public void someMethod1(){
        send("您的操作已成功!");
    }

    public void someMethod2(){
        send("您的操作已成功!");
    }

    public void someMethod3(){
        send("您的操作已成功!");
    }

    private void send(String message){
        //code
    }
}

/* ---------------------分割线---------------------- */

class GoodExample {

    protected static final String SUCCESS_MESSAGE = "您的操作已成功!";

    public void someMethod1(){
        send(SUCCESS_MESSAGE);
    }

    public void someMethod2(){
        send(SUCCESS_MESSAGE);
    }

    public void someMethod3(){
        send(SUCCESS_MESSAGE);
    }

    private void send(String message){
        //code
    }

}

8 번 :하자 클래스는 방법을 제공해야합니다

많은 경우에, 우리는 종종 우리가 원하는 최종 결과를 얻기 위해 클래스의 속성의 대부분을 운영하고 있습니다. 이 시간, 우리는 우리가 대신 할 수 있도록해서는 안,이 클래스가해야 할 일을해야한다. 그리고 대부분의 시간,이 과정은 결국 중복 코드의 원천이 될 것입니다.

작은 예

class BadExample {

    public int someMethod(Data data){
        int i = data.getI();
        int j = data.getJ();
        int k = data.getK();
        return i * j * k;
    }

    public static class Data{

        private int i;
        private int j;
        private int k;

        public Data(int i, int j, int k) {
            super();
            this.i = i;
            this.j = j;
            this.k = k;
        }

        public int getI() {
            return i;
        }

        public int getJ() {
            return j;
        }

        public int getK() {
            return k;
        }

    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public int someMethod(Data data){
        return data.getResult();
    }

    public static class Data{

        private int i;
        private int j;
        private int k;

        public Data(int i, int j, int k) {
            super();
            this.i = i;
            this.j = j;
            this.k = k;
        }

        public int getI() {
            return i;
        }

        public int getJ() {
            return j;
        }

        public int getK() {
            return k;
        }

        public int getResult(){
            return i * j * k;
        }

    }

}

9 번 : 분할 긴 클래스

이 LZ 행 뒤에 그래서이 기술은 실제로 매우 유용한 기술의 일부이지만, 때문에 어려움이 상대적으로 높은 수준의. 단지 작은 수단이 없기 때문에이 기술을 위해, LZ 기술 곤란 상기와 같이, 간단하고 쉬운 매우 작은 일례 인 문제에 대한 설명을 제공한다.

대부분의 경우, 초점은 우리는 클래스 위의 클래스의 속성에 초점을 분할해야한다. 두 배치 속성 논리적으로 분리 할 수있다 밖으로 분할하고있는 코드를 사용하여 두 개의 일괄 집중 속성이 특정 방법들 또한 있었다. 정말 어떤 속성이 분할 방법 안에 두 개의 일괄 존재가있는 경우에는이 방법에 의존 파라미터 전송하여 해결할 수 있습니다.

클래스가 비교적 큰 프로젝트 분할 재건의 어려움이 상당히 크다고 그래서 결국, 종종 클래스의 많은 프로그램에서 사용 된 카테고리, 우리는 조심해야하며, 충분한 테스트를

10 번 : 부모 클래스의 속성과 메소드에 중복 추출 상속 계층 구조

이 기술은 충분한 판단, 많은 시간을 필요로하는 대부분의 경우,이 사실은 템플릿 메소드 패턴 과정에서 움직이고있다. LZ, 그것은 작은 예는 의미가 될 것이기 때문에 이유는, 여기에게 그 서브 클래스에 상위 클래스를 제거하는 서브 클래스는 동일한 속성 또는 메서드를 가지고보다 더 아무것도하고 반복 속성 또는 메서드를 인스턴스를 줄 수 없습니다.

이 사람이 아홉 번째의 재건과 유사하다 너무 자주 재건 이런 종류의 작은 프로젝트되지 않습니다, 우리는 적절한 관리와 테스트가 필요합니다. 이 기술을 사용하기 전에 그리고 당신은 부모 클래스의 속성이나 방법이 추출물을 확인하기에 충분해야 할 시간의 일반적인 서브 클래스를해야한다.

결론

LZ 본 연구는이이 10 사례 이상, LZ 거의 모든 좋은 뉴스를 시도 할 수 있었다, 그래서 상대적으로 오래된 프로젝트를 유지하기 때문에 그 결과는 아주 좋은 것입니다.

너무 가까이의 실제 상황에 마지막 두 제한된 접촉, LZ 간단한 예제를 제공하지 수 있지만, 결국 후자의 두 사람은, 일반적으로 재구성 기법을 사용하지 않는, 따라서 수용 할 수있다. 원숭이 친구들이 알고하지만 일반적으로 중요하지 않은 것은 아니다 없습니다, 당신은 여전히 ​​있습니다. 부가 LZ도 등은 상기 예에서, 코드의 구조는 이상한 일 수있다 간단한 실용화를 도시 단지 방법이라고 말할 수 있지만, 이들은 동일 남아있다. 너무 오래 핵심은 각각의 방법을 잡은으로, 이러한 잎에서 안전하게 혼란을 만드는 통해 간단합니다.

그들은 당신이 또한 더 많은 사람들이 볼 수 있도록하는 방식으로, 격려의 LZ를 추천하는 것이 그에게 무언가를 느낀다면 글쎄, 이것은 당신은 작은 점유율이 끝난 원숭이 친구입니다. LZ는 그것의 방법을 수비수 같은 경우에는, 아마도 우리 각 프로젝트의 코드를 인수, 그들은 아주 나쁘지 않을 것, 프로젝트를 위해 고려 될 수있다.

게시 50 개 원래 기사 · 원 찬양 1706 · 조회수 2,220,000 +

추천

출처blog.csdn.net/zl1zl2zl3/article/details/105325489