Vài mẹo hữu ích khi đặt tên biến trong dự án của bạn

Đặt tên biến không hề dễ. Sau đây là vài mẹo để bạn khiến nó trở nên tốt hơn.
Vài mẹo hữu ích khi đặt tên biến trong dự án của bạn
Vài mẹo hữu ích khi đặt tên biến trong dự án của bạn

Bài viết này chứa một số quy tắc đặt tên cho các variables của bạn, phù hợp cho từng loại khác nhau. Variable name không chỉ mô tả tên của nó, mà còn có thể mô tả được chức năng cũng như kiểu biến. Điều này cực kỳ quan trọng cho các ngôn ngữ lập trình không cần xác định kiểu dữ liệu cho biến, nhưng nó cũng khá tốt cho các ngôn ngữ xác định kiểu, bởi bạn đã có thể mường tượng được kiểu dữ liệu khi nhìn vào tên biến.

Hãy cố gắng viết tên variables và functions của bạn như những bài văn xuôi rõ ràng, rành mạch, kể cả nó có dài hay không.

Chỉ có 2 điều khó khăn trong khoa học máy tính: xóa cache và đặt tên cho mọi thứ. - Phil Karlton

 

Đặt tên cho các số nguyên (Integer)

Có một số biến luôn luôn là số nguyên, ví dụ như age hoặc year. Ai cũng có thể hiểu được kiểu dữ liệu cho age và year là số, cụ thể là số nguyên. Cho nên bạn không cần làm gì với chúng, bản thân chúng đã tự nói cho bạn biết kiểu của nó là gì.

 

Một trong những trường hợp sử dụng kiểu số nguyên nhiều nhất là đếm số lượng của một thứ gì đó. 

Bạn có thể tìm thấy được các loại biến kiểu như thế này trong bất cứ source code nào. Tôi hay sử dụng các quy ước đặt tên như sau cho các biến kiểu này: numberOfSomethingsomethingCount...

Ví dụ: numberOfFailures hoặc failureCount.

Một số người thì hay đặt tên kiểu failures, nhưng vấn đề ở đây là tên biến này không hề chỉ định rõ ràng ý nghĩa và kiểu của biến, điều đó khiến những người khác khi đọc vào đoạn mã này sẽ tốn thêm một chút thời gian để đọc hiểu. Theo ý kiến của tôi, biến failures mang ý nghĩa chỉ định nó là một kiểu collection (một array hoặc list của failures).

Nếu đơn vị của biến không rõ ràng, tôi luôn thêm một chút mô tả đơn vị của biến vào phía sau. Ví dụ, thay vì tooltipShowDelay, tôi sẽ sử dụng tooltipShowDelayInMillis hay thậm chí tooltipShowDelayInMillisecs.

 

Đặt tên cho các kiểu số thập phân (Float)

Số thập phân không quá phổ biến như số nguyên, nhưng thỉnh thoảng bạn sẽ cần tới chúng cho một số giá trị đo lường không nên được làm tròn (ví dụ như giá cả - price, chiều cao - height, chiều rộng - width, trọng lượng - weight). 

Khi cần sử dụng kiểu số thập phân, tôi thường đặt theo quy tắc somethingAmount, hoặc amountOfSomething. Bất cứ lúc nào tôi nhìn vào tên biến kiểu này, tôi có thể chắc chắn chúng là số thập phân.

Nếu đơn vị của biến không rõ ràng, tôi sẽ cần thêm mô tả vào cuối tên biến. Ví dụ như widthInCentimetersrainFallAmountInInchesPerHourangleInDegreesfailurePercentfailureRatio.

 

Đặt tên cho kiểu dữ liệu đúng/sai (Boolean)

Kiểu dữ liệu boolean chỉ chấp nhận một trong hai giá trị: đúng (true) hoặc sai (false). Tôi thường áp dụng quy tắc isSomethinghasSomethingdoesSomethingdidSomethingshouldDoSomethingwillDoSomething... 

Một vài ví dụ cụ thể: isDisabled, hasErrors, allowsWhitespace, didUpdate, shouldUpdate, willUpdate. 

Một biến boolean đúng đắn sẽ là câu trả lời cho câu hỏi dạng đúng sai (Yes/No question).

 

Đặt tên cho kiểu dữ liệu chuỗi (String)

Kiểu dữ liệu chuỗi là cực kỳ phổ biến, kể cả đối với các thực thể thực tế, ví dụ như tên - name, tiêu đề - title...

