Bài viết
Kho tài liệu và bài viết được chia sẻ, đánh giá bởi cộng đồng
Nội dung bài viết
Giới thiệu
Tên xuất hiện ở tất cả mọi nơi trong 1 chương trình. Chúng ta đặt tên cho Biến, Hàm, Đối số, Class, Packages… vân vân và mây mây, do đó chúng ta nên đặt tên theo những nguyên tắc sau đây để có 1 “TÊN TỐT”.
CỤ THỂ
1. Sử dụng tên thể hiện rõ ý đồ
Thay vì đặt tên:
int d; // Số giây đã trôi qua
Hãy đặt tên như sau, để không phải comment nữa:
int elapsedSeconds;
Hoặc đoạn code không đầu đuôi sau đây:
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
foreach(int[] x in theList)
{
if(x[0] == 4);
list1.add(x);
}
return list1;
}
Thật khó để biết đoạn code đang làm gì phải không?
1. theList là cái GIỀ thế?
2. tại sao lại là x[0] => có gì quan trọng à?
3. “số 4” đại diện cho cái gì?
4. Sử dụng cái List đã được trả về như thế nào?
Đáp án không được thể hiện trong code ví dụ, nhưng đáng lẽ phải có. Giả sử chúng ta đang lập trình game Mine Sweeper (dò mìn á). Danh sách các cell được gọi là theList (trong tiếng anh, khi có từ THE đằng trước 1 danh từ, nó ám chỉ rằng cái cả người viết & người đọc đều biết) => theList cái danh sách mà cả bạn và tôi đều biết. giờ đổi tên theList thành gameBoard
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
int STATUS_VALUE = 0;
int FLAGGED = 4;
foreach(Cell cell in gameBoard)
{
if(cell[STATUS_VALUE] == FLAGGED);
flaggedCells.add(cell);
}
return flaggedCells;
}
Thấy không, cấu trúc hàm, số lượng các phần tử không thay đổi, nhưng mà dễu hiểu hơn rồi.
Giờ nếu bạn đã có kiến thức cơ bản, hãy tìm cách nâng cao. Viết một số thứ thêm nữa; cách viết tôi ko nêu ở đây nhé (extention method cho Cell).
public List<Cell> getThem(){
List<Cell> flaggedCells = new ArrayList<Cell>();
foreach(Cell cell in gameBoard){
if(cell.isFlagged()) //CHỖ NÀY ĐƯỢC THAY PHÉP SO SÁNH THÀNH EXTENTION METHOD NÈ
flaggedCells.add(cell);
}
return flaggedCells;
}
2. Tránh thông tin sai lệch (dis-information: trạng thái như đọc tên biến nhưng nó không chứa thông tin nào)
Đừng đánh đồng giữa Nhóm của một object nào đó với List. Ví dụ như: có một nhóm account => ta nên đặt tên thành: accountGroup; bunchOfAccounts; hoặc đơn giản là accounts. Chỉ đặt tên accountList trong trường hợp nó đúng là 1 List nhé.
Một điển hình đó là dùng chữ cái “i” viết hoa, “L” viết thường hoặc “o” viết hoa để đặt tên cho biến. Đọc đuối luôn.
int a = l;
if ( O == l )
a = O1;
else
l = 01
3. Tạo sự khác biệt có nghĩa
Nếu names buộc phải viết khác đi, thì nó PHẢI có nghĩa khác.
Hiểu không? Xoắn não thì đọc lại nha.
4. Sử dụng tên có thể phát âm
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++)
{
a2[i] = a1[i];
}
}
Method trên COPY cái nào vào cái nào nhỉ? Đọc xuôi xong đọc ngược mới hiểu. Giờ viết lại 1 chút thôi.
public static void copyChars(char source[], char destination[]) {
for (int i = 0; i < source.length; i++) {
destination [i] = source [i];
}
}
Dễ rồi. Hàm copy mảng nguồn => đích.
Đặt tên có thể hiểu & dễ phát âm. Tuy nhiên đặt tên như ví dụ sau là chết đây nè:
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
Rồi xong, giờ thì gọi cái nào ra để dùng? Lại cần đến comment à?
Ví dụ tiếp:
class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
/* ... */
};
Nên chuyển thành:
class Customer {
private Date generationTimestamp;
private Date modificationTimestamp;;
private final String recordId = "102";
/* ... */
};
5. Sử dụng tên có thể tìm kiếm
Cùng xem 1 ví dụ như sau:
for (int j=0; j<34; j++) {
s += (t[j]*4)/5;
}
Nên chuyển thành:
int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j=0; j < NUMBER_OF_TASKS; j++) {
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
“sum” có thể chưa hoàn toàn chuẩn, nhưng mà ít ra cũng “TÌM ĐƯỢC”.
6. Tên Class
Các Class và Object nên là một danh từ hoặc một cụm danh từ
kiểu như Customer, Wikipage, Account, AddressParser.
Tránh những từ như
Manager, Proccessor, Data, Info
trong tên của class.
Tên của Class không nên có động từ (chúng ta cũng nên đặt tên bằng tiếng anh hơn là bằng tiếng việt vì vừa có thể học thêm 1 số từ cũng như để cho chuyên nghiệp, mạch lạc hơn)
7. Tên Method
Khác với tên Class hay Object, Method chỉ một hành động cho chương trình thực hiện nên
tên của nó nên là một (hoặc một cụm) động từ
kiểu như PostPayment, DeletePage, Save,...
Đặt tên với tiền tố Get đối với method có giá trị trả về, Set đối với method gán dữ liệu, Is đối với method hoặc property kiểm tra.
string name = employee.getName();
customer.setName(‘Mike’);
if (paycheck.isPosted())...
Khi overload (nạp chồng) constructor, Sử dụng extension method:
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
//sẽ tốt hơn là:
Complex fulcrumPoint = new Complex(23.0);
8. Đừng dễ thương - dại khờ
Đừng đặt tên theo kiểu “ĐÙA NGHỊCH”, đoạn này tôi sẽ dùng các ví dụ tiếng việt để làm sinh động thêm ý muốn truyền tải:
- Kiểm tra đối tượng
[Tên cướp].đãChếtHayChưa()
thì không nên dùng
đãNgỏmHayChưa(); đãĐiGặpÔngBàChưa()
- Thực thi hành động với một nhân vật (game chẳng hạn)
NhanVat.GiếtNPC()
thì không nên dùng
NhanVat.XúcNó()
9. Chọn một từ đại diện cho mỗi Concept
Đặt các tiền tố loạn xì ngầu lên: fetch, retrieve, get …. Cho cùng chung một mục đích lấy dữ liệu là không khôn ngoan.
10. Đừng chơi chữ
Method “Add” dường như đã quá quen thuộc phải không? Vậy bây giờ nếu muốn thêm một phần tử vào đối tượng của bạn, hãy viết method Add –Thêm vào – cho nó nhé, đừng viết Append – để ám chỉ mục đích Add, bởi lẽ Append là chèn thêm phần tử vào cuối một danh sách. Dùng từ linh tinh có ngày vỡ mồm vì debug không nổi.
11. Thêm context có ý nghĩa
Đọc firstName, lastName, state, province, street, houseNumber người ta có thể dễ dàng biết đó là ĐỊA CHỈ CỦA CÁ NHÂN, nhưng nếu chỉ có mỗi “state” đứng 1 mình em (trúc xinh @@!!) thì lúc này bạn còn nghĩ đó là đang ám chỉ địa chỉ của 1 người không?
Nên sẽ có những lúc phải thêm “BỐI CẢNH - Context” cho một biến để biến đó trở nên có ý nghĩa hơn. Ví dụ: addrfirstName, addrLastName, addrState, addrProvince, addrStreet, addrHouseNumber.
PS: Không có gì là CHUẨN NHẤT, chỉ có cái thuận tiện giúp mình viết code dễ đọc hơn thôi.
Bài viết dựa trên sách CleanCode, ai cần thì tìm đọc bản gốc nhé.
Nội dung bài viết