Lỗi chính tả để tránh những từ dành riêng


45

Tôi thường thấy mã bao gồm lỗi chính tả của các từ phổ biến mà tốt hơn hoặc xấu hơn đã trở thành các từ dành riêng:

  • klasshoặc clazzcho lớp học :Class clazz = ThisClass.class
  • kountđể tính trong SQL:count(*) AS kount

Cá nhân tôi thấy điều này làm giảm khả năng đọc. Trong thực tế của riêng tôi, tôi đã không tìm thấy quá nhiều trường hợp mà một cái tên tốt hơn không thể được sử dụng - itemClasshoặc recordTotal.

Một ví dụ từ JavaDocs cho Class cho thấy điều này trong các tham số:

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

Điều này cho thấy một trường hợp sử dụng hợp lý?


9
Đối với bản ghi: Trong Python, clslà một tên chung (trên thực tế, một tên thành ngữ) cho các biến / đối số liên quan đến các lớp thực tế (những cái bạn khai báo với classtừ khóa và mọi thứ đều là một thể hiện của).

14
Bạn không thích typedef char ínt?
Jeff

14
@muntoo Bạn nói đúng. Tôi cũng nhận được lỗi biên dịch cho iñt. Có kế hoạch của tôi cho domiñation thế giới.
Jeff

1
Tôi đã phá vỡ quy tắc này ... và bây giờ tôi cảm thấy xấu hổ.
jmq

3
Đừng làm điều đó. Tôi có thể thành thật nói rằng tôi chưa bao giờ thấy điều này trước đây và nếu tôi làm vậy, tôi sẽ đổi tên ngay lập tức. Chỉ cần viết tắt nếu bạn phải sử dụng tên biến không mô tả ( Class c).
Cody Grey

Câu trả lời:


63

IMHO, đây là một ý tưởng rất xấu. Các từ dành riêng được dành riêng cho một lý do và làm điều này không làm giảm khả năng đọc.

Tôi cũng hoàn toàn đồng ý với điểm thứ hai của bạn. Đặt tên cho một biến class, ngay cả khi bạn có thể làm điều đó, cũng sẽ tệ như đặt tên cho nó tmphoặc a. Loại nào? Một lớp học của những gì? Tên nên được mô tả.


15
"Các từ dành riêng được dành riêng cho một lý do" <- Điều này. (Mà, trớ trêu thay, được bảo lưu.)
trycatch

16
+1 vì bạn đúng. Nhưng nếu bạn đang viết phần mềm lập lịch trình lớp học, hoặc một cái gì đó, lớp có thể là một biến hoặc tên lớp hợp pháp ...
CaffGeek

8
Meh. "Các từ dành riêng được dành riêng cho một lý do ", đó là các nhà thiết kế ngôn ngữ lười biếng. Có khá nhiều ngôn ngữ phức tạp trong đó các từ chỉ được dành riêng ở những nơi cụ thể được sử dụng. Nhưng Ritchie bắt đầu xu hướng này khi anh ta cần một trình biên dịch nhẹ cho C và hầu hết các nhà thiết kế ngôn ngữ đã học nó từ đó.
Ross Patterson

14
không Ross, đó là bởi vì các lập trình viên (và độc giả nói chung) mong muốn mọi thứ có ý nghĩa rõ ràng hợp lý (đó là lý do tại sao việc học ngoại ngữ thường rất khó, tất cả những điều có nghĩa kép hoặc ý nghĩa khác với ngôn ngữ bạn đã nêu ra từ thời thơ ấu nơi bạn không bao giờ nhận thấy những sự mơ hồ đó bởi vì chúng là một phần của di sản văn hóa của bạn).
jwenting

3
@AlexanderMorou Không, và không có hầu hết các nhà thiết kế ngôn ngữ, họ chỉ bắt đầu với thiết kế của người khác. Nhưng hãy nhìn vào Algol, Fortran, PL / I, Rexx và các ngôn ngữ khác không dựa trên C, và bạn sẽ thấy rằng ngữ pháp mà không có từ dành riêng chắc chắn là có thể, chỉ khó hơn. Ritchie có một lý do chính đáng - những người Unix cảm thấy mọi thao tác bàn phím đều quan trọng, và trên PDP-11, mọi chu kỳ CPU đều quan trọng. Hôm nay? Không nhiều lắm.
Ross Patterson