Đôi lúc tôi cần lưu trữ một kiểu dữ liệu số như là một chuỗi, tôi sẽ tuân theo quy ước sau: someValueString hoặc là someValueAsString. Đoạn code sẽ trở nên dễ đọc và dễ hiểu hơn nhiều. 

Ví dụ:

//Javascript
const year = parseInt(yearAsString); 

 

Mảng, danh sách, bộ dữ liệu (Array, Collection, Set)

Khi đặt tên cho những biến kiểu này, tôi luôn dùng danh từ số nhiều, ví dụ như customerserrorstasks,... Trong đa số trường hợp, điều này đủ, bởi bạn không cần biết rõ cách hiện thực khi chạy qua vòng lặp.

Trong một vài trường hợp khác, tôi có thể chỉ định cách hiện thực trong biến, ví dụ: queueOfTasksstackOfCardsorderedSetOfTimestamps..., nhưng tôi chưa bao giờ đặt tên biến kiểu customerListhandledOperationSet... Nó hết sức dư thừa và dài dòng khi chỉ cần đặt customers, hoặc handledOperations... là người ta đã hiểu rõ.

 

Biến mapping (hay key/value)

Biến mapping thường được sử dụng cho việc get giá trị (value) từ một từ khóa (key) cụ thể. Trong trường hợp này, tôi tuân theo nguyên tắc keyToValueMap. Chằng hạn như chúng ta có một mapping value chứa tổng các đơn hàng của một khách hàng, chúng ta có thể đặt biến customerToOrderCountMap

 

Đặt tên theo cặp (Pair) và bộ (Tuple)

Trường hợp này khá đơn giản.

Tôi đặt tên biến cặp theo chuẩn variable1AndVariable2, biến bộ theo chuẩn variable1Variable2Variable3AndVariableN.

Ví dụ: heightAndWidthheightWidthAndDepth...

 

Đặt tên cho các đối tượng (Object)

Các objects được xem như là một hiện thực của lớp (instance of class). Các class là một danh từ với ký tự đầu tiên được viết hoa, ví dụ như PersonAccountUserOrderProduct... Tên biến cần phải liên kết với tên class, ví dụ Person $personAccount $accountOrder $order... Bạn cũng có thể mô tả tính chất của biến bằng một tính từ đằng trước, ví dụ như Account $deletedAccountsOrder $completedOrders... Điểm mấu chốt ở đây là chúng ta cần giữ tên class cho phần cuối cùng của tên đối tượng.

 

Đặt tên cho các tham số của function

Phần này không khác với cách đặt tên ở những phần trên, nhưng bạn có thể thêm tiền tố "_" vào đằng trước của biến trong một số trường hợp.

//PHP
function getProductName (Product $product)
{
    ...
}
//SCSS
@function calculate-rem($_target, $_context: 16) {
    @return ($_target / $_context) * 1rem;
}

 

Đặt tên cho các hằng số (Constant)

Các hằng số là một trường hợp đặc biệt. Tôi luôn luôn đặt tên hằng số theo chuẩn snake_case với toàn bộ các ký tự viết hoa. 

Ví dụ: TOOLTIP_SHOW_DELAY_IN_MILLISECS

 

Các quy tắc chung

- Tránh viết tên biến tắt một cách tối nghĩa.

Cố gắng tránh viết tắt hết sức có thể. Tuy nhiên có rất nhiều tên viết tắt có thể sử dụng, ví dụ như Str thay cho StringNum thay cho NumberProp thay cho Property... Các tên biến kiểu này khá phổ biến giữa các lập trình viên nên việc viết chúng hầu như không gây khó khăn cho người khác khi đọc. Nhưng bạn nên tránh việc viết tắt cho các trường hợp không phổ biến. Tôi hầu như chỉ viết tắt để tránh việc kéo dài lê thê tên biến của mình.

- Tránh những tên biến quá ngắn hoặc vô nghĩa.

Tên quá ngắn hầu như không thực sự chỉ rõ ý nghĩa của chúng. Tôi không sử dụng biến $i hay $k, thay vào đó tôi dùng $postIndex hoặc $postKey. Tôi hầu như không đặt các tên biến kiểu $num$tmp, hay $val... Tôi thích mô tả chúng rõ ràng hơn là đánh đố người khác như vậy.

 

Comments

Bài viết nổi bật

