Bạn làm gì khi quy ước đặt tên của bạn đụng độ với ngôn ngữ của bạn?


14

Được rồi, đây là một trong những điều nhỏ luôn làm tôi khó chịu. Tôi thường không viết tắt mã định danh và lần duy nhất tôi sử dụng mã định danh ngắn (ví dụ i:) là một vòng lặp chặt chẽ. Vì vậy, nó làm tôi khó chịu khi tôi làm việc trong C ++ và tôi có một biến cần được đặt tên operatorhoặc classtôi phải làm việc xung quanh nó hoặc sử dụng một từ viết tắt, vì nó kết thúc. Hãy cẩn thận: điều này có thể xảy ra với tôi một cách không tương xứng thường xuyên vì tôi làm việc rất nhiều trong thiết kế ngôn ngữ lập trình, nơi các đối tượng miền có thể phản chiếu các khái niệm trong ngôn ngữ máy chủ và vô tình gây ra xung đột.

Làm thế nào bạn sẽ đối phó với điều này? Viết tắt? ( op) Lỗi chính tả? ( klass) Cái gì khác? ( operator_)


7
Ngoài việc đặt tên có lẽ chúng ta nên xem xét thay đổi quy ước đặt tên? Xin lỗi vì sự rõ ràng.
Chris

1
@Chris: Bạn không bao giờ có thể tin tưởng một lập trình viên để nhận ra điều hiển nhiên! (Mặc dù trong trường hợp này tôi có.)
Jon Purdy

7
Nếu có bất kỳ lý do nào để thích $varcú pháp của PHP , thì đây chính là nó.
Joey Adams

3
@Joey Adams: Tôi mỉm cười ngắn gọn khi nhìn thấy câu hỏi này và nhớ tất cả các câu hỏi bash PHP trôi nổi xung quanh SE.
Chris

3
Rõ ràng, thay đổi mã nguồn ngôn ngữ để cho phép các quy ước đặt tên của tôi. Điều này cũng có lợi ích "bảo vệ" mã của tôi vì nó sẽ chỉ chạy / biên dịch trên trình thông dịch / trình biên dịch của tôi.
Dietbuddha

Câu trả lời:


21
  1. Chấp nhận rằng bạn có thể phải thực hiện các thay đổi nhỏ cho quy ước đặt tên của mình, chẳng hạn như thêm chữ viết hoa. Tốt hơn là chấp nhận điều này càng sớm càng tốt để tất cả các mã tiếp theo đều nhất quán.

  2. Xem xét cụ thể hơn. Từ khóa có xu hướng khá rộng, vì vậy thu hẹp classxuống demonstrationClasskhông chỉ hoạt động xung quanh những vấn đề mà còn làm tăng khả năng đọc.


10

Đó không phải là điều tôi đã gặp phải, nhưng nếu tôi gặp tình huống như vậy, tôi sẽ cố gắng giải quyết nó bằng các tùy chọn sau, theo thứ tự.

  1. Cố gắng tìm một từ đồng nghĩa.
  2. (đặc biệt đối với các biến) cố gắng tìm tiền tố hoặc hậu tố
  3. (đặc biệt đối với các lớp) thay đổi chữ cái đầu tiên thành chữ hoa và quên quy tắc mã hóa rằng các tên không nên chỉ khác nhau trong trường hợp. Tùy chọn này, tôi có lẽ sẽ chỉ sử dụng nếu xung đột với một từ khóa.
  4. Sử dụng một từ viết tắt.

1
Tôi không thấy có gì sai với tên chỉ khác nhau trong trường hợp, đặc biệt là trong danh sách đối số trong đó tham số loại const Foo&không có bất kỳ tên đầy đủ hợp lý nào khác ngoài foo. Cấp, có thể tốt hơn để đặt cho bạn Foomột cái tên mô tả hơn so với foonếu nó sống trong một cơ quan chức năng và phục vụ một mục đích ít chuyên biệt hơn.
Jon Purdy