21

Hướng dẫn phong cách của Python gọi vấn đề này một cách cụ thể và gợi ý:

Nếu tên thuộc tính công khai của bạn va chạm với một từ khóa dành riêng, hãy thêm một dấu gạch dưới duy nhất vào tên thuộc tính của bạn. Điều này là tốt hơn để viết tắt hoặc viết sai chính tả.

Đây có vẻ như là một quy tắc chung khá tốt, giả sử nó không mâu thuẫn với ngữ nghĩa của một ngôn ngữ cụ thể.


7
Tôi cảm thấy đây là lời khuyên thực sự kém từ một hướng dẫn phong cách. Nếu tên thuộc tính của bạn rất gần với một từ khóa, bạn nên tìm một tên tốt hơn. Đơn giản chỉ cần dán một dấu gạch dưới vào cuối sẽ không thêm bất kỳ ý nghĩa nào và làm cho nó có thể gây nhầm lẫn cho người tiếp theo đọc mã.
Wayne Johnston

18
@Wayne: Làm thế nào bạn sẽ đặt tên cho hoạt động hợp nhất trong cấu trúc tìm liên minh khi unionmột từ khóa (như trong C)? Bạn sẽ gọi nó foochỉ vì nó không giống như thế union?
Fred Foo

OTOH, clslà tên đối số chuẩn cho phương thức lớp. Ngoài ra, ví dụ trong các đối tượng Django có .idthuộc tính, tất nhiên xung đột với idchức năng tích hợp.
vartec

1
@GoloRoden Tôi chưa bao giờ nghe ai nói rằng họ "hợp nhất" hai bộ khi tính toán liên minh. Nó không phải là một phần của biệt ngữ. "Hợp nhất" sẽ tốt hơn, nhưng một mergephương pháp vẫn cần tài liệu nói rõ rằng nó thực hiện liên minh và được đổi tên vì lý do thuần túy kỹ thuật.
Fred Foo

2
@GoloRoden Theo Merriam-Webster nó không phải là động từ, nhưng hãy xem câu trả lời này .
maaartinus

18

Mùi mã.

string stringVariable = "";

Các mã trên không cho tôi biết gì về các biến dự định sử dụng.

class Klass

Cùng một vấn đề

string UserNameString = "bmackey"

Đoạn mã trên không được yêu cầu chuỗi từ khóa được gắn vào tên biến. Nếu bạn thấy mình cần xác định các loại theo tên biến, mã của bạn quá dài. Ngưng tụ-tái cấu trúc.


Nó không cho bạn biết bất cứ điều gì vì nó không phải là "mã", đó là một khai báo biến bị cô lập. Một "lớp" hoặc "klass" rất có thể cho bạn biết tất cả những gì bạn cần biết. Ví dụ, một phương thức chung có thể nhận được một Class<T>tham số và điều này có thể có ý nghĩa. Vì vậy, tôi không đồng ý rằng đó là một mùi mã.
Andres F.

5

Cá nhân, tôi nghĩ rằng đó là một lựa chọn hoàn toàn hợp lệ cho kiểu mã của bạn.

Chúng là những từ dành riêng để trình biên dịch không phải quyết định xem bạn có nghĩa là cơ chế ngôn ngữ hay biến của bạn. Với ý nghĩ đó, nó ngụ ý rằng họ mong đợi mọi người có nhu cầu về một biến như một từ dành riêng.

Đi qua nguồn đi kèm với JDK 1.6 R21, tôi thấy 917 lần xuất hiện của "clazz". Rõ ràng, họ nghĩ rằng đó là phong cách chấp nhận được.

Làm thế nào để nhóm của bạn cảm thấy về nó? Nếu bạn nghĩ nó tệ, nhưng 9 người khác trong đội của bạn nghĩ nó tốt, thì bạn phải cắn viên đạn và chấp nhận nó. Miễn là có thông tin liên lạc về những gì ổn và những gì không, và bạn đang đưa ra những vấn đề bạn thấy khi bạn nhìn thấy, thì mọi chuyện sẽ ổn thôi.