Dạo gần đây đi đâu cũng nghe nói về microservices, người người nhà nhà rục rịch chuyển dịch hệ thống sang microservices. Trước khi đưa ra sự so sánh, mình sẽ khái quát một chút về Monolith Application và MicroServices một chút cho các bạn chưa biết nắm rõ hơn nhé.
PHP là ngôn ngữ được sử dụng rộng rãi nhất trên thế giới trong lập trình web. Nó cũng bị ghét nhất. Nhưng tại sao nhiều developer lại ghét nó đến vậy? Hôm nay chúng ta hãy cùng tìm hiểu lý do xem chúng có thuyết phục không nhé ^_^
Lúc trước mình hay sử dụng cách này trên laptop phụ của mình, giờ mua license luôn rồi. Hôm nay mình xin chia sẻ cho bạn nào cần nhé.
JWT Tokens là một cách thức lưu trữ thông tin xác thực hiệu quả, nhưng làm cách nào để chúng ta có thể giúp chúng an toàn hơn? Có 2 cách thường dùng để lưu trữ JWT Tokens là LocalStorage và Cookies. Bây giờ chúng ta sẽ bắt đầu "mổ xẻ" các ưu - nhược điểm của mỗi loại nhé.
Có khá nhiều bạn đã yêu cầu mình một bài viết về Repository Design Pattern. Vậy mục đích của nó là gì? Nó có thực sự cần thiết cho ứng dụng của bạn hay không? Những điểm mạnh, điểm yếu của nó là gì? Chúng ta cùng đi sâu tìm hiểu qua bài viết này nhé.

Mục lục

Related posts

Triển khai Saga Pattern trong microservices với NodeJS và Choreography-Based Saga
Mô hình Saga đưa ra một giải pháp có cấu trúc để giải quyết thách thức này. Nó cung cấp một phương pháp có hệ thống để quản lý transaction qua nhiều microservices. Điều này giải quyết những phức tạp của các transaction phân tán và hoàn toàn tương thích với các nguyên tắc của kiến trúc microservices, được đặc trưng bởi sự kết nối lỏng lẻo và khả năng triển khai độc lập của các service.
Một API cho phép giao tiếp hai chiều giữa các ứng dụng phần mềm thông qua các requests. Một Webhook là một API nhẹ, hỗ trợ chia sẻ dữ liệu một chiều được kích hoạt bởi các events.
Một trong những câu hỏi được đặt thường xuyên nhất về TypeScript là liệu chúng ta nên sử dụng interface hay type. Câu trả lời cho câu hỏi này, giống như nhiều câu hỏi lập trình khác, là nó phụ thuộc vào tình hình cụ thể. Trong một số trường hợp, một cái có lợi thế rõ rệt hơn cái kia, nhưng trong nhiều trường hợp, chúng có thể thay thế cho nhau.
Trở thành một software developer hiệu suất cao không phải là điều dễ dàng. Điều này đòi hỏi bạn phải có kỹ năng và kiến thức về lập trình, cũng như cách tiếp cận và giải quyết các vấn đề phức tạp. Tuy nhiên, nếu bạn có chút kiên nhẫn và sự nỗ lực, bạn hoàn toàn có thể trở thành một developer tài năng và thành công.
Đây là các types cơ bản nhưng cũng phổ biến nhất trong Typescript. Một số types khác phức tạp hơn cũng được xây dựng dựa trên những types cơ bản này.
Trong thế giới lập trình, trách nhiệm lớn nhất của chúng ta không phải chỉ làm cho code chạy được, mà còn phải đảm bảo rằng các đoạn code mà chúng ta viết có thể dễ dàng kiểm tra và bảo trì trong một khoảng thời gian dài.
Thông tin được định nghĩa dưới dạng dữ liệu, kiến thức về thông tin, và trí tuệ về tri thức.
Phân trang - một thành phần không thể thiếu trong các ứng dụng có lượng dữ liệu lớn. Tuy nhiên, bạn hiểu được bao nhiêu về nó?
Javascript là một thành phần không thể thiếu đối với frontend developers. Tuy nhiên, ngay từ lúc ra đời, nó đã tồn tại khá nhiều vấn đề cần khắc phục. Đó là lý do tại sao từ 2015 (ES6) tới 2021 (ES12) ra đời nhằm giúp Javascript trở nên tốt hơn.
Dạo này mình làm việc với mấy bạn trên github, thấy hay xài mấy từ viết tắt mà mình không hiểu lắm. Thôi thì tổng hợp lại một list các từ viết tắt hay dùng trong github luôn cho ai cần :D
Dạo gần đây đi đâu cũng nghe nói về microservices, người người nhà nhà rục rịch chuyển dịch hệ thống sang microservices. Trước khi đưa ra sự so sánh, mình sẽ khái quát một chút về Monolith Application và MicroServices một chút cho các bạn chưa biết nắm rõ hơn nhé.

