Là việc sử dụng các biến một chữ cái được khuyến khích? [đóng cửa]


13

Việc sử dụng các biến một chữ cái có được khuyến khích trong Java không? Trong đoạn mã hoặc hướng dẫn, bạn thường thấy chúng. Tôi không thể tưởng tượng việc sử dụng chúng được khuyến khích bởi vì nó làm cho mã tương đối khó đọc hơn và tôi không bao giờ thấy chúng được sử dụng trong các ngôn ngữ lập trình khác!


3
Có và không. Hoàn toàn phụ thuộc vào tình hình.
Zavior




1
Không phải lúc nào cũng làm cho mã khó đọc hơn. Ví dụ, khi bạn đang triển khai mã dựa trên các phương trình toán học, thường sử dụng các tên biến giống như được sử dụng trong các phương trình. (Nhận xét quay lại tờ giấy / văn bản nơi tìm thấy các phương trình ban đầu hoặc nếu bạn giống tôi, đôi khi bạn bao gồm mã LaTeX cho chúng.)
jamesqf

Câu trả lời:


32

Đặt tên đúng cách là khó. Rất vất vả. Nếu bạn nhìn nó theo một cách khác, bạn cũng có thể hiểu điều này có nghĩa là những thứ được đặt tên đúng là quan trọng. (Nếu không, tại sao bạn lại bỏ ra công sức đặt tên cho nó?)

Nhưng, đôi khi, tên của những thứ không quan trọng. Đó là lý do tại sao chúng ta có những thứ như các hàm ẩn danh ("lambdas"), chẳng hạn: bởi vì đôi khi nó không đáng để đặt tên cho thứ đó.

Có rất nhiều ví dụ, trong đó tên biến đơn (hoặc rất ngắn) là phù hợp:

  • i, j, k, lCho chỉ số vòng lặp
  • kvcho khóa và giá trị trong bản đồ
  • ncho một số (ví dụ: trong Math.abs(n))
  • a, b, cCho các đối tượng tùy ý (ví dụ trong max(a, b))
  • echo phần tử trong một for eachvòng lặp chung
  • f cho hàm trong hàm bậc cao hơn
  • p cho hàm vị ngữ trong bộ lọc
  • T, T1, T2, ... cho các biến kiểu
  • E cho các biến kiểu đại diện cho kiểu phần tử của tập hợp
  • R cho một biến kiểu đại diện cho loại kết quả của hàm
  • excho ngoại lệ trong một catchmệnh đề
  • op cho các hoạt động trong một bản đồ hoặc gấp
  • nối thêm chữ cái sđể chỉ số nhiều, tức là một bộ sưu tập (ví dụ: nscho một bộ sưu tập các số xsyscho hai bộ sưu tập các đối tượng chung tùy ý)

Tôi không bao giờ thấy chúng được sử dụng trong các ngôn ngữ lập trình khác!

Chúng rất phổ biến trong hầu hết mọi ngôn ngữ mà tôi biết (và có thể cả ở những ngôn ngữ tôi không biết.) Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, bạn đặt tên cho nó.


5
-1 Sử dụng tên biến 1 ký tự là lập trình lười biếng. Đôi khi lười biếng cũng không sao, nhưng nếu bạn bắt kịp kltrong các chỉ số vòng lặp, thì điều đó quá xa (bạn không nên có nhiều vòng lặp lồng nhau để bắt đầu; trích xuất chúng thành các hàm) . Cá nhân, tôi không bao giờ sử dụng nhiều hơn một biến 1 chữ cái cho mỗi hàm, nhưng tôi bắn cho 0.
BlueRaja - Danny Pflughoeft

Ngoài ra, lhoặc lenđược sử dụng cho một chiều dài và arrcho một mảng (ví dụ for(var i=0; l=arr.length; i<l; i++):). Ngoài ra, fncó thể được sử dụng thay vì f, khi bạn đề cập đến một chức năng.
Ismael Miguel