Làm thế nào nhóm của bạn cảm thấy về phong cách mã quan trọng hơn ý kiến ​​của tôi, hoặc bất cứ ai khác trong bài viết này . Điều đó đúng với điều này và bất kỳ quyết định kiểu mã nào khác mà bạn có thể có.


1
Phải, nhưng cuối cùng nhóm của bạn sẽ thay đổi. Nhiều năm sau, sẽ có một anh chàng tội nghiệp nhìn vào mã của bạn đầy những chiếc kính và những chiếc kính và nói "WTF!".
MrFox

4
Nếu bạn đang sử dụng cả hai klassclazzđó là một điều xấu. Bạn cần phải nhất quán để họ chỉ phải học một lần. Và lý tưởng là điều này cũng được nêu trong hướng dẫn về phong cách của các đội, vì vậy nó không gây nhiều bất ngờ.
corsiKa

Mã được viết không chỉ cho những người trong nhóm của bạn, mà còn cho cả thế giới đọc. Khi nhóm của bạn đang ở trên một chiếc xe buýt đi qua một vách đá, một người khác sẽ bắt đầu đọc mã. Sử dụng các tên mô tả đầy đủ và chính xác các biến là gì, chứ không phải cách biểu thị.
Rob K

1
Không, đơn giản là không. Nhóm của bạn ở rất xa, nhiều khả năng sẽ luân chuyển các thành viên từ từ theo thời gian. Bạn có thể lên kế hoạch cho một người bị xe buýt đâm, nhưng bạn không thể lập kế hoạch cho toàn bộ đội của mình bị xe buýt đâm. Hầu hết các mã được viết cho có thể một tá người cần đọc nó, một nửa trong số họ trong quá trình xem xét mã.
corsiKa

4

Lỗi chính tả để tránh những từ dành riêng là một ý tưởng tồi.

  • Lỗi chính tả rất khó phân biệt với chính tả, do đó chúng làm cho mã khó đọc hơn.

  • Lỗi chính tả rất khó nhớ, do đó một số lỗi chính tả không nhất quán có khả năng cạnh tranh trong mã, khiến mã khó viết hơn và khó đọc hơn.

  • Các từ dành riêng đề cập đến ngôn ngữ đang được sử dụng để giải quyết vấn đề, chứ không phải cho chính vấn đề. Một tên biến nên trỏ đến một khái niệm liên quan đến vấn đề.

Do đó, tốt hơn là chọn một tên thay thế, mô tả hoặc nếu không có sự thay thế thỏa mãn tồn tại, để đủ điều kiện từ dành riêng như trong:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}

3

Class clazzcó mùi như "Tôi không buồn cố gắng đưa ra một cái tên hay". Một biến luôn đại diện cho một cái gì đó, và một cái tên hay mô tả điều đó. Tôi từ chối tưởng tượng rằng clazzví dụ trong mọi trường hợp là tên tốt nhất có thể. Có phải nó là một tham chiếu đến một lớp -> class_Vference, là một bản sao của một đối tượng lớp -> class_copy, v.v. Có thể cũng bỏ "lớp" và chỉ sử dụng từ mô tả, ví dụ:

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

Ở đây clazz là lớp mục tiêu mà kiểm tra sẽ được thực hiện trên, vì vậy

checkMemberAccess(Class<?> target, int which)

sẽ mô tả tốt hơn những gì tham số được sử dụng cho hơn clazz từng có.


IMHO không tốt hơn, bạn có thể gọi nó là 'classToBeAccessed` hoặc bất cứ điều gì, nhưng bất kỳ tên mô tả nào khác chỉ hiển thị rõ ràng. Tôi chỉ thích tên dài nếu họ cung cấp thông tin hữu ích.
maaartinus

1
classToBeAccessedthực sự là một cái tên tốt ( classToBeCheckedcó lẽ sẽ còn tốt hơn).
hlovdal

1

Nếu họ sử dụng tên dành riêng cho một biến, thì đó là biến được đặt tên kém. Ngay cả khi đó là một tên hợp pháp, chẳng hạn như Class cho phần mềm lớp học.

