Bài viết

Kho tài liệu và bài viết được chia sẻ, đánh giá bởi cộng đồng

ĐẶT TÊN CHO "EM"

skynet đã tạo 14:43 20-09-2021 Hoạt động 12:33 22-09-2021 3.960 lượt xem 0 bình luận

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

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập

Câu hỏi mới nhất