Tàn Code Lệnh 2 - Coding Thập Tam Thức

Coding Thập tam thức\
Toàn bộ bí kíp Clean Code của Robert Martin được tóm gọn trong 13 chiêu thức: Gọi là Coding thập tam thức. Mặc dù chỉ có 13 chiêu nhưng Coding thập tam thức đã bao trùm toàn bộ code học, có uy lực bá đạo, người luyện thành 13 chiêu này sẽ trở thành thiên hạ đệ nhất code nhân, đạt tới tầm Ninjas lập trình

Bỗng trên không trung, một tiếng cười lanh lảnh phát ra như tiếng chuông đồng
- Chưa quá muộn đâu, thiếu hiệp
Một người vận hắc y nhẩy xuống, nhẹ nhàng như là rơi, không một tiếng động. Khuôn mặt bịt kín sau lớp vải đen.
- Lão tiền bối là ai, xin cho biết đại danh
- Ta với thiếu hiệp có duyên kì ngộ, sau này tất sẽ biết danh tính của ta. Ta thấy thiếu hiệp  tuổi còn trẻ mới bước vào con đường code đạo, mới gặp chút khó khăn đã than trời trách đất. Đó không phải là tráng chí của một kẻ coder.
- Xin tiền bối chỉ cho vài đường cơ bản để vạn bối được mở mắt
Muốn học code, trước tiên coder phải học nội công tâm pháp để rèn luyện căn cơ trước như Tàn Cân Cước (Toán cao cấp), Đại Sát Tuyệt Thế (Đại số tuyến tính), Tiêu Hồn Cơ Sát (Tin học cơ sở), vì tất cả các ngôn ngữ lập trình đều dựa trên kiến thức toán học, kiến trúc máy tính. Nếu không nắm vững, thì việc học code chỉ giống như công nhân học nghề, thợ hồ coding, khó có thể ngộ được hết những tuyệt học trong code đạo được. Những môn tâm pháp trên đều được giảng dậy ở ghế giảng đường, thiếu hiệp nên chú tâm tu luyện
Còn cuốn Clean Code này, nó ẩn chứa rất nhiều tuyệt học trong code đạo, từng câu từng chữ đều là lời vàng ý ngọc, người có tu vi có thể phải mất 10 năm mới luyện thành, còn kẻ ngu muội có khi cả đời cũng không học nổi.
Toàn bộ bí kíp Clean Code của Robert Martin được tóm gọn trong 13 chiêu thức: Gọi là Coding thập tam thức. Mặc dù chỉ có 13 chiêu nhưng Coding thập tam thức đã bao trùm toàn bộ code học, có uy lực bá đạo, lại biến ảo vô cùng, một chiêu có thể hóa ra trăm chiêu. Người luyện thành 13 chiêu này sẽ trở thành thiên hạ đệ nhất code nhân, đạt tới tầm Ninjas lập trình.

Coding Thập Tam Thức