Các biến được đặt tên kém là dấu hiệu của suy nghĩ kém hoặc mã thông thường - hãy cẩn thận với các vấn đề khác trong Phần mềm bạn đang duy trì.


0

Tôi nghĩ rằng lỗi chính tả hoặc viết tắt có chủ ý là một ý tưởng tốt nếu được sử dụng cẩn thận và nhất quán .

Xem xét trong Java:

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

Nơi để sử dụng lỗi chính tả là nơi mà từ dành riêng rõ ràng là từ tốt nhất cho công việc. Có hai nơi không sử dụng lỗi chính tả mà bạn có thể bị cám dỗ.

  1. Bạn không cảm thấy nghĩ về một cái tên hay
  2. Bạn chỉ muốn một biến giả và nó không cần một tên mô tả

Trong trường hợp đầu tiên, khá rõ ràng rằng sự lười biếng hiếm khi là một chính sách tốt để tạo mã chất lượng. Trong trường hợp thứ hai, chọn một biến thực sự ngắn. Đó là những gì các nhà toán học làm mọi lúc, và các lập trình viên làm cho các chỉ số. Không có lý do gì để giới hạn bản thân bạn làm điều này cho các chỉ số nếu nó thực sự chỉ là một biến giả:

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

Bạn không mất bất cứ thứ gì có tên biến ngắn khi phương thức hoặc cấu trúc của mã cho bạn biết cái gì phải ở đó.


2
Tôi xin lỗi, tôi không thể đồng ý. NextMeeting hoạt động chính xác như thế nào? Logic là tối nghĩa. Bạn đang buộc tôi phải tìm định nghĩa của Klass mỗi khi tôi đọc mã của bạn vì tên này là vô nghĩa. Nếu thay vào đó bạn có nextMeeting (MeetRoom họpRoom), tôi sẽ có một định nghĩa ít lớp (klass? Clazz?) Để đọc và do đó sẽ hiệu quả hơn. Mã được đọc nhiều hơn viết.
MrFox

@suslik - nextMeeting(MeetingRoom r)thật nhiều. Có chuyện gì với meetingRoombạn vậy? Nếu nextMeeting(int meetingRoom)tôi hiểu, nhưng quan điểm của tôi là sử dụng tên biến ngắn khi thông tin đã có sẵn từ các nguồn khác .
Rex Kerr

Bài viết của tôi là về sự tồn tại của Klass trong cơ sở mã. Đôi khi tôi đồng ý với các tên biến ngắn, nhưng nếu các phương thức của bạn dài ra và bạn phải tiếp tục duy trì để đảm bảo rằng "r" là một MeetRoom thì điều đó cũng không tuyệt vời. Tôi tò mò không biết nhược điểm của cuộc họp là gì? Không gian ngang? Quá dài để gõ?
MrFox

@suslik - Có, bạn mất bối cảnh ngang với tên biến dài. Bạn mất bối cảnh dọc với các phương thức dài, vì vậy tốt nhất là cố gắng tránh các phương thức đó (nhưng tôi đồng ý nếu bạn vẫn làm điều đó, bạn có thể muốn tên biến của mình là lời nhắc tốt hơn). Klasslà một thay thế khi có một từ dành riêng . Tôi không khuyên bạn nên sử dụng một lỗi chính tả khi chính tả ban đầu có sẵn!
Rex Kerr

0

Tôi đã thấy những cách sử dụng hợp pháp Class klasskhi thực hiện phản xạ nơi bạn thực sự làm việc với một thể hiện của Classlớp.


2
Câu hỏi không phải là liệu có trường hợp nào bạn có một trường hợp không, mà là bạn có nên sử dụng chính tả đó hay một tên mô tả hơn như userClasshoặc một số tùy chọn khác.
Nicole

2
Trong trường hợp như vậy tôi muốn classInstancehơn klass.
Konrad Morawski

2
@KonradMorawski: Nhưng tất cả các đối tượng bạn làm việc cùng là các trường hợp, vì vậy classInstancekhá dư thừa. Hơn nữa, tôi có thể tưởng tượng một cái gì đó như class klass; Object classInstance = klass.newInstance;.
maaartinus