Tin mới nhất

Triển khai Saga Pattern trong microservices với NodeJS và Choreography-Based Saga
Mô hình Saga đưa ra một giải pháp có cấu trúc để giải quyết thách thức này. Nó cung cấp một phương pháp có hệ thống để quản lý transaction qua nhiều microservices. Điều này giải quyết những phức tạp của các transaction phân tán và hoàn toàn tương thích với các nguyên tắc của kiến trúc microservices, được đặc trưng bởi sự kết nối lỏng lẻo và khả năng triển khai độc lập của các service.
Một API cho phép giao tiếp hai chiều giữa các ứng dụng phần mềm thông qua các requests. Một Webhook là một API nhẹ, hỗ trợ chia sẻ dữ liệu một chiều được kích hoạt bởi các events.
Một trong những câu hỏi được đặt thường xuyên nhất về TypeScript là liệu chúng ta nên sử dụng interface hay type. Câu trả lời cho câu hỏi này, giống như nhiều câu hỏi lập trình khác, là nó phụ thuộc vào tình hình cụ thể. Trong một số trường hợp, một cái có lợi thế rõ rệt hơn cái kia, nhưng trong nhiều trường hợp, chúng có thể thay thế cho nhau.
Trong phần này, chúng ta sẽ tìm hiểu một số khái niệm cơ bản nhất về AWS là gì và một số lợi ích khi sử dụng AWS.
Trở thành một software developer hiệu suất cao không phải là điều dễ dàng. Điều này đòi hỏi bạn phải có kỹ năng và kiến thức về lập trình, cũng như cách tiếp cận và giải quyết các vấn đề phức tạp. Tuy nhiên, nếu bạn có chút kiên nhẫn và sự nỗ lực, bạn hoàn toàn có thể trở thành một developer tài năng và thành công.
Đây là các types cơ bản nhưng cũng phổ biến nhất trong Typescript. Một số types khác phức tạp hơn cũng được xây dựng dựa trên những types cơ bản này.
Trong thế giới lập trình, trách nhiệm lớn nhất của chúng ta không phải chỉ làm cho code chạy được, mà còn phải đảm bảo rằng các đoạn code mà chúng ta viết có thể dễ dàng kiểm tra và bảo trì trong một khoảng thời gian dài.
Thông tin được định nghĩa dưới dạng dữ liệu, kiến thức về thông tin, và trí tuệ về tri thức.
Phân trang - một thành phần không thể thiếu trong các ứng dụng có lượng dữ liệu lớn. Tuy nhiên, bạn hiểu được bao nhiêu về nó?
Javascript là một thành phần không thể thiếu đối với frontend developers. Tuy nhiên, ngay từ lúc ra đời, nó đã tồn tại khá nhiều vấn đề cần khắc phục. Đó là lý do tại sao từ 2015 (ES6) tới 2021 (ES12) ra đời nhằm giúp Javascript trở nên tốt hơn.
Dạo này mình làm việc với mấy bạn trên github, thấy hay xài mấy từ viết tắt mà mình không hiểu lắm. Thôi thì tổng hợp lại một list các từ viết tắt hay dùng trong github luôn cho ai cần :D
Triển khai Saga Pattern trong microservices với NodeJS và Choreography-Based Saga
Mô hình Saga đưa ra một giải pháp có cấu trúc để giải quyết thách thức này. Nó cung cấp một phương pháp có hệ thống để quản lý transaction qua nhiều microservices. Điều này giải quyết những phức tạp của các transaction phân tán và hoàn toàn tương thích với các nguyên tắc của kiến trúc microservices, được đặc trưng bởi sự kết nối lỏng lẻo và khả năng triển khai độc lập của các service.
Một API cho phép giao tiếp hai chiều giữa các ứng dụng phần mềm thông qua các requests. Một Webhook là một API nhẹ, hỗ trợ chia sẻ dữ liệu một chiều được kích hoạt bởi các events.
Một trong những câu hỏi được đặt thường xuyên nhất về TypeScript là liệu chúng ta nên sử dụng interface hay type. Câu trả lời cho câu hỏi này, giống như nhiều câu hỏi lập trình khác, là nó phụ thuộc vào tình hình cụ thể. Trong một số trường hợp, một cái có lợi thế rõ rệt hơn cái kia, nhưng trong nhiều trường hợp, chúng có thể thay thế cho nhau.
Đây là các types cơ bản nhưng cũng phổ biến nhất trong Typescript. Một số types khác phức tạp hơn cũng được xây dựng dựa trên những types cơ bản này.