4
@ BlueRaja-DannyPflughoeft Tôi thích nghĩ về nó như là lập trình hiệu quả. Jorg có lẽ có thể mở rộng khi các chữ cái duy nhất phù hợp, không chỉ ở đâu, nhưng thành thật mà nói tôi tưởng tượng hầu hết các lập trình viên vẽ đường khác nhau. Đối với các chỉ số vòng lặp, tôi có thể lập luận rằng bất kỳ mã nào trong đó các chỉ mục không cần tên có giá trị ngữ nghĩa là đủ đơn giản để biện minh cho việc lồng nhiều cấp vào trích xuất không cần thiết. Chúng cũng có thể được sử dụng trong các vòng riêng biệt để tránh các vấn đề phạm vi có thể xảy ra mà Nelson đưa ra .
Lilienthal

2
@Lilienthal: Mã phải hiệu quả để đọc, không hiệu quả để viết. Thông thường chúng là những điều tương tự, nhưng không phải luôn luôn, như trong trường hợp này.
BlueRaja - Daniel Pflughoeft

@ BlueRaja-DannyPflughoeft Không phải trong tất cả các chương trình không, nhưng tôi không thấy có gì sai với đề xuất của Jorg. Như Killian nói: "Bất cứ điều gì lâu hơn có thể làm cho ngữ nghĩa trở nên rõ ràng hơn, nhưng mất nhiều thời gian hơn để đọc." Nhưng điều này có lẽ phần lớn là vấn đề sở thích cá nhân và phong cách.
Lilienthal

20

Nếu vòng lặp của bạn không làm gì ngoài việc sử dụng một biến để đếm

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

sau đó, đây là tên tốt nhất bạn có thể sử dụng. Bất cứ điều gì dài hơn có thể có thể làm cho ngữ nghĩa trở nên rõ ràng hơn, nhưng mất nhiều thời gian hơn để đọc.

Nếu biến được sử dụng bên trong vòng lặp, một tên có ý nghĩa có thể hữu ích.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

Nếu biến của bạn được sử dụng trên toàn phương thức, tên của nó sẽ dài hơn; nếu nó được sử dụng trên toàn lớp, tên của nó tốt hơn là hoàn toàn tự giải thích, nếu không nó gần như chắc chắn sẽ làm giảm sự rõ ràng của mã của bạn.

Nói tóm lại, phạm vi của biến càng lớn thì tên của nó càng dài.


Thành thật mà nói, tôi đã đi đến điểm mà tôi sẽ không sử dụng một tên biến ký tự, dấu chấm. Tôi cố gắng sử dụng tên đánh vần cách sử dụng, ngay cả đối với quầy. Tôi thường sử dụng một biến có tên indexkhi lặp qua một mảng chẳng hạn.
Michael

13
@Michael: Theo tôi, Lập trình Jargon là ngôn ngữ riêng của nó, nó không đúng tiếng Anh. Và trong ngôn ngữ đó, ilà một từ thích hợp với nghĩa được xác định chính xác, cụ thể là "chỉ mục bạn không cần phải lo lắng quá nhiều". Nhưng tôi đoán đó là vấn đề quen thuộc. Nếu bạn đọc nhiều Haskell, bạn sẽ quen với việc đọc mđơn nguyên , fnhư functor , xnhư một số đối tượng , xsnhư một danh sách của xs và vân vân.
Jörg W Mittag

2
Chỉ là một cảnh báo thực sự lớn. Tên biến chữ cái duy nhất chỉ OK nếu ngôn ngữ có phạm vi biến phù hợp. Rõ ràng bạn sẽ hỏi 'Ngôn ngữ nào không có phạm vi phù hợp?'. Chà, tôi đã mất ba giờ để biết rằng JavaScript không phạm vi các biến trong vòng lặp FOR. Hãy thử với vòng lặp for bên trong vòng lặp for sử dụng cùng tên biến. Nó sẽ thổi bay tâm trí của bạn.
Nelson

@Nelson: Câu hỏi này và câu trả lời này là về Java. Rõ ràng các ngôn ngữ khác nhau có thể có một số cân nhắc khác nhau. (JavaScript không phải là ngôn ngữ giống như Java.)
ruakh

