01/10/2018, 17:08

Tên biến ngắn 1, 2 ký tự có sao không?

Dạo này Đạt học Go và Go có quan điểm về cách đặt tên biến thế này:

Variable Names

Variable names in Go should be short rather than long. This is especially true for local variables with limited scope. Prefer c to lineCount. Prefer i to sliceIndex.

The basic rule: the further from its declaration that a name is used, the more descriptive the name must be. For a method receiver, one or two letters is sufficient. Common variables such as loop indices and readers can be a single letter (i, r). More unusual things and global variables need more descriptive names.

Link: https://github.com/golang/go/wiki/CodeReviewComments#variable-names

Nói ngắn gọn, Go khuyến khích đặt tên ngắn thay cho tên dài. Đặc biệt là trong trường hợp tên biến có nằm trong scope nhỏ, hay nói đơn giản là trong hàm ngắn hoặc thời gian sống của biến ngắn.

Điều này đặc biệt đúng khi mình dùng biết i thay cho index trong for loop của nhiều ngôn ngữ

c++

for(int i = 0; i < n; i++) {
...
}

hay python

for i in xrange(n):

Hay go

for i := 0; i < n; i++ {
}

Trước đây thì Đạt phản đối cách này, tuy nhiên khi code go một thời gian và áp dụng kiểu đặt tên biến ngắn thì phát hiện ra là code của mình ngắn hơn nhiều. Vì muốn đặt tên biến ngắn mà vẫn có ý nghĩa cụ thể đúng thì hàm của mình phải ngắn, code phải rõ ràng.

Các bạn thử xem

Nhưng lưu ý là với biến toàn cục hoặc tên hàm thì phải dài và đầy đủ nghĩa tùy thuộc vào thời gian sống của biến (hoặc scope của biến)

Mai Anh Dũng viết 19:12 ngày 01/10/2018

Một điểm nữa là khi giải mấy bài algorithm thì hầu hết là mình dùng tên biến khá ngắn để giải cho nhanh. Code mấy bài này mà code dài thì thường không phải là code tốt nhất.

Ví dụ một bài classic twoSum thì chỉ cần thế này là đủ

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        m = {}
        for i, num in enumerate(nums):
            x = target - num
            if x in m:
                return m[x], i
            m[num] = i
leetcode.com

Two Sum - LeetCode

Can you solve this problem?

Tynk Huynk viết 19:23 ngày 01/10/2018

Trong Clean Code có bàn về vụ này, nếu là biến có tên ngắn nhưng thông dụng trong lập trình, ví dụ như i trong vòng for, j trong nested for, hay biến local có scope ngắn thì không sao cả

HK boy viết 19:10 ngày 01/10/2018

Biến chạy là i, j thì huyền thoại rồi

Prefer c to lineCount

Trước giờ em tưởng có mỗi em dùng vậy thôi chứ Lúc em viết trên C++ thì thấy

for (int c = 0; c < lineCount; c++) // nhìn c++ này thấy sướng ^^

Đối với nhiều hàm, ví dụ như hàm mang tính toán học (gcd, f(x) = …) thì việc đặt biến ngắn càng dễ hiểu, vì nó gần gũi với toán học.

Mai Anh Dũng viết 19:09 ngày 01/10/2018

Trong Go thì họ extreme hơn, chỉ cần ngắn, không nhất thiết phải là những biến thông dụng. Ví dụ

r := Reader()
w := Writer()
mt := Matrix()
z := ZooKeeper()

Ví dụ một đoạn code trong coredns ( Đạt đang thử nghiệm cái coredns cho một project nên có đọc ít code)

github.com

coredns/coredns/blob/18a77cd04557b810eba96a7239d39ee2d7a92157/plugin/kubernetes/setup.go#L40

  1. // all CoreDNS logging. We can't do *that* in the init function, because we, when starting, also barf some
  2. // things to stderr.
  3. flag.Set("logtostderr", "true")
  4. caddy.RegisterPlugin("kubernetes", caddy.Plugin{
  5. ServerType: "dns",
  6. Action: setup,
  7. })
  8. }
  9. func setup(c *caddy.Controller) error {
  10. // See comment in the init function.
  11. os.Stderr = os.Stdout
  12. k, err := kubernetesParse(c)
  13. if err != nil {
  14. return plugin.Error("kubernetes", err)
  15. }
  16. err = k.InitKubeCache()
  17. if err != nil {

Ở đây mình thấy những tên biến 1 ký tự khá thông dụng

  • c cho *caddy.Controller
  • k cho kubernetesParse (result)
Văn Dương viết 19:20 ngày 01/10/2018

Mình for mảng 1 chiều dùng i hoặc idx.
Mảng 2 chiều không dùng i, j, k… mà dùng y,x hoặc cidx, ridx.

Còn biến thông thường độ dài <15.

Mai Anh Dũng viết 19:11 ngày 01/10/2018

Đấy cũng là practice mà Đạt làm theo trước đây, bây giờ đang thử cái practice 1, 2 ký tự này

Văn Dương viết 19:18 ngày 01/10/2018

Biến ngắn 1,2 ký tự mình vẫn dùng ở khu vực có scope nhỏ, ít biến , thời gian sống ngắn.
Nếu khu vực khác mà không có comment đi kèm sau này bảo trì mệt lắm

lx viết 19:17 ngày 01/10/2018

Em thì chỉ dùng tên biến ngắn cho cái nào là well-known hoặc là cho các biến mà ký hiệu của nó vốn là ngắn rồi (vd như trong toán, vector u, v, lớp w thì đơn giản là u, v, w).

Còn nếu đặt biến ngắn thì thường em ko hiểu ngay khi đọc lại code.

Mai Anh Dũng viết 19:12 ngày 01/10/2018

theo style này thì phải code sao cho thật rõ, thật obvious ấy.

Thược Nguyễn viết 19:12 ngày 01/10/2018

Cái này hình như bên công nghệ thông tin của mình học của bên toán. Trước em có đọc đc 1 sách toán nào đó có quy định chia bảng chữ cái làm 3 phần. A,b, c… thì làm hằng số. I, j, k thì làm gì gì đó và x,y,z thì làm biến. Đại loại vậy

Quan viết 19:13 ngày 01/10/2018

Đối với các biến mà làm index cho vòng lặp thì đặt ngắn. Hoặc scope ngắn thì đặt ngắn.
Khi ta tạo ra các abstraction layer thì từ đó gắn với mục đích thực tế ta nên đặt dài hơn để làm rõ các nghiệp vụ.

d2luu viết 19:21 ngày 01/10/2018

e thấy việc dùng tên biến ngắn hay dài nó phụ thuộc vào nhiều yếu tố:

  • Đặc trưng của ngôn ngữ đó (ví dụ như Go a đề cập ở trên)
  • Code Convention
  • Team. Nếu trong team có 1 người viết theo style ngắn này mà những người khác không quen đọc code sẽ rất confuse, kiểu như đọc tiếng việt không dấu vậy
    Code theo style ngắn này thường đc các thư viện implement hơn, vì nhiều thư viện cần có performance tốt nên họ optimize nhiều nhất có thể :v
    Còn trong khi teamwork thì lúc viết code tốt hơn hết là cứ clear cho mọi người làm việc cùng nhau dễ dàng hơn.
Bài liên quan
0