Một trong những vấn đề quan trọng khi lập trình là sử dụng các biến tạm cục bộ một cách hiệu quả. Trong Phần 3Phần 4 chúng ta đã làm quen với hai kỹ thuật liên quan đến việc xử lý các biến tạm cục bộ là Replace Temp with QueryExtract Method. Trong bài viết này chúng ta sẽ tìm hiểu các kỹ thuật hiệu quả khác để xử lý các biến tạm cục bộ.

Inline Variable (Inline Temp)

Kỹ thuật Inline Variable (Inline Temp) liên quan đến việc xử lý các biến tạm cục bộ được dùng để chứa các giá trị là kết quả của các biểu thức, ví dụ biến basePrice sau:


boolean hasDiscount(Order order) {

   double basePrice = order.basePrice();

   return basePrice > 1000;

}

Biến basePrice lưu giá trị của phương thức basePrice() của đối tượng order. Biến basePrice trong trường hợp này có thể giúp code nhìn dễ đọc hơn nhưng nếu nó không góp phần vào việc cải thiện hiệu suất của cả chương trình thì sẽ là một sự vô ích.

Nếu biến tạm cục bộ chỉ có một chức năng duy nhất là chứa giá trị từ biểu thức hay phương thức thì chúng ta có thể xóa nó và trả về kết quả trực tiếp từ các biểu thức hay phương thức. Ví dụ chúng ta có thể xóa biến basePrice từ ví dụ trên:


boolean hasDiscount(Order order) {

   return order.basePrice() > 1000;

}

Kỹ thuật Inline Variable (Inline Temp) liên quan mật thiết đến kỹ thuật Replace Temp with Query  và Extract Method .

Extract Variable (Introduce Explaining Variable)

Nếu kỹ thuật Inline Variable dùng để kiểm tra và xóa các biến tạm cục bộ thì Extract Variable khuyến khích việc sử dụng biến tạm để giúp đoạn mã trở nên trong sáng, dễ hiểu, dễ đọc. Ví dụ chúng ta viết một đoạn mã (Java) dùng để nhận diện một trình duyệt web là MAC hay IE, có thể viết như sau:


void renderBanner() {

  if ((platform.toUpperCase().indexOf("MAC") > -1) &&

     (browser.toUpperCase().indexOf("IE") > -1) &&

      wasInitialized() && resize > 0 )

    {

      // do something

    }

}

Đoạn mã trên khó để hiểu nhưng sẽ trở nên rõ ràng hơn nếu chúng ta dùng các biến tạm như sau:


void renderBanner() {

  final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;

  final boolean isIE = browser.toUpperCase().indexOf("IE") > -1;

  final boolean wasResized = resize > 0;

  if (isMacOs && isIE && wasInitialized() && wasResized) {

    // do something

  }

}

Rõ ràng rằng với các biến isMacOs, isIE và wasResized thì đoạn mã trên trở nên rất sáng sủa. Yêu cầu của kỹ thuật Extract Variable là sử dụng các biến tạm với tên biến phải thể hiện rõ ý đồ hay mục đích của giá trị mà nó lưu trữ, ví dụ isMacOs hay isIE. Do đó, kỹ thuật Extract Variable còn được gọi với cái tên dài hơn là Introduce Explaining Variable.

Split Temporary Variable

Kỹ thuật này áp dụng cho các coder lười biếng, sử dụng một biến tạm cho nhiều mục đích khác nhau như ví dụ:


double temp = 2 * (height + width);

System.out.println(temp);

temp = height * width;

System.out.println(temp);

Trong đoạn mã trên chúng ta dùng hai biểu thức trả về hai giá trị khác nhau và cùng lưu trong một biến temp. Nguyên tắc cơ bản trong lập trình là sử dụng một biến chỉ cho một mục đích và biến temp rõ ràng vi phạm nguyên tắc này. Giải pháp là thay thế biến temp bằng các biến cục bộ khác với mục đích rõ ràng ( áp dụng Extract Variable):


final double perimeter = 2 * (height + width);

System.out.println(perimeter);

final double area = height * width;

System.out.println(area);

Bây giờ, với hai biến thể hiện mục đích rõ ràng là perimeter và area, chúng ta cũng dễ dàng hiểu được mục đích các biểu thức.

Remove Assignments to Parameters

Remove Assignments to Parameters có ý nghĩa tương tự Split Temporary Variable nhưng thay vì áp dụng cho các biến tạm cục bộ, kỹ thuật này áp dụng cho các tham số (parameters) của phương thức. Xét ví dụ:


int discount(int inputVal, int quantity) {

   if (inputVal > 50) {

     inputVal -= 2;

   }

   // ...
 
}

Ở đây chúng ta sử dụng tham số inputVal với hai mục đích là chứa giá trị đầu vào của phương thức discount và biến tạm cục bộ trong phương thức discount. Rõ ràng đã vi phạm nguyên tắc mỗi biến chỉ dùng cho một mục đích và giải pháp sẽ là:


int discount(int inputVal, int quantity) {

   int result = inputVal;

   if (inputVal > 50) {

      result -= 2;

   }

  // ...

}

Lúc này, inputVal chỉ chứa giá trị đầu vào của phương thức discount và result là biến tạm cục bộ trong phương thức discount.

Xem các phần trước về Refactoring >