Tôi là tất cả cho các tên biến một chữ cái bất cứ khi nào chúng có ý nghĩa nhất, nhưng tôi không đồng ý rằng đó ilà "tên tốt nhất bạn có thể sử dụng" cho một vòng lặp chỉ sử dụng một biến để đếm. Trong trường hợp đó, tôi muốn thấy countđược sử dụng như tên biến: có thể hiểu ngay lập tức. for (int count = 0; count < 10; count++)hoặc while (count--).
Todd Lehman

4

Đọc mã trong câu trả lời của Kilian, tôi không nghĩ rằng "có một vòng lặp, và có một biến, và nó có kiểu int, và nó có một tên, và tên là i, và nó được khởi tạo thành 0 ,. .. ". Tôi chỉ nghĩ "vòng lặp ..." trong đó ba dấu chấm tượng trưng cho những chi tiết không quan trọng mà tôi thậm chí không nghĩ tới. Trong suy nghĩ của lập trình viên của tôi, biến đó không thực sự tồn tại, nó chỉ là một vật phẩm mà tôi phải gõ, giống như for (;;) {} làm cho nó trở thành một vòng lặp.

Vì biến đó thậm chí không tồn tại trong tâm trí của tôi, tại sao tôi lại đặt cho nó một cái tên, ngoài những gì thực sự cần thiết?


Tôi nên thêm rằng trong kiểu xây dựng đó, tôi thường không muốn sử dụng ngay cả i, nhưng _đối với biến rõ ràng là vô nghĩa. Nhưng không phải ai cũng quen thuộc với Prolog, và nó có thể sẽ tạo ra sự chú ý nhiều hơn là loại bỏ.
Kilian Foth

Bạn cũng cần xem xét cách sử dụng biến trong vòng lặp, không chỉ trong for (...)tiêu đề.

@KilianFoth: tôi cũng sử dụng cách đó trong Haskell, ML, F # và Scala. Và trong Ruby, mặc dù _là một định danh hợp pháp giống như bất kỳ định danh nào khác, có một thay đổi gần đây là các biến cục bộ không được sử dụng có tên _(hoặc bắt đầu bằng _) không tạo ra cảnh báo "biến cục bộ không sử dụng", mặc dù Ruby thường cảnh báo về chúng.
Jörg W Mittag

-1

Nếu bạn đang đề cập đến các chữ cái i, j, k là các chỉ số trong một vòng lặp, thì đó là một cách làm phổ biến trong Java và các ngôn ngữ lập trình khác. Mặc dù có lẽ tốt hơn để sử dụng một vòng lặp cho mỗi kiểu, chẳng hạn như

for(User user: users) {
  doSomethingWithTheUser(user);
}

thay vì

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

Trong Java, kiểu lặp đó chỉ được giới thiệu gần đây. Đó có thể là lý do tại sao bạn nhận thấy nó nhiều hơn cho Java, vì việc lặp qua các chỉ mục được sử dụng là cách phổ biến nhất để lặp qua một mảng hoặc danh sách.

Có một vài trường hợp khác mà các chữ cái đơn có thể phù hợp, chẳng hạn như khi thực hiện một hàm toán học trong đó các chữ cái đơn lẻ như n, x hoặc y, có thể đã phổ biến. Nhưng nói chung, không, đặt tên cho biến của bạn một cái gì đó có ý nghĩa.


5
"Trong Java, phong cách lặp đó chỉ mới được giới thiệu gần đây" ... như trong, một thập kỷ trước? ( Java 5 đã được phát hành năm 2004 )
meriton

1
Vâng, đó là khá gần đây. Không, tôi không già. Câm miệng. Những đứa trẻ chết tiệt ra khỏi bãi cỏ của tôi. Vẫn còn nhiều ứng dụng Java kế thừa từ trước Java 5. Và thậm chí nhiều lập trình viên Java đã học ngôn ngữ trên Java 1.4 và từ chối cập nhật cách họ làm việc. Và thậm chí nhiều mẫu mã trực tuyến có từ đầu những năm 2000 (vâng, chúng tôi đã có Internet trở lại; chúng tôi chỉ gọi nó là Web 2.0).
Nick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.