Các chiêu trong Clean Code được mô tả trong 13 thiên, 17 hồi như sau
Định Danh Chưởng (Meaningful Names): Nói về kĩ năng đặt tên hàm, biến, lớp, packages, tham số sao cho hợp lý dễ hiểu và dễ bảo trì.
Hàm Mô Công (Function) Các chương trình được đóng gói trong các hàm, thủ tục. Đây là mộn công pháp viết function sao cho hiệu quả
Comment Thủ (Comment): Mô tả chiêu thức trong comment code, nếu học hết chiêu này, có thể đạt tới cảnh giới vô comment thắng hữu comment. (Code không cần comment cũng hiểu được)
Định Dạng Cân (Formatting): Chiêu này đảm bảo cho code được viết một cách gọn gàng nhất quán, một dòng code viết ra có công thủ toàn diện, nhìn vào source code như nhìn vào họa đồ, sơn thủy hữu tình.
Cầm Trảo Dạ Lôi (Cấu trúc dữ liệu): Sử dụng cấu trúc dữ liệu và đối tượng trong coding, cách trừu tượng hóa dữ liệu (Data abstraction), dữ liệu/đối tượng bất đối xứng (Data/Object Anti-Symmetry). Giới thiệu luật Demeter trong việc xây dựng module
Đạp Code Tầm Sai (Xử lý lỗi trong code): Các vấn đề về xử lý lỗi trong code, error handling, exception
Biên Kinh Khám Phá (Boundaries) Các kĩ thuật và thực hành để xác định ranh giới của phần mềm với các thư viện của bên thứ 3 (3rd third party)
Đơn Tinh Kiểm Thử (Unit Test): Các nguyên tắc cơ bản để viết Unit Test hiệu quả, sạch
Phân Hạng Đoạt Hồn (Classes): Tổ chức phân lớp trong mã nguồn, các tiêu chí cần biết khi xây dựng một phân lớp
Hệ thống Lệnh (System) Cũng như trong một môn phái, có tổng đà chủ, phân đà, môn đệ… Phần mềm cũng bao gồm nhiều module phức tạp. Thiên này mô tả các tuyệt kĩ để xây dựng một hệ thống phần mềm phức tạp như Phân Tâm Trụy (Separation of concerns), Dependency Injection, Thiên Cân Đảo Nghịch (Inversion of Control)
Thiết Kế Kinh (Emergence): Quy định các giới luật trong thiết kế phần mềm (Design Rules) như nguyên tắc tái cấu trúc (Refactoring), không trùng lặp (No duplication), Expression…
Truy Cập Đồng Thời (Concurrency) Trình bày kinh nghiệm viết ứng dụng xử lý đa luồng (Multi-thread)
Thiên Tinh Chỉnh (Successive Refinement) Các chiêu thức tinh chỉnh source code dần dần từ dirty code đến clean code.
Ta sẽ chỉ dẫn cho thiếu hiệp chiêu thứ nhất, có thể gọi là công pháp nhập môn Clean Code đó là Định Danh Chưởng. Trong định danh chưởng lại được chia thành hơn 16 chiêu biến ảo khôn lường

Định Danh Chưởng

Trong giang hồ, mỗi một vị kì nhân, mỗi một chiêu thức võ công đều có tên tuổi, chỉ cần nghe đến tên là hiểu được ý nghĩa như Hàng Long Thập Bài Chưởng, Độc Cô Cầu Bại. Trong coding cũng vậy, người coder đặt tên biến, hàm, lớp đều phải bộc lộ được mục đích, để người đọc có thể hiểu ngay được nó dùng để làm gì, sử dụng ra sao. Robert Martin gọi nó là Intention-Revealing Names

Intention-Revealing Names

Xem đoạn code sau
int d; // elapsed time in days


d là một biến rất vô nghĩa, nó có thể gây cho người đọc hiểu lầm nội dung của nó. Thiếu hiệp cần phải chọn một tên sao cho dễ hiểu
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;


Hãy xem đoạn code dưới đây
public List<int[]> getThem() {
  List<int[]> list1 = new ArrayList<int[]>();
     for (int[] x : theList)
        if (x[0] == 4)
           list1.add(x);
  return list1;
}


Cách đặt tên biến, hàm như trên có thể khiến cho coder hiểu lầm code pháp, dẫn tới tu luyện sai lầm. Nhẹ thì bị phế bỏ võ công, nặng thì mất đi tính mạng, vô cùng tai hại
Cần viết lại như sau


public List<Cell> getFlaggedCells() {
  List<Cell> flaggedCells = new ArrayList<Cell>();
     for (Cell cell : gameBoard)
        if (cell.isFlagged())
           flaggedCells.add(cell);
  return flaggedCells;
}


Avoid Disinformation (Tránh sai lệch thông tin)

Tránh đặt những gợi ý sai lầm làm lu mờ ý nghĩa thực sự của Code. Ví dụ như viết tắt từ này có thể hiểu nhầm sang nghĩa khác
Ví dụ đừng quy một nhóm các đệ tử thành một listDisciples nếu nó không phải là một List thật sự. Nên thay nó bằng tên như disciplesGroup hay đơn giản chỉ là disciples
Tránh đặt tên chỉ khác nhau ở một vài điểm, khó phân biệt, hai chưởng pháp phía dưới có cách đặt tên có thể gây sai lệch thông tin
int hangLongThapBatChuongs;
int thienLongThapBatChuong;


Ví dụ khủng khiếp khác là sử dụng tên ở mức thấp: l(L) hoặc O(o), dễ gây nhầm lẫn với số 1 và 0.
int a = l;
if ( O == l )
a = O1;
else
l = 01;


Make Meaningful Distinctions (Phân biệt tường minh)

Nhiều coder viết code chỉ để cho chạy và đã tạo ra vấn đề cho người maintaince code hoặc cho chính bản thân.
public static void copyChars(char a1[], char a2[]) {
  for (int i = 0; i < a1.length; i++) {
     a2[i] = a1[i];
  }
}


Cách đặt tên biến kiểu a1, a2 khiến người đọc không hiểu được ý nghĩa, mâu thuẫn với việc đặt tên có mục đích
Hàm này sẽ dễ đọc hơn khi sử dụng biến source và destination như tham số truyền vào.


public static void copyChars(char source[], char dest[]) {
  for (int i = 0; i < source.length; i++) {
     dest[i] = source[i];
  }
}


Noise work cũng là một sự riêng biệt vô nghĩa (meaningless distinction) Ví dụ một object đại sư là Master, nhưng thiếu hiệp tại đặt 2 cái tên như MasterData hay MasterInfo, tên tuy khác nhau như ý nghĩa thì như nhau. Data hay Info là một noisy word
Ví dụ KieuPhong muốn lấy thông tin của sư phụ, đại hiệp Kiều Phong sẽ gọi method nào dưới đây
string getMaster();
string getMasterData();
string getMasterInfo();


Use Pronounceable Names (Tên Khả đọc)

Các tên hàm biến được đặt tên rõ ràng sẽ dể hiểu hơn nhiều với các tên viết tắt
class DtaRcrd102 {
  private Date genymdhms;
  private Date modymdhms;
  private final String pszqint = "102";
  /* ... */
};

class Customer {
  private Date generationTimestamp;
  private Date modificationTimestamp;;
  private final String recordId = "102";
  /* ... */
};


Tuy nhiên trong code có một số tên viết tắt đã được chuẩn hóa như src (source), dst (destination), cmd (command), args (argument) có thể sử dụng để giảm bớt độ dài của tên.

Use Searchable Names (Sử dụng tên tìm kiếm được)

Những tên, biến, hằng số mà chỉ có 1 từ đơn như i,j,k hay 7, 8 sẽ gặp vấn đề khi tìm kiếm
Ví dụ
for (int j=0; j<34; j++) {
  s += (t[j]*4)/5;
}


Đổi 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 = (realdays / WORK_DAYS_PER_WEEK);

  sum += realTaskWeeks;
}


Lão Hắc Y nhân nói đến đây, bỗng bên ngoài có tiếng nổ vang trời.
Lão Hắc Y chợt biến sắc mặt nói
Trong Định Danh chưởng còn hơn 10 chiêu thức nữa, ta có việc gấp phải ra đi không thể nói tiếp, thiếu hiệp hãy bảo trọng. Hẹn ngày tái ngộ
Nói rồi, lão hắc y nhún mình biến mất trong đêm đen, để lại Dương Cú Đơ ngồi thẫn thờ
- Vị tiền bối này là ai mà nắm rõ cuốn Clean Code này vậy?

(Còn tiếp)

@ Do Trong Nguyen Blogger

No comments:

Post a Comment

The Ultimate XP Project

  (Bài chia sẻ của tác giả  Ryo Amano ) Trong  bài viết  số này, tôi muốn viết về dự án phát triển phần mềm có áp dụng nguyên tắc phát triển...