Trích phương thức

Từ VLOS
Bước tới: chuyển hướng, tìm kiếm

Tóm tắt[sửa]

Một đoạn mã nào đó có thể được nhóm lại.

Chuyển đoạn mã thành một phương thức, đặt tên để giải thích mục đích của phương thức đó.

void printOwing(double amount) {
    printBanner();
    //print details
    System.out.println ("name:" + _name);
    System.out.println ("amount" + amount);
}

Chuyển thành:

void printOwing(double amount) {
    printBanner();
    printDetails(amount);
}
 
void printDetails (double amount) {
    System.out.println ("name:" + _name);
    System.out.println ("amount" + amount);
}

Động cơ[sửa]

Trích phương thức từ những phương thức dài hoặc những đoạn mã cần được chú thích là một cách để hiểu mã tốt hơn.

Phương thức ngắn và được đặt tên tốt có nhiều ích lợi. Trước hết, nó tăng cơ hội được các phương thức khác sử dụng khi các phương thức được tinh chỉnh. Thứ hai, nó giúp các phương thức cấp cao hơn trông giống như một dãy các chú thích. Việc override cũng dễ dàng hơn.

Đôi khi mọi người băn khoăn một phương thức nên dài bao nhiêu. Độ dài của phương thức thực ra không phải vấn đề, điều quan trọng là khoảng cách về ngữ nghĩa giữa tên phương thức và thân phương thức. Nếu việc trích rút cải thiện tính rõ ràng, hãy làm điều đó, kể cả khi tên phương thức còn dài hơn đoạn mã bạn vừa trích.

Ví dụ[sửa]

Không có biến nội bộ[sửa]

void printOwing() {
	Enumeration e = _orders.elements();
	double outstanding = 0.0;
	// print banner
	System.out.println("**************************");
	System.out.println("***** Customer Owes ******");
	System.out.println("**************************");
	// calculate outstanding
	while (e.hasMoreElements()) {
		Order each = (Order) e.nextElement();
		outstanding += each.getAmount();
	}
	// print details
	System.out.println("name:" + _name);
	System.out.println("amount" + outstanding);
}

Ta trích ra đoạn mã in banner:

void printOwing() {
    Enumeration e = _orders.elements();
    double outstanding = 0.0;
    printBanner();
    // calculate outstanding
    while (e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        outstanding += each.getAmount();
    }
    //print details
    System.out.println ("name:" + _name);
    System.out.println ("amount" + outstanding);
}
 
void printBanner() {
    // print banner
    System.out.println ("**************************");
    System.out.println ("***** Customer Owes ******");
    System.out.println ("**************************");
}

Có sử dụng biến nội bộ[sửa]

Với sự tồn tại của biến nội bộ: các tham số truyền vào hoặc biến tạm được định nghĩa trong thân phương thức, ta có vấn đề cần giải quyết. Bạn cần phải xử lý các biến này hoặc chấp nhận không thể refactor được.

void printOwing() {
    Enumeration e = _orders.elements();
    double outstanding = 0.0;
    printBanner();
    // calculate outstanding
    while (e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        outstanding += each.getAmount();
    }
    //print details
    System.out.println ("name:" + _name);
    System.out.println ("amount" + outstanding);
}

Chuyển thành:

void printOwing() {
    Enumeration e = _orders.elements();
    double outstanding = 0.0;
    printBanner();
    // calculate outstanding
    while (e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        outstanding += each.getAmount();
    }
    printDetails(outstanding);
}
 
void printDetails (double outstanding) {
    System.out.println ("name:" + _name);
    System.out.println ("amount" + outstanding);
}

Gán lại một biến nội bộ[sửa]

Trong trường hợp này tình hình trở nên phức tạp hơn. Ta sẽ chỉ đề cập đến biến tạm. Nếu có một phép gán vào tham số, bạn nên ngay lập tức áp dụng phương pháp Xoá phép gán vào tham số.

void printOwing() {
    Enumeration e = _orders.elements();
    double outstanding = 0.0;
    printBanner();
    // calculate outstanding
    while (e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        outstanding += each.getAmount();
    }
    printDetails(outstanding);
}

Sau khi trích:

void printOwing() {
    printBanner();
    double outstanding = getOutstanding();
    printDetails(outstanding);
}
 
double getOutstanding() {
    Enumeration e = _orders.elements();
    double outstanding = 0.0;
    while (e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        outstanding += each.getAmount();
    }
    return outstanding;
}

← Mục lục

Liên kết đến đây