0

Tôi thường thấy mã bao gồm lỗi chính tả của các từ phổ biến mà tốt hơn hoặc xấu hơn đã trở thành các từ dành riêng:

klass hoặc clazz cho lớp: Class clazz = ThisClass. class

kount cho số đếm trong SQL: đếm (*) NHƯ kount

Cá nhân tôi thấy điều này làm giảm khả năng đọc. Trong thực tế của riêng tôi, tôi đã không tìm thấy quá nhiều trường hợp không thể sử dụng tên tốt hơn - itemClass hoặc recordTotal.

Tuy nhiên, nó phổ biến đến mức tôi không thể không tự hỏi liệu tôi có phải là người duy nhất không? Bất cứ ai có lời khuyên hoặc thậm chí tốt hơn, trích dẫn khuyến nghị từ các lập trình viên được kính trọng về thực hành này?

Đối với các biến cục bộ và các đối số chính thức, nó không thành vấn đề.

Bất kỳ tên nào cũng được miễn là nó không cố ý gây hiểu lầm hoặc gây mất tập trung. Trong ví dụ của bạn:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

không quan trọng là biến cục bộ duy nhất là "clazz" hay "klass" hay "cls" hay chỉ đơn giản là "c". Tôi có lẽ sẽ chỉ nội tuyến biểu thức:

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

Độ dài của tên biến phải liên quan đến phạm vi của biến. Đối với các biến cục bộ trong các phương thức ngắn (và tất cả chúng nên ngắn), các tên rất ngắn là ổn.


nội tuyến của bạn trông không chính xác ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()- bị mất ClassUtils.loadClasstrên đường đi
gnat

0

Tôi nghĩ rằng lỗi chính tả luôn là một ý tưởng tồi. Nó chỉ không tốt cho độc giả của bạn. Tôi, cho một, sẽ tự hỏi liệu tôi đã bỏ lỡ một cái gì đó khi tôi nhìn thấy từ này klass. (Ý của họ là class, hay họ có nghĩa là cướp biển?) Ít nhất với tôi, tất cả các lỗi chính tả mà tôi nhận ra đều gây khó chịu.

Đối với rất ít trường hợp, trong đó từ dành riêng thực sự là điều quan trọng duy nhất được biết về biến, tôi sẽ sử dụng các từ thay thế sau:

  • Nếu đó là một đối số chức năng, sử dụng aClassthay vì class.

  • Nếu đó là biến cục bộ hoặc biến thành viên, hãy sử dụng myClassthay vì class.

  • Nếu đó là một phụ kiện, sử dụng getClass()thay vì class().

Tất nhiên, tiền tố được thêm vào là khá vô nghĩa, và do đó chỉ nên được sử dụng như là phương sách cuối cùng. Nhưng ít nhất nó không can thiệp vào trình phân tích cú pháp tinh thần của người đọc của bạn và đó là một cách không an toàn để tránh những từ dành riêng.


0

Một lợi ích cho chính tả sáng tạo, là khả năng tìm kiếm tốt hơn. Tôi nghĩ rằng việc tìm kiếm mã đầy đủ cho những thứ độc đáo sẽ dễ dàng hơn nhiều so với những từ thông dụng, nơi bạn sẽ thường xuyên tìm thấy tất cả những điều sai và 1000 trong số đó. Ví dụ, tôi đã từng sở hữu kzpg.com. Google mà bây giờ và bạn sẽ chỉ thấy một vài lần truy cập. Nó là duy nhất và do đó rất dễ tìm thấy.

Nhưng theo một biện pháp tôi nghĩ câu hỏi này là một trong những ý kiến ​​nhiều hơn là chất. Cá nhân tôi đã lớn lên trên Forth, nơi tất cả là về lời nói, và rất nhiều trong số họ. Một người học được cách rất sáng tạo để cứu ngón tay của một người. Cuối cùng, tôi có khoảng 640.000 ký tự, ít nhiều trong cơ sở nguồn của tôi. Vì vậy, giữ cho các từ ngắn là quan trọng để hoàn thành công việc.


Liên kết đó bị hỏng ngay bây giờ.
Peter Mortensen
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.