Clean code - Meaningful Names

Thực tế, khi đọc code của một lập trình viên mới, chúng ta thường rất khó nắm bắt được ý tưởng trong code của họ. Bởi nó quá khó hiểu, và chứa nhiều tên biến, tên hàm không có nghĩa, hoặc quá ngắn, thậm chí các lập trình viên thường đặt đại một cái tên bất kỳ để sau này đọc lại chính họ cũng không hiểu nó là gì 😦. Vì sao lại vậy ?

Cũng dễ hiểu thôi vì khi code, chúng ta chắc hẳn cũng khá đau đầu nếu muốn nghĩ cách đặt tên cho biến, hàm, class hay các pakage. Bởi chúng quá nhiều và xuất hiện ở mọi nơi trong khi ta viết code.

Việc nghĩ tên cho chúng quá mất thời gian, vì thế, nhiều người thường không coi trọng việc đặt tên, họ thường tập trung nhiều vào logic của code hơn. Tuy nhiên, việc bớt được chút thời gian viết code lại khiến cho mọi người thật khó để hiểu được code của họ, thậm chí ngay cả chính họ đôi khi cũng không hiểu nổi code mà mình viết. Việc này sẽ ảnh hưởng tới việc phát triển, maintain sau này cũng như cản trở team làm việc với nhau. Vì vậy chúng ta nên dành chút thời gian để nghĩ tên cho biến và hàm của mình, điều đó sẽ khiến người đọc cảm thấy happy hơn 😄

Tuy nhiên nếu bạn vẫn đang cảm thấy khó chịu mỗi khi muốn đặt một cái tên cho biến và hàm của mình, thì hãy tham khảo những quy tắc dưới đây:

Sử dụng tên thể hiện được mục đích của nó

Trước khi đặt tên biến, bạn hãy nghĩ cách trả lời những câu hỏi sau:

  • tại sao lại cần tới nó
  • nó để làm gì
  • nó được sử dụng như thế nào

Nó giống như việc một lập trình viên sau khi viết code xong, đọc lại code của mình và cố gắng giải thích lại đoạn code và biến của mình, anh ta sử dụng các comment trong code để trả lời các câu hỏi trên vậy.

int d; // elapsed time in days

Việc này thật khiến chúng ta mất nhiều thời gian cho việc đọc lại mà không khiến code thêm phần dễ hiểu, thậm chí khiến chúng rối hơn với những dòng comment bất tận. Thay vì việc này, vì sao chúng ta không nghĩ tới các câu hỏi trước và đặt một cái tên trả lời được những câu hỏi đó.

int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;

Hay như việc đặt lại tên cho đoạn code sau:

public List<int[]> getThem() {
  List<int[]> list1 = new ArrayList<int[]>();
  for (int[] x : theList)
    if (x[0] == 4)
      list1.add(x);
  return list1;
}

chuyển thành

public List<int[]> getFlaggedCells() {
  List<int[]> flaggedCells = new ArrayList<int[]>();
  for (int[] cell : gameBoard)
    if (cell[STATUS_VALUE] == FLAGGED)
      flaggedCells.add(cell);
  return flaggedCells;
}

Tránh thông tin sai

Chúng ta nên tuyệt đối tránh việc sử dụng các đầu mối sai che đi ý nghĩa của code, nên tránh sử dụng những từ có thể mang nhiều nghĩa.

Ví dụ, hp, aix, sco là những tên biến không tốt, vì chúng có thể là tên của UNIX platform, nhưng thậm chí nếu chúng ta đang code hypotenuse thì hp lại có vẻ là từ viết tắt của nó, do đó nó có thể là thông tin sai.

Hay cẩn thận khi sử dụng nhiều tên gần giống nhau, chỉ khác nhau rất ít, ví dụ

XYZControllerForEfficientHandlingOfStrings
và
XYZControllerForEfficientStorageOfStrings

Liệu các bạn có thể dễ dàng nhận ra sự khác nhau giữa 2 biến trong mớ code của chính mình. Hay một cách đặt tên khác là sử dụng lO trong tên biến. Chúng ta thậm chí có thể nhầm chúng với các ký tự số 10.

int a = l;
if ( O == l )
  a = O1;
else
  l = 01;

Hãy phân biệt ý nghĩa

Ví dụ, vì chúng ta không thể đặt tên biến giống nhau để tham chiếu tới hai thứ khác nhau trong cùng một phạm vi, vì thế để nhanh chóng, chúng ta thường đặt tên biến còn lại một cách cẩu thả. Việc này đôi khi gây ra các lỗi chính tả khiến việc biên dịch code gặp lỗi.

Chúng ta thường có hai cách giải quyết cho việc sử dụng nhiều biến trong cùng một phạm vi bằng cách sử dụng number seri hoặc noise word.

  • number seri là cách đặt tên sử dụng tên các ký tự số như a1,a2,a3,...aN. Cách này không sai thông tin nhưng không mang thông tin cho người đọc.
public static void copyChars(char a1[], char a2[]) {
  for (int i = 0; i < a1.length; i++) {
    a2[i] = a1[i];
  }
}

Nếu tên phải khác nhau thì tốt nhất chúng ta nên sử dụng những ý nghĩa khác nhau. Trong ví dụ trên, nếu function sử dụng các tham số rõ ràng hơn source, destination thì nó sẽ tốt hơn nhiều.

  • noise word là các sử dụng các từ phân biệt vô nghĩa như với class Product, chúng ta sử dụng ProductDataProductInfo. 2 từ này khác nhau nhưng không có khác về nghĩa. InfoData là những noise word, giống như a, an, the

Tham khảo

Sách: “CLEAN CODE” của tác giả Robert C. Martin Series