Làm thế nào để đặt tên một cái gì đó khi tùy chọn hợp lý là một từ khóa dành riêng? [đóng cửa]


64

Đôi khi, tên hợp lý nhất cho một cái gì đó (ví dụ: một biến) là một từ khóa dành riêng trong ngôn ngữ hoặc môi trường lựa chọn. Khi không có từ đồng nghĩa thích hợp như nhau, làm thế nào để đặt tên cho nó?

Tôi tưởng tượng có những heuristic thực hành tốt nhất cho vấn đề này. Chúng có thể được cung cấp bởi những người sáng tạo hoặc thống đốc của ngôn ngữ lập trình và môi trường. Ví dụ: nếu python.org (hoặc Guido van Rossum) nói cách đối phó với nó trong Python, đó sẽ là một hướng dẫn tốt trong cuốn sách của tôi. Một liên kết MSDN về cách đối phó với nó trong C # cũng sẽ tốt.
Ngoài ra, các hướng dẫn được cung cấp bởi những người có ảnh hưởng lớn trong công nghệ phần mềm cũng có giá trị. Có lẽ Google / Bảng chữ cái có một hướng dẫn phong cách tốt đẹp dạy chúng ta cách đối phó với nó?

Đây chỉ là một ví dụ: trong ngôn ngữ C #, "mặc định" là một từ khóa dành riêng. Khi tôi sử dụng một enum, tôi có thể muốn đặt tên cho giá trị mặc định là "default" (tương tự như các câu lệnh "switch"), nhưng không thể.
(C # là trường hợp nhạy cảm, và hằng enum nên được vốn, vì vậy "mặc định" là sự lựa chọn rõ ràng ở đây, nhưng chúng ta hãy giả định hướng phong cách hiện tại của chúng tôi ra lệnh tất cả các hằng số enum là trở thành chữ thường.)
Chúng ta có thể xem xét các từ "defaultus ", Nhưng điều này không tuân thủ Nguyên tắc tối thiểu ngạc nhiên . Chúng ta cũng nên xem xét "tiêu chuẩn" và "ban đầu", nhưng thật không may "mặc định" là từ truyền đạt chính xác mục đích của nó trong tình huống này.


15
Tôi sẽ sử dụng cái gì đó như "default_value". Ý nghĩa vẫn giữ nguyên, nhưng bạn phải gõ thêm một vài ký tự.
Mael

26
@Darkhogg nếu tôi tìm thấy một trong những mã trong mã của mình, tôi sẽ thay đổi chúng ngay lập tức. Lỗi chính tả hoặc vi phạm quy ước đặt tên không được chấp nhận.
MetaFight

26
@MetaFight - ngoại trừ trong Java, việc gọi một biến chứa một lớp clazzthực tế là một tiêu chuẩn thực tế. Nó về cơ bản một phần của quy ước đặt tên nền tảng. Làm bất cứ điều gì khác sẽ vi phạm những kỳ vọng mà người khác có thể đã đọc mã của bạn, vì vậy chỉ nên được thực hiện nếu thực sự cần thiết.
Periata Breatta

6
mặc định là giá trị enum có vẻ chống sản xuất. Nó phải là một tên miền cụ thể mô tả mặc định. Nên có một phương thức để trả về mặc định.
qwerty_so

18
@AresresF. Tôi không đồng ý. Tôi thường thấy rất dễ tranh luận với các nhà thiết kế của Java. Tôi không giữ nó chống lại họ, mặc dù. Họ đang làm việc ở miền tây hoang dã.
MetaFight

Câu trả lời:


63

Đối với một tùy chọn enum, bạn nên sử dụng trường hợp tiêu đề như thế nào Default. Vì C # phân biệt chữ hoa chữ thường nên nó sẽ không va chạm với từ khóa dành riêng. Xem hướng dẫn đặt tên .net .

Vì tất cả các thành viên công khai phải là trường hợp tiêu đề trong .net và tất cả các tên dành riêng là chữ thường, bạn không nên thực sự gặp phải điều này ngoại trừ các biến cục bộ (bao gồm các tham số). Và người dân địa phương thường có danh từ hoặc cụm từ làm tên, vì vậy, rất hiếm khi tên tự nhiên nhất sẽ va chạm với một từ khóa. Ví dụ. defaultValuethường sẽ là một tên tự nhiên hơn default. Vì vậy, trong thực tế đây không phải là một vấn đề lớn.

Trong C #, bạn có thể sử dụng @tiền tố "" để thoát các từ khóa dành riêng để chúng có thể được sử dụng làm định danh (như @default). Nhưng điều này chỉ nên được sử dụng nếu bạn thực sự không có lựa chọn nào khác, tức là nếu bạn đang can thiệp vào thư viện của bên thứ ba sử dụng từ khóa dành riêng làm định danh.


Tất nhiên các ngôn ngữ khác có cú pháp và từ khóa khác nhau và do đó giải pháp khác nhau cho vấn đề này.

SQL có khá nhiều từ khóa, nhưng nó rất phổ biến để thoát khỏi các định danh, như thế [Table]. Một số thậm chí làm như vậy cho tất cả các định danh, bất kể họ có đụng độ với một từ khóa hay không. (Rốt cuộc, một từ khóa xung đột có thể được giới thiệu trong tương lai!)

Powershell (và một loạt các ngôn ngữ kịch bản lệnh khác) tiền tố tất cả các biến có sigil như $ có nghĩa là chúng sẽ không bao giờ va chạm với từ khóa.

Lisp hoàn toàn không có từ khóa, ít nhất là không phải theo nghĩa thông thường.

Python có một quy ước được công nhận chính thức trong PEP-8 :

Luôn luôn sử dụng cls cho đối số đầu tiên cho các phương thức lớp.

Nếu tên của một đối số hàm đụng độ với một từ khóa dành riêng, thì tốt hơn là nối thêm một dấu gạch dưới duy nhất thay vì sử dụng một từ viết tắt hoặc viết sai chính tả. Do đó class_ tốt hơn clss. (Có lẽ tốt hơn là tránh các cuộc đụng độ như vậy bằng cách sử dụng một từ đồng nghĩa.)

Một số ngôn ngữ như Brainfuck hoặc Whitespace tránh việc xác định các từ, hoàn toàn vượt qua vấn đề.

Nói tóm lại, không có câu trả lời độc lập với ngôn ngữ cho câu hỏi của bạn, vì nó rất phụ thuộc vào cú pháp và quy ước của ngôn ngữ cụ thể.


2
Bạn không nên chỉ dựa vào độ nhạy trường hợp. Mặc dù nó không có khả năng là một vấn đề trong thực tế, nhưng không phải tất cả các ngôn ngữ .NET đều phân biệt chữ hoa chữ thường, do đó đôi khi bạn có thể gặp phải sự cố không mong muốn.
V Xoayin

6
@ V Xoayin: Bạn không nên có các thành viên công khai hoặc tên loại chỉ khác nhau trong trường hợp, vì điều này có thể dẫn đến các vấn đề cho ngôn ngữ khác. Nhưng điều này không liên quan đến những gì tôi đề xuất, vì từ khóa không phải là định danh (và các ngôn ngữ khác sẽ có các từ khóa khác).
JacquesB

Ngay cả khi cú pháp @ có sẵn, IMHO được dành riêng tốt nhất cho các tình huống trong đó người ta cần tương tác với các thư viện bằng ngôn ngữ viết với các từ khóa khác nhau. Ngay cả ở đó, tôi nghĩ có lẽ sẽ tốt hơn nếu có một tính năng ngôn ngữ giống như vậy #define, nhưng toán hạng bên tay phải sẽ luôn được hiểu là một định danh phân biệt chữ hoa chữ thường. Điều đó sẽ cho phép giải quyết nhiều loại xung đột đặt tên (bao gồm, đối với các ngôn ngữ không phân biệt chữ hoa chữ thường, việc nhập các ký hiệu giống hệt nhau trừ trường hợp).
supercat

@Veelsin không phải tất cả các ngôn ngữ .NET đều phân biệt chữ hoa chữ thường - Tôi biết về VB.NET và Powershell; có ai khác không
Zev Spitz

@ZevSpitz OP đặc biệt gọi C #, đó là lý do tại sao tôi nghĩ V Xoayin đã sử dụng nó làm ví dụ của mình, tuy nhiên như bạn nói VB.NET không phân biệt chữ hoa chữ thường, vì vậy, như thường lệ, tôi sẽ nghĩ rằng nó sẽ đi xuống theo từng ngôn ngữ . Không phải tất cả các ngôn ngữ đều có cùng một từ dành riêng
Shaggy13spe

22

Tôi sẽ nối thêm dấu gạch dưới (default_)

Ưu điểm:

  • đơn giản
  • Rõ ràng (tại sao bạn lại thêm dấu gạch dưới?)
  • thích hợp
  • dễ sử dụng
  • hoạt động trong tất cả các ngôn ngữ hiện đại mà tôi biết
  • gần nhất với tùy chọn logic

Tại sao tôi không thích các giải pháp khác:

Từ đồng nghĩa:

  • khó tìm
  • thường không cùng một nghĩa chính xác (sắc thái)

Bổ sung / Chuẩn bị một từ:

  • không nhất quán (defaultValue, defaultItem)
  • tăng độ dài mà không tăng khả năng đọc

Thay đổi chữ cái (clazz thay vì lớp):

  • không nhất quán (clazz, klass, klazz)

Nối một số (default1):

  • đặt câu hỏi cho default2

Bổ sung / Chuẩn bị thư:

  • không rõ ràng (lập trình viên phải đoán rằng nó đã được sử dụng cho namecollision và không phải là một phím tắt cho cái gì khác)

Thoát khỏi một từ khóa (@default (c #), `default` (scala))

  • chỉ có thể trong một số ngôn ngữ
  • tính năng hiếm khi được sử dụng, chủ yếu để tương thích với các ngôn ngữ khác
  • làm cho việc sử dụng api của bạn trở nên khó khăn hơn (họ phải biết cách thực hiện và nhớ cách thực hiện)

Khi nào tôi không sử dụng nó:

  • hiện có, sử dụng rộng rãi các quy ước khác
  • Tôi đã biết một từ đồng nghĩa phù hợp
  • trong trường hợp enum cụ thể của bạn, tôi sẽ làm theo câu trả lời @JacquesB

7
Đây là một giải pháp thường được sử dụng trong Python. Tôi không ủng hộ nó là thanh lịch nhất, nhưng nó hoạt động.
fralau

1
@fralau Python ist đặc biệt xấu - Tôi thực sự ghét các định danh như "đầu vào"
Christian Sauer

Trong rất nhiều ngôn ngữ người ta thấy klassmột biến trong đó classlà một từ dành riêng. Tôi chưa bao giờ nhìn thấy defawltnhưng đó là cùng một ý tưởng. Tôi thích default_(và có lẽ class_nếu không chà đạp lên bất kỳ quy ước nào được thiết lập bằng cách làm như vậy).
nigel222

Bạn đã không bao gồm tùy chọn thoát khỏi từ khóa.
CodeInChaos

1
Bạn đưa ra các lập luận hợp lệ, hợp lý, mặc dù tôi không chắc đó là "rõ ràng tại sao dấu gạch dưới được sử dụng". Tôi hiếm khi làm việc với các frood biết tất cả các từ khóa của ngôn ngữ mà họ đang làm việc!
Người bảo vệ một

18

"Mặc định" có thể không phải là một giá trị enum hữu ích. Nó đại diện cho một hành vi có thể thay đổi tùy thuộc vào bối cảnh nơi nó được sử dụng.

Điều đó đang được nói, nếu ngôn ngữ của bạn là trường hợp nhạy cảm, sau đó sử dụng một trường hợp khác cho từ này. (Mặc định so với mặc định)

Hoặc tốt hơn nữa, hãy nỗ lực thêm để gõ thêm một vài chữ cái và gọi nó là DefaultValue.


3
Tôi đồng ý. "Mặc định" không cho biết giá trị là gì. Xem xét enum ErrorHandlingLevel { Default = 0, ... }so với enum ErrorHandlingLevel { None = 0, ... }. Trong ví dụ thứ hai, thực tế Nonelà mặc định có thể được biết bằng cách đặt giá trị enum thành 0, sử dụng xmldoc hoặc mã rõ ràng trong mã. Bạn nhận được lợi ích bổ sung khi biết ý nghĩa của nó khi một đối tượng được ErrorHandlingLevelđặt None. So sánh điều đó với việc kiểm tra một đối tượng ErrorHandlingLevelđược đặt thành mặc định.
Harrison Paine

9

Tôi đặc biệt khuyên bạn KHÔNG nên thay đổi quy ước đặt tên cục bộ (hoặc thêm các ký tự vô nghĩa) cho mục đích định hướng (giống như đã được đề xuất trong các bài đăng khác). Nó tạo ra sự nhầm lẫn nếu ý định không rõ ràng và có thể đặt ra câu hỏi tại sao nó được đặt tên theo cách này. Nó có thể được giải quyết mà không cần nó.

Trong mọi trường hợp, có thể sử dụng một từ có nghĩa đồng nghĩa hoặc làm cho tên cụ thể hơn (hoặc thậm chí dài dòng). Ngay cả khi nó có thể giới thiệu sự lặp lại của bối cảnh, nó có thể là một giải pháp tốt hơn.

Ví dụ: giả sử bạn có một enum Modesẽ hiển thị giá trị mặc định như trong trường hợp của bạn. Đặt tên nó default_modecó vẻ không phải là tốt nhất do sự lặp lại, nhưng nó tránh sự mơ hồ trong khi truyền đạt ý nghĩa mong muốn.


Bạn đưa ra một quan điểm hợp lệ, nhưng tôi vẫn không chắc chắn điều gì tạo ra sự nhầm lẫn nhiều hơn: có một đoạn được nối liên tục hoặc sử dụng các từ khác nhau cho mọi tình huống. Tất nhiên, trường hợp chống lại tùy chọn trước đây là các tình huống sẽ được sử dụng ở vị trí đầu tiên (hy vọng) rất hiếm khi không thể suy ra tính nhất quán từ mã hiện có.
Người bảo vệ một

3

Bạn sẽ cần sử dụng các từ khác nhau hoặc được sửa đổi, điều đó là rõ ràng.
Vì vậy, điều này thường có nghĩa là hoặc

  • một từ hoàn toàn khác
  • một tiền tố
  • một hậu tố

Một yếu tố khác để xác định là làm thế nào để tham gia nhiều từ và các tùy chọn thường là

Đề nghị của tôi là sử dụng tiền tố hoặc hậu tố và dấu gạch dưới / dấu gạch ngang, vd

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_defaultcó lợi thế là tất cả các địa phương được căn chỉnh và do đó nổi bật nhanh chóng nhưng nhược điểm mà bạn luôn phải đọc đến phần thứ hai để có được tên duy nhất. default_localcó lợi thế ngược lại là tên biến duy nhất nhanh chóng được nhìn thấy, nhưng người dân địa phương không phải lúc nào cũng dễ dàng được nhóm lại một cách trực quan.

Một vài ví dụ cho cách tiếp cận domain_specific mà tôi đã thấy là: vehicle_modelthay vì modelđó là một từ dành riêng; room_tableđối với bảng SQL tablelà một từ dành riêng.

Hai tùy chọn khác mà tôi đã thấy các ngôn ngữ hoặc tập lệnh sử dụng là:

  • dấu ngoặc kép hoặc backtips để bao quanh tên biến và do đó cho phép sử dụng các từ dành riêng. Tương tự như vậy, tôi có thể tưởng tượng một số ngôn ngữ có thể cho phép một ký tự đặc biệt như backspace thoát tên.
  • khoảng trắng trong tên biến.

Như một lưu ý phụ có thể thú vị: Tôi đã thấy words_with_underscores-or-dashesđược nhắc đến với hai tên - snake_casekhi sử dụng dấu gạch dưới và kebab-casekhi sử dụng dấu gạch ngang. Tôi thấy buồn cười sau.
VLAZ

2

Rõ ràng, làm những gì bạn có thể để tránh tình huống đó. Tôi đã viết phần mềm từ cuối những năm 1970 và những lần tôi thực sự, thực sự phải làm mờ một từ dành riêng là dưới mười, có lẽ gần hơn năm.

Có rất nhiều điều bạn có thể làm, chẳng hạn như nhân đôi chữ cái đầu tiên hoặc cuối cùng ( reservedd) hoặc thêm dấu gạch dưới hàng đầu hoặc dấu ( reserved_). Những gì phù hợp sẽ phụ thuộc rất nhiều vào các quy ước được sử dụng ngôn ngữ bạn đang viết, đặc biệt là liên quan đến dấu gạch dưới hàng đầu hoặc dấu. Ngoài ra, cố gắng không làm những việc với trường hợp có thể bị con người đọc sai (ví dụ: sử dụng Reservedkhi nó khác với reserved).

Khi bạn đã chọn một cái gì đó, hãy đặt nó trong hướng dẫn mã hóa của bạn, đảm bảo mọi người biết về nó và nó được sử dụng một cách nhất quán. Tôi thậm chí còn đi xa hơn để thêm một bình luận nhắc nhở để độc giả không nghĩ đó là một lỗi đánh máy và biết rằng họ sẽ gặp lại nó:

int ccase;  // Name dodges a reserved word

10
Không phải là downvoter, mà là gợi ý "nhân đôi chữ cái đầu tiên hoặc chữ cái cuối cùng" đã làm thư giãn xương sống của tôi ....
Willem van Rumpt

@WillemvanRumpt Tôi cũng không thích làm điều đó, nhưng một lần trong một lúc, tôi phải lựa chọn giữa việc tập thể dục dụng cụ để tránh một từ dành riêng khiến nhiều người gãi đầu hoặc nhận dạng trông kỳ lạ chỉ nhắc một chút .
Blrfl

6
Không có ý định phán xét, chỉ là .... ớn lạnh .... những người lạnh lùng ...;)
Willem van Rumpt

1
Gửi một dấu gạch dưới tốt hơn là một chữ cái cuối cùng nhân đôi. (Có phiếu bầu classsnào không?)
nigel222

1
Hướng dẫn mã hóa! Đó sẽ là tốt đẹp để có! Điểm tốt.
Người bảo vệ một

2

Trong C #, bạn có thể thêm tên của mã định danh bằng @ . Điều này nói cho trình biên dịch coi tên là tên của một định danh và không phải là một từ khóa có thể.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

3
tự hỏi ai sẽ bỏ phiếu cho "câu trả lời" này mà chỉ lặp lại điểm đã được thực hiện (và được trình bày tốt hơn nhiều) trong câu trả lời được bình chọn hàng đầu một ngày trước đó
gnat
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.