1. 程式人生 > >代碼重構

代碼重構

彈框 turn static sta date() ons foo 校驗 string

1.重構

(1)重構變量

  • Shift+F6 批量重命名變量(Rename)
  • private String bcd;//光標在bcd處,按Shift+F6,改為lastname

    public String getFullName(String abc){//光標在abc處,按Shift+F6,改為firstname
    System.out.println("your firstname: "+abc);
    System.out.println("your lastname: "+this.bcd);
    String fullName=abc+this.bcd;
    System.out.println("your fullname: "+fullName);

    this.sayHello(abc);
    return fullName;
    }
  • 這段代碼abc,bcd含義不明,將abc重構為firstname,bcd重構為lastname,提高代碼可讀性,改為如下
  • private String lastname;

    public String getFullName(String firstname){
    System.out.println("your firstname: "+firstname);
    System.out.println("your lastname: "+this.lastname);
    String fullName=firstname+this.lastname;
    System.out.println("your fullname: "+fullName);

    this.sayHello(firstname);
    return fullName;
    }

(2)重構方法

  • 方法一: Ctrl+F6 改變方法 (change signature)
  • public String getFullName(String firstname){
    //
    this.sayHello(firstname);//2.此處出現紅波浪,手動添加,lastname
    //
    }
    private void sayHello(String firstname) {//1.在此處按Ctrl+F6 ,即出現一個彈框,在裏面點+,輸入String lastname即可

    }
  • 方法二:Ctrl+Alter自動修改
  • public String getFullName(String firstname){
    //
    this.sayHello(firstname);//1.此處添加,lastname,按下Alt+Enter,選擇Add String as 2nd parameter to method sayHello
    //
    }
    private void sayHello(String firstname) {//2.此處自動變為private void sayHello(String firstname, String lastname)
        
    }

2.抽取

(1)抽取變量

  • Ctrl+Alt+v 抽取變量(extract variable),v就相當於variable
  • public void foo(){
    getFullname("san");//光標放在san上,Ctrl+Alt+v, replace all 6 occurrebces
    getFullname("san");
    getFullname("san");
    getFullname("san");
    getFullname("san");
    getFullname("san");
    }
  • 代碼多次需要用到“san”變量,我們可以把它抽取出來,變為
  • public void foo(){
    String lastname = "san";
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    }

(2)抽取靜態變量

  • Ctrl+Alt+c 抽取靜態變量(extract constant),c就相當於constant
  • public void foo(){
    getFullname("san");//光標放在san上,Ctrl+Alt+c, replace all 6 occurrebces
    getFullname("san");
    getFullname("san");
    getFullname("san");
    getFullname("san");
    getFullname("san");
    }
  • 代碼多次需要用到“san”作為靜態變量,我們可以把它抽取出來,變為
  • public static final String LASTNAME = "san";

    public void foo(){
    getFullname(LASTNAME);
    getFullname(LASTNAME);
    getFullname(LASTNAME);
    getFullname(LASTNAME);
    getFullname(LASTNAME);
    getFullname(LASTNAME);
    }

(3)抽取成員變量

  • Ctrl+Alt+f 抽取成員變量(extract field),f就相當於field
  • public void foo(){
    getFullname("san");//光標放在san上,Ctrl+Alt+f, replace all 6 occurrebces
    getFullname("san");
    getFullname("san");
    getFullname("san");
    getFullname("san");
    getFullname("san");
    }
  • 代碼多次需要用到“san”作為靜態變量,我們可以把它抽取出來,變為
  • private String lastname;

    public void foo(){
    lastname = "san";
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    getFullname(lastname);
    }

(4)抽取方法參數

  • Ctrl+Alt+p 抽取方法參數(extract parameter),p就相當於parameter
  • private String firstName;

    private String getFullname(String lastName) {
    String fullName= this.firstName +","+lastName;//光標放在firstName,Ctrl+Alt+p
    return fullName;
    }

    public void foo(){
    getFullname("san");
    }
  • 將firstName它抽取出來,就可以將getFullname()抽取出來成為一個服務,放到別的類裏面都可以,變為
  • private String firstName;

    private String getFullname(String lastName, String firstName) {
    String fullName= firstName +","+lastName;
    return fullName;
    }

    public void foo(){
    getFullname("san", this.firstName);
    }

(5)抽取函數

  • Ctrl+Alt+m 抽取函數(extract method),m就相當於method
  • public void foo(){
    step1();
    step2();//選中他倆,按Ctrl+Alt+m,在彈框中輸入validate

    step3();
    step4();//選中他倆,按Ctrl+Alt+m,在彈框中輸入loadDataFromDB
        step5();
    step6();//選中他倆,按Ctrl+Alt+m,在彈框中輸入calc
    }
  • public void foo(){
    validate();//校驗參數
    loadDataFromDB();//數據庫加載數據
    calc();//邏輯運算
    }

    private void calc() {
    step5();
    step6();
    }

    private void loadDataFromDB() {
    step3();
    step4();
    }

    private void validate() {
    step1();
    step2();
    }

代碼重構