Chào các em, hôm nay anh sẽ trình bày chủ đề về đặt tên biến ,hàm như thế nào là đúng. Khi mình viết code cái mình hướng tới là những dòng code của mình người khác đọc vào sẽ hiểu ý định mình là làm gì? Trải qua 10 năm làm code cái anh nhận thấy đa số các lập trình viên viết code chủ yếu là mình hiểu, còn người khác thì đọc chưa chắc đã hiểu. Chính vì vậy thường các lập trình viên khi đọc code người khác mà không hiểu thường sẽ xoá code đó đi và viết lại code mới. Điều này rất nguy hiểm vì nếu mình xóa nhầm một dòng code quan trọng thì chương trình có thể chạy sai. Chính vì vậy hôm nay anh sẽ hướng dẫn mọi người cách đặt tên cho đúng.
Ví dụ trong ứng dụng của mình. Mình có chức năng là lấy danh sách các nhân viên có trong công ty. Mình có thể đặt tên method là getEmployee hoặc retrieveEmployee. Hai từ này điều có nghĩa là lấy danh sách nhân viên. Nhưng trong khi lập trình mình nên thống nhất một từ là get hoặc retrieve cho toàn bộ hệ thống để tránh sự nhầm lẫn. Không nên lúc thì gọi là getEmployee , lúc thì gọi retrieveEmployee. Như vậy quy tắc đầu tiên nên chọn một từ duy nhất để mô tả chức năng của hệ thống.
Đoạn code dưới đây là không tốt. Mình nên chọn một cái tên là get hoặc retrieve mà thôi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Example {
//choose only one concept
public List<Employee> getEmployees() {
return null;
}
public List<Employee> retrieveEmployees() {
return null;
}
}
Đoạn code dưới đây là không tốt vì khi mình khai báo biến String s, lúc này khi mình tìm kiếm cái biến s thì nó sẽ xuất hiện ra cả ngàn file chứa chữ s. Rất khó khăn trong việc tìm kiếm.
1
2
3
4
5
6
7
8
9
10
11
12
public class Example1 {
private static final int NUMBER_OF_TASKS = 0;
public static void bad() {
String s = null;
int[] t = null;
for (int j = 0; j < 34; j++) {
s += (t[j] * 4) / 5;
}
}
}
Cũng là đoạn mã trên ta viết lại như sau. Như vậy thay vì khai báo chữ s. Ta sẽ viết rõ ràng tên biến. Ví dụ như realTaskDays , như vậy khi ta tìm kiếm chỉ sẽ xuất hiện 1 file chứa từ khóa realTaskDays.
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void good() {
int realDaysPerIdealDay = 4;
int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j = 0; j < NUMBER_OF_TASKS; j++) {
int[] taskEstimate = null;
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realdays = 0;
int realTaskWeeks = (realdays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
}
Ví dụ anh có đoạn mã sau. Khi đọc đoạn code này mình thực sự không biết hàm getThem() là làm gì? biết list1 là ?
1
2
3
4
5
6
7
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
Cũng là đoạn mã trên nhưng anh viết lại thì mọi người sẽ dễ dàng biết được ý định của anh là gì? Khi nhìn vào biến gameBoard mình có thể đoán ngay là đoạn code sau đây đang viết về một ván cờ. Từ khóa Cell mình có thể đoán ngay là các ô trên bàn cờ.
1
2
3
4
5
6
7
8
// good
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
}
Trong lập trình khi có một vấn đề gì đó thì chúng ta thường thảo luận với nhau. Nếu như ta đặt tên biến mà không phát âm được như đoạn code sau thì không cách nào mình có thể thảo luận với đồng nghiệp mà giải quyết được vấn đề. Ví dụ cái biến genymdhms nó không thể phát âm được.
1
2
3
4
5
6
7
8
public class Example1 {
//A company I know has genymdhms (generation date, year, month, day, hour, minute, and second)
private Date genymdhms
private Date modymdhms;
private final String pszqint = "102";
}
Chúng ta sẽ viết lại đoạn mã sau với chức năng tương tự. Cái biến genymdhms giờ đổi thành generationTimestamp. Như vậy chúng ta có thể phát âm và thảo luận được.
1
2
3
4
5
6
public class Example1 {
//good
private Date generationTimestamp;
private Date modificationTimestamp;
private final String recordId = "102";
}
Ví dụ đoạn mã sau đây là xoá một dòng trong ứng dụng.
1
2
3
4
5
6
7
public class Example {
//tên rất hay nhưng không ai hiểu nó làm gì
public void holyHandGrenade() {
}
}
Thay vì đặt tên hay nhưng không ai hiểu ta hãy đặt tên cho đúng chức năng .
1
2
3
4
5
public class Example {
public void deleteItems() {
}
}
1
2
3
4
5
6
7
8
9
10
11
public class Example1 {
//Tên này không tốt vì nó là tên của các hệ thống và ứng dụng
private String hp, aix, sco;chrome
//Tên này không tốt vì từ list là những thứ liên quan đến lập trình như linkedlist, arraylist ///dễ gây hiểu nhầm
private List<String> accountList;
//Đây là cách đặt tên tốt.
private List<String> accountGroup,accounts,groupofAccount ;
}
Tên method trong Class luôn luôn phải là động từ. Nếu method dài từ 2 từ trở lên thì mình áp dụng đặt tên theo phương pháp camel (con lạc đà ) chữ đầu tiên viết thường chữ sau viết hoa. Ví dụ phương thức rút tiền withdrawMoney.
1
2
3
4
5
6
7
public class Example1 {
public void withdrawMoney(float money) {
}
}
Tên của một Class luôn luôn là danh từ. Nếu tên Class có 2 từ trở lên thì ta viết hoa hai chữ cái đầu tiên. Ví dụ CustomerRepository
1
2
3
public class Customer {
}
Lập trình viên đa số hay bị lỗi này. Thường để tiết kiệm thời gian , lập trình viên thường đặt tên biết bằng một ký tự . Ví dụ vòng lặp sau nó như một dòng code đánh đố người đọc để suy luận ra i , k là gì?
1
2
3
4
5
6
7
8
9
public class Example1 {
for (int i=0,i<size,i++) {
if (i == k) {
}
}
}
Ví dụ mình có các biến sau trong class Person với tên như sau: firstName, lastName, street, houseNumber, city, state và zipcode. Như vậy ta hiểu được các biến sau đang mô tả cho một địa chỉ của một người.
1
2
3
4
5
6
7
8
9
10
11
public class Person {
private String firstName;
private String lastName;
private String street;
private int houseNumber;
private String city;
private String state;
private String zipcode;
}
Ở ví dụ tiếp theo mình chú ý vào biến state mình không hiểu nó là đang nói về địa chỉ hay không?
1
2
3
4
5
6
7
8
9
public class Person {
public void getMailbox() {
String zipcode = getZipCode();
String state = zipcode.concat("");
}
}
Như vậy để tăng thêm ý nghĩa cho từ state là nói về địa chỉ, ta thêm tiền tố addressState. Như vậy khi người dùng đọc vào biết là biến state đó đang nói về địa chỉ.
Trên đây là 10 cách đặt tên biết có ý nghĩa. Nếu chúng ta tuân thủ các bước này thì code của chúng ta sẽ sạch sẽ hơn. Người đọc dễ hiểu hơn, từ đó dẫn đến việc duy trì, phát triển sản phẩm dễ dàng hơn.