@Jon - Tôi đồng ý, mặc dù cá nhân tôi có xu hướng hướng tới các tiền tố "p_", "l_" và "m_" thay vì thay đổi theo trường hợp. Tôi đã thông qua quy ước đó vì vấn đề tất cả đều giống nhau. Tất nhiên, quy ước nào bạn sử dụng để giải quyết vấn đề này phần lớn không liên quan miễn là bạn sử dụng nó một cách nhất quán trong bất kỳ bối cảnh cụ thể nào, tất nhiên - cách tiếp cận thay đổi trường hợp chắc chắn được sử dụng đủ rộng rãi để hầu hết các nhà phát triển nên nhận ra nó.
Steve314

@Jon - nhận xét đó đọc giống như tôi chỉ chọn áp dụng quy ước khi tôi gặp vấn đề cùng tên, đó không phải là ý tôi. Vấn đề bối cảnh liên quan đến ngôn ngữ, dự án, vv Các quy ước được thiết kế sao cho vấn đề không phải là vấn đề bất cứ khi nào nó xảy ra (hay đúng hơn là không), không được áp dụng có chọn lọc khi cần thiết.
Steve314

@ Steve314: Tôi hiểu ý của bạn từ bình luận đầu tiên. Tôi không biết, những thứ gắn liền như thế luôn cảm thấy hơi gần gũi với Hệ thống Hungary vì sự thoải mái của tôi.
Jon Purdy

@Jon: Đó không phải là một quy tắc tôi áp dụng một cách tôn giáo, nhưng tôi thấy rằng việc phạm sai lầm sẽ dễ dàng hơn nếu hai định danh chỉ khác nhau trong trường hợp. Một số lỗi đó sẽ được trình biên dịch phát hiện, một số lỗi khó tìm hơn nhiều (đặc biệt là nếu hai định danh cùng tên loại). Tôi thích có một quy tắc chung, với các trường hợp ngoại lệ theo từng trường hợp, hơn là một cuốn sách đầy đủ các quy tắc bao gồm tất cả các trường hợp có thể.
Bart van Ingen Schenau

6

Ngôn ngữ chiến thắng; bạn không thể vượt qua trình biên dịch (bỏ qua các từ gớm ghiếc như PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END, nhưng sau đó PL / 1 sẽ không khiến bạn phải đặt câu hỏi ngay từ đầu). Về cơ bản, bạn phải tuân theo các quy tắc của ngôn ngữ và bạn phải tìm một từ thay thế cho các từ khóa của ngôn ngữ để sử dụng cho riêng bạn - hoặc tìm một ngôn ngữ thay thế.

Vì vậy, ngoại trừ trong những trường hợp rất bất thường, bạn thích nghi với ngôn ngữ chứ không phải ngược lại.


5

Thay vì viết tắt làm thế nào về kéo dài? Nếu bạn đang triển khai một cấu trúc lớp bằng ngôn ngữ Foo, vậy còn việc sử dụng FooClass và foo_group thì sao? (Modulo bất kể sở thích vỏ của bạn là gì).


Bạn có tiền tố "java" trên mỗi mã định danh bạn sử dụng trong mã Java không? Và thậm chí không đề cập đến các vấn đề với tiền tố "C ++" trên mỗi số nhận dạng ...
Steve314

@ Steve314, bạn sẽ không sử dụng tiền tố java trong mã java, bạn sẽ sử dụng tiền tố java trong mã c ++ thực hiện trình biên dịch java. Ngoài ra, bạn sẽ chỉ sử dụng nó nếu phần còn lại của định danh là một từ khóa.
Winston Ewert

OK - bạn có nghĩa là kéo dài trong các điều khoản chung, như cụ thể hơn những gì định danh đề cập quá. Đối với các ứng dụng khác nhau, "class" có thể được đổi tên thành "class_taught" hoặc "class_of_animal" hoặc "classiness_value" hoặc bất cứ điều gì. Tôi đồng ý - Tôi chỉ thấy các trình biên dịch ví dụ định hướng khó hiểu.
Steve314

5

Một số từ viết tắt mà tôi đã sử dụng classtheo thứ tự tần số:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Nếu tôi biết thể hiện của lớp nào Class, tôi có thể đưa nó vào tên biến:

  • stringClass = Class.forName("java.lang.String");

Chưa bao giờ thấy "cls" cho điều đó trước đây. Tôi chủ yếu sử dụng aClass.
Konstantin Petrukhnov

