Bài này, được vừa đọc, vừa học tiếng anh, vừa note và dịch bởi một số bạn trong team Lap, với mục đích là học thêm nhiều thứ hay ho và học thêm từ mới. Mỗi ngày thêm một tí post lên đây ai thích thì đọc không thích thì đọc.
Việc đặt tên được làm rất nhiều trong phần mềm, chúng ta đặt tên cho variables, functions, arguments, classes, packages. Chúng ta đặt tên cho những tập tin mã nguồn và những thư mục chứa chúng. Chúng ta đặt tên cho tập tin jar, war và ear. Ta lặp đi lặp lại việc đặt tên rất nhiều lần chính vì vậy ta nên làm tốt việc đặt tên hơn. Bên dưới là những quy tắt đơn giản để làm tốt việc đặt tên hơn.
Tên nên tiết lộ được ý định của người viết code. Tôi rất nghiêm túc về việc này. Ta mất nhiều thời gian để chọn tên nhưng sẽ tiết kiệm thời gian hơn khi ta phải chỉnh sửa mã nguồn.
Vì vậy, hãy cẩn thận trong việc đặt tên và hãy đổi tên nếu như bạn nghĩ ra tên tốt hơn. Những người đọc code của bạn (và bạn) sẽ hạnh phúc hơn nếu như bạn làm điều đó trong khi viết code.
Tên của variable, function hoặc class nên trả lời được một số câu hỏi: tại sao nó tồn tại trong mã nguồn, nó có chức năng gì và nó được sử dụng như thế nào. Nếu một cái tên phải kèm theo chú thích thì cái tên đó không tiết lộ được ý định của nó.
int d; // elapsed time in days
Biến d không tiết lộ gì cả. Nó không cho ta thấy được nó là elapsed time in days. Chúng ta nên chọn tên nói lên được những gì đang được tính toán và đơn vị của phép tính đó:
Chọn tên tiết lộ được mục đích cho code dễ hiểu và dễ thay đổi hơn. Mục đích của đoạn code dưới đây là gì?
Tại sao đoạn code trên lại khó hiểu trong khi nó không chứa biểu thức gì phước tạp. Thụt đầu dòng hợp lý. Chỉ có 3 variables và 2 constants được nhắc đến trong function trên. Thậm chí nó không chứa classes hoặc phương thức đa hình nào, chỉ là một cái mảng (hoặc trông có vẻ là một cái mảng).
Vấn đề ở đây không phải code dễ mà là ý nghĩa của đoạn code (to coin a phrase): the degree to which the context is not explicit in the code itself. Để hiểu được đoạn mã trên ta phải trả lời được các câu hỏi sau:
Đáp án cho những câu hỏi trên không nằm trong đoạn code mẫu, nhưng ta có thể làm được điều đó. Ở đây, chúng ta đang xây dựng ứng dụng minesweeper game. Ta phát hiện ra board game là một danh sách cells được gọi là theList. Hãy đổi tên thành gameBoard.
Mỗi cell trên game board được biểu diễn bằng một array đơn giản. Ta phát hiện thêm rằng vị trí 0 chứa giá trị của một trạng thái nếu bằng 4 có nghĩa là “flagged”. Chỉ cần đặt tên cho các khái niệm chúng ta có thể cải thiện đáng kể đoạn code:
Lưu ý rằng sự đơn giản của đoạn code không thay đổi. Đoạn code vẫn còn giữ nguyên số lượng operators và constants, giữ nguyên mức độ lồng nhau. Nhưng nó trở nên rõ ràng và dễ hiểu hơn.
Chúng ta có thể đi xa ơn bằng cách viết một class đơn giản cho cell thay vì sử dụng mảng số nguyên. Nó có thể chứa một function với tên tiết lộ được ý định của người viết (ta gọi functon đó là isFlagged) để che đi magic numbers. Ta có một version mới của đoạn code:
Chỉ cần đổi tên một chút, đoạn code sẽ bớt khó hiểu hơn. Đó là sức mạnh của việc chọn một cái tên hay.
Các lập trình viên phải tránh đặt tên làm sai lệch ý nghĩa đoạn code hoặc không liên quan gì đến đoạn code. Ta nên tránh sử dụng những từ có ý nghĩa khác với mục đích của chúng ta khi viết code. Ví dụ, hp, aix, and sco sẽ là những tên biến tối nghĩa nó là tên của Unix platforms hoặc variants. Cho dù bạn đang viết code cho 1 cạnh huyền (hypotenuse) và hp như một từ viết tắt, nó có thể bị hiểu sai.
Không nên khai báo biến accountList để chỉ một nhóm các tài khoản trừ khi nó thực sự có kiểu List. Chữ list có ý nghĩa đặc biệt, có thể nó chỉ kiểu dữ liệu. Nếu như container chứa accounts không phải là List, điều đó sẽ dẫn đến kết luận sai. Tốt hơn chúng ta nên sử dụng accountGroup, bunchOfAccounts hoặc accounts.
Cẩn thận khi đặt tên mà sự khác biệt quá nhỏ. Mất bao lâu để ta nhận ra sự khác nhau giữa XYZControllerForEfficientHandlingOfStrings trong một module, và ở đâu đó xa hơn XYZControllerForEfficientStorageOfStrings? Khi đọc ta cảm thấy hai từ đó thật khinh khủng.
Những thứ giống nhau được đặt tên giống nhau thì gọi là “thông tin”, nhưng đặt tên tùm lum thì gọi là “bóp méo thông tin.” Trong môi trường Java hiện đại chúng ta rất ưa dùng chức năng tự động đặt tên. Chỉ cần viết vài chữ cái, bấm vài hotkey thì có có nguyên một list các gợi ý cho tên. Cái này rất hữu ích nếu tên là mấy thứ giống nhau được xếp theo abc, hoặc khác nhau một cách rõ ràng, vì dev thích chọn object theo tên mà không xem mấy cái comment copy từa tựa nhau hoặc thậm chí các methods của class đó.
Một ví dụ kinh khủng về việc sử dụng tên đó là sử dụng chữ L viết thường hoặc viết hoa chữ O để đặt tên biến. Vấn đề tất nhiên là 2 chữ đó trông giống như là constants một và không.
int a = l;
if ( O == l )
a = O1;
else
l = 01;
Độc giả có thể nghĩ rằng cái này là tự tạo trò để có cái viết, nhưng chúng tôi đã thấy nhiều code có mấy thứ này thừa thải này rồi. Có người viết code như vậy gợi ý sử dụng một loại font khác để thể hiện rõ sự khác nhau, giải pháp như vậy phải được truyền miệng cho những lập trình viên kế tiếp hoặc được viết vào tài liệu. Vấn đề cuối cùng được giải quyết thật giản mà không phát sinh thêm công việc bằng cách đổi tên biến.
Con người giỏi về từ ngữ. Một phần của bộ não chúng ta dành cho các khái niệm về từ ngữ. Từ ở đây là những từ có thể phát âm được. It would be a shame not to take advantage of that huge portion of our brains that has evolved to deal with spoken language. Vì vậy hãy đặt tên sao cho có thể phát âm được.
Nếu bạn không thể phát âm những tên đó, bạn sẽ trao đổi một cách giống như kẻ ngốc. “Well, over here on the bee cee arr three cee enn tee we have a pee ess zee kyew int, see?” Điều này quan trọng vì lập trình là một công việc mang tính tập thể.
Tôi có biết một công ty đặt biến như vầy genymdhms (generation date, year, month, day, hour, minute, và second) nên khi trao đổi với nhau họ nói rằng “gen why emm dee aich emm ess”. Tôi có một thói quen là cảm thấy khó chịu khi phải phát âm như đang viết, nên tôi bắt đầu phát âm nó là “gen-yah-muddahims.” Sau đó nó bắt đầu được phát âm bởi mọi người bao gồm designers và analysts. Nhưng đó chỉ là một trò đùa cho vui. Vui hay không vui, chúng ta đã nhân nhượng với việc đặt tên bậy bạ. Một developer mới phải mất thời gian để tìm người giản thích về biên genymdhms đó. Và sau đó họ phát âm nó bằng những từ ngớ ngẫn thay vì dùng tiếng Anh. Hãy so sánh hai đoạn code sau:
và
Bây giờ chúng ta trông có vẻ thông minh hơn khi bàn luận: “Hey, Mikey, take a look at this record! The generation timestamp is set to tomorrow’s date! How can that be?”
Tu bi cong tờ niu…
Coi công ty như một chiến quốc, lập trình viên như những chiến binh, mỗi dự án như một trận chiến, có chiến thắng thì công ty mới giàu mạnh, lương mới tăng thưởng mới có.