4

Trong C và C ++, các từ khóa đều là chữ thường và ngôn ngữ phân biệt chữ hoa chữ thường, do đó, hãy bấm phím shift theo thời gian và rất nhiều vấn đề sẽ biến mất.

Trong Modula 2, các từ khóa đều là chữ hoa - nhưng miễn là số nhận dạng của bạn có một số chữ cái viết thường, sự khác biệt là rõ ràng và không thể đụng độ.

Ngoài ra, các quy ước đặt tên hoàn toàn ở một mức độ nào đó cần phải phản ánh các quy ước thông thường của ngôn ngữ bạn đang sử dụng, vì vậy tôi chắc chắn sẽ viết "myClass" bằng Java trong đó nhiều khả năng tôi sẽ viết "My_Class" bằng C ++.

Về cơ bản, bạn không chỉ viết cho trình biên dịch, mà những gì mọi người tìm thấy có thể đọc được phụ thuộc vào một mức độ nào đó vào bối cảnh và các kỳ vọng liên quan.


3
Ngay cả đối với các ngôn ngữ phân biệt chữ hoa chữ thường, tôi cảm thấy rằng việc trộn lẫn classClasssẽ làm tổn thương tính dễ đọc của mã.
Karmastan

@Karmastan - có lẽ điều đó phụ thuộc vào thời gian bạn làm việc với các ngôn ngữ và quy ước phân biệt chữ hoa chữ thường. Cá nhân, chữ "C" viết hoa so với chữ thường rất rõ ràng - tôi thấy các mẫu sử dụng trường hợp cho số nhận dạng dài nhanh hơn tôi có thể đọc chúng.
Steve314

3

Tôi không thường xuyên gặp phải vấn đề này, nhưng khi tôi làm điều đó có xu hướng không thành vấn đề vì tôi sử dụng Delphi và nó cho phép bạn giải quyết vấn đề này bằng cách thêm & vào mã định danh. Vì vậy, "lớp" không phải là định danh hợp lệ, nhưng "& class" là.


Hấp dẫn. Tôi có một tiện ích tạo mã cho phép sử dụng chuỗi ký tự bất cứ nơi nào có thể sử dụng mã định danh. Ban đầu, hầu hết các mã định danh cho mã được tạo được viết dưới dạng chuỗi ký tự để tránh nguy cơ xung đột từ khóa với DSL (và từ khóa phong phú). Bây giờ, các định danh được sử dụng cho hầu hết các tên (thật đáng ngạc nhiên là nguồn đó có thể đọc được nhiều hơn như vậy), nhưng các chuỗi ký tự luôn có sẵn như là một dự phòng. Tôi nghĩ rằng nó tốt cho việc tạo mã, nhưng cách giải quyết từ khóa xung đột sẽ là một ý tưởng tồi trong ngôn ngữ mục đích chung - nhưng có lẽ tôi đã sai.
Steve314

2

Tôi sẽ thêm một số loại không gian tên vào tên biến. Ví dụ: giả sử bạn có mô-đun có tên người dùng thì tôi sẽ sửa đổi toán tử tên biến thành một cái gì đó như user_operator hoặc userOperator.


2
chỉ không sử dụng "mịn", "không" hoặc "của tôi" làm tiền tố
Steven A. Lowe

2
Chắc chắn rồi. Tôi bỏ phiếu "Jon_Purdys_Carefully_Chosen_Identifier_Prefix_".
Steve314

1
@Steven: Thậm chí tệ hơn, tôi thấy a, anthesử dụng với tần số làm phiền bởi người mới bắt đầu sinh viên CS.
Jon Purdy

1
@Jon Purdy, đó không phải lỗi của chúng tôi! Đổ lỗi cho giáo sư đã quyết định đặt tên cho trường hợp của họ là lớp People () aPerson.
Ben L

@Jon: Quy ước đặt tên nơi tôi làm việc chỉ định rằng các biến cục bộ nên bắt đầu bằng acác biến vòng lặp chặt chẽ: /
Matthieu M.

2

thay đổi hoặc điều chỉnh quy ước đặt tên của tôi

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.