Có kỹ thuật hay kiểm tra tốt cho các loại đặt tên?


23

Một câu hỏi khó xử, cởi mở, nhưng đó là một vấn đề tôi luôn luôn chống lại:

Phần mềm dễ bảo trì và hoạt động với phần mềm được thiết kế tốt. Cố gắng tạo ra một thiết kế trực quan có nghĩa là đặt tên cho các thành phần của bạn theo cách mà nhà phát triển tiếp theo có thể suy ra chức năng của thành phần đó. Đây là lý do tại sao chúng tôi không đặt tên cho các lớp của mình là "Type1", "Type2", v.v.

Khi bạn mô hình hóa một khái niệm trong thế giới thực (ví dụ như khách hàng), điều này thường đơn giản như đặt tên kiểu của bạn sau khi khái niệm thế giới thực được mô hình hóa. Nhưng khi bạn đang xây dựng những thứ trừu tượng, theo định hướng hệ thống hơn, thì rất dễ để hết những cái tên vừa dễ đọc vừa dễ tiêu hóa.

Nó trở nên tồi tệ hơn (đối với tôi) khi cố gắng đặt tên cho các họ loại, với kiểu cơ sở hoặc giao diện mô tả những gì các thành phần phải làm, nhưng không phải là cách chúng hoạt động. Điều này tự nhiên dẫn đến mỗi loại dẫn xuất cố gắng mô tả hương vị của việc triển khai (ví dụ IDataConnectionSqlConnectiontrong .NET Framework), nhưng làm thế nào để bạn thể hiện một cái gì đó phức tạp như "hoạt động bằng cách phản chiếu và tìm kiếm một bộ thuộc tính cụ thể"?

Sau đó, khi cuối cùng bạn đã chọn một tên cho loại mà bạn nghĩ mô tả những gì nó đang cố gắng thực hiện, đồng nghiệp của bạn hỏi "WTF điều này DomainSecurityMetadataProviderthực sự làm gì? "

Có bất kỳ kỹ thuật tốt nào để chọn một tên có ý nghĩa tốt cho một thành phần, hoặc làm thế nào để xây dựng một họ các thành phần mà không bị nhầm lẫn tên?

Có bất kỳ thử nghiệm đơn giản nào mà tôi có thể áp dụng cho một tên để có cảm giác tốt hơn về việc liệu tên đó có "tốt" hay không và có trực quan hơn với người khác không?


20
sáu kỹ thuật đã được chứng minh là có hiệu quả đối với tôi: 1) dành nhiều thời gian cho việc phát minh ra tên 2) sử dụng đánh giá mã 3) đừng ngần ngại đổi tên 4) dành nhiều thời gian cho việc phát minh ra tên 5) sử dụng đánh giá mã 6) đừng ngần ngại đổi tên
gnat

5
@gnat: Vui lòng gửi câu trả lời của bạn dưới dạng câu trả lời để chúng tôi có thể bỏ phiếu.
S.Lott


3
Tôi thường sử dụng từ điển đồng nghĩa khi thực hiện phát triển mới để giúp tôi đưa ra những cái tên hay.
Học viên của Tiến sĩ Wily

3
Tôi cố gắng tránh gọi bất cứ điều gì "Người quản lý". Alan GreenJeff Atwood cho rằng thuật ngữ này được sử dụng quá mức và quá mơ hồ để truyền đạt ý nghĩa. Tôi phải đồng ý.
Học viên của Tiến sĩ Wily

Câu trả lời:


41

Để đặt tên, có sáu kỹ thuật đã được chứng minh là có hiệu quả đối với tôi:

  1. dành nhiều thời gian cho việc phát minh ra tên
  2. sử dụng mã đánh giá
  3. đừng ngần ngại đổi tên
  4. dành nhiều thời gian cho việc phát minh ra tên
  5. sử dụng mã đánh giá
  6. đừng ngần ngại đổi tên

Tái bút Trong trường hợp nếu API của bạn sẽ được công khai, thì ở trên sẽ áp dụng trước đó - bởi vì, bạn biết đấy,

"API công khai, giống như kim cương, là mãi mãi. Bạn có một cơ hội để làm cho đúng, vì vậy hãy cố gắng hết sức ..." (Joshua Bloch, Cách thiết kế API tốt và tại sao lại có vấn đề )


1
Trong trường hợp đó là API công khai, có ba kỹ thuật bổ sung mà bạn có thể sử dụng ...
ChúZeiv

1
@UncleZeiv: chẳng hạn như ....?
Thất vọngWithFormsDesigner

3
@FrustratedWithFormsDesigner: 1. dành nhiều thời gian cho việc phát minh ra tên 2. sử dụng đánh giá mã và 3. đừng ngần ngại đổi tên
S.Lott

3
Câu trả lời này đã thuyết phục tôi rằng nói chung: không, không có cách nào dễ dàng để đặt tên đúng. Chỉ cố gắng làm việc thực sự khó khăn.
Paul Turner

4
7. Đừng ngần ngại thiết kế lại các loại hoặc chức năng nếu hóa ra không thể đặt ra một tên thích hợp cho chúng. Mã được thiết kế tốt luôn có thể được đặt tên chính xác.
Joren

8

Kiểm tra cơ sở của tôi là nếu bạn có thể mô tả chức năng của biến bằng cách chỉ sử dụng các từ từ biến:

ví dụ: nếu DomainSecurityMetadataProvider hoặc "Cung cấp siêu dữ liệu bảo mật tên miền" hoặc "Cung cấp siêu dữ liệu liên quan đến bảo mật tên miền", thì tốt.

Tuy nhiên, có những sắc thái khác nhau từ người này sang người khác:

ví dụ: đối với tôi, original_team_code là mã cho nhóm ban đầu, trong khi đối với người khác, nó có thể là mã gốc cho nhóm. Một trong những mục yêu thích cá nhân của tôi là "UnsafeLegacyMutex", mà tôi không thể không đọc là "Đây là một Mutex di sản không an toàn", thay vì "Đây là một Mutex cho Mã di sản của ThreadUnsafe".

Vì vậy, bài kiểm tra mở rộng của tôi là viết biến xuống bảng / wiki / trò chuyện và để mọi người đoán nghĩa của nó.


7

Có bất kỳ kỹ thuật tốt nào để chọn một tên có ý nghĩa tốt cho một thành phần, hoặc làm thế nào để xây dựng một họ các thành phần mà không bị nhầm lẫn tên?

Không hẳn vậy.

Tuy nhiên, một mẹo là tránh "giọng nói thụ động".

"DomainSecurityMetadataProvider" là thụ động. Không có động từ, tất cả các danh từ và danh từ được sử dụng làm tính từ.

"ProvMetadataForDomainSecurity" hoạt động nhiều hơn. Có một động từ.

Lập trình hướng đối tượng là tất cả (thực sự) danh từ-động từ. Danh từ == đối tượng. Động từ == phương thức. Vì vậy, một tên lớp thường rất "danh từ". Để bỏ thói quen này, và bắt đầu chèn động từ, thật khó.

Có bất kỳ thử nghiệm đơn giản nào mà tôi có thể áp dụng cho một tên để có cảm giác tốt hơn về việc liệu tên đó có "tốt" hay không và có trực quan hơn với người khác không?

Vâng. Bạn đã xác định một bài kiểm tra xuất sắc trong câu hỏi của bạn. Hỏi người khác.

Vào thời xa xưa, chúng tôi gọi đây là "hướng dẫn thiết kế". Đó là một thỏa thuận lớn, đầy mồ hôi trong một phương pháp thác nước. Ngày nay, với các phương thức Agile, nó sẽ là sự hợp tác thông thường giữa tác giả và người dùng của một lớp. Nó không (và không nên) mất nhiều thời gian. Thảo luận về thiết kế (và tên) trước khi viết các bài kiểm tra (và mã) sẽ làm giảm yếu tố gây ngạc nhiên và có thể ngăn chặn WTF.


12
Không chắc chắn tôi đồng ý với ý tưởng giọng nói thụ động. Đối với tôi, Lớp học có ý nghĩa hơn như Danh từ.
deworde

7
Nói chung, tôi đang cố gắng giữ tên loại của mình bằng giọng bị động, vì nó phù hợp với kiểu danh từ-động từ của OOP. Tôi sẽ coi ProvideMetadataForDomainSecuritylà một loại tên nghèo. Tên phương thức thường dễ đặt tên chính xác hơn vì tôi tự do sử dụng các động từ. Hạn chế về ngôn ngữ là mấu chốt của vấn đề.
Paul Turner

Nhiều như tôi thích "hỏi mọi người" như một bài kiểm tra thực tế, tôi phải hỏi các đồng nghiệp của mình về việc đặt tên ít nhất hai lần một ngày. Tôi hy vọng điều gì đó không đòi hỏi thời gian của người khác.
Paul Turner

2
Lớp học làm có ý nghĩa như danh từ. Vấn đề là các lớp phức tạp với các cụm tính từ dài. Giới từ cũng có thể giúp ích.
S.Lott

2
Hợp tác là bí mật của phần mềm tốt. Hợp tác cần có thời gian. Không có con đường hoàng gia để viết tốt.
S.Lott

6

Sử dụng từ điển đồng nghĩa

Rất thường xuyên, tôi sẽ đề cập đến một từ điển đồng nghĩa khi thực hiện phát triển mới để tìm các từ thích hợp để mô tả các lớp và phương thức của tôi.

Các lớp chủ yếu chứa logic hoạt động

Tôi có xu hướng đặt tên các lớp chủ yếu cung cấp các phương thức hoạt động trong cấu trúc danh từ-động từ như "EntityProvider", "EntityLocator", v.v.

Các lớp này thường không chứa nhiều trạng thái.

Các lớp có trạng thái

Màn hình UI và các thực thể dữ liệu nói chung là trạng thái, và vì vậy tôi chỉ cần đặt tên cho các lớp này bằng một mẫu danh từ hoặc tính từ-danh từ.

Ví dụ: Người, Nhân viên, Hiện tạiEmployee, CựuEmployee

Các lớp tiện ích

Các lớp chỉ chứa các phương thức tĩnh thường được coi là các lớp "tiện ích", vì vậy tôi luôn đặt tên chúng với hậu tố "Tiện ích".

Ví dụ: NetworkUtilities, FileUtilities

Xét nghiệm

Tôi không có bất kỳ bài kiểm tra tốt nào để quyết định xem có thứ gì đó được đặt tên kém hay không, nhưng tôi khuyên bạn nên thử sử dụng một danh từ riêng và / hoặc một động từ trong tên, sau đó suy nghĩ xem danh từ / động từ đó có mô tả chính xác những gì bạn ' đặt tên lại.

Nếu bạn cảm thấy rằng có nhiều hơn lớp / phương thức không được bắt bởi tên, thì lớp / phương thức đó có thể cần phải được cấu trúc lại.

Alan GreenJeff Attwood đã viết về tệ nạn của các lớp đặt tên với hậu tố "Manager". Họ cho rằng thuật ngữ "Người quản lý" bị lạm dụng và quá mơ hồ để truyền đạt bất cứ điều gì có ý nghĩa. Tôi phải đồng ý.

Bài viết của Jeff cũng cung cấp một danh sách các hướng dẫn được đề xuất từ ​​Hoàn thành mã của Steve McConnell.

biến

Gần đây, tôi đã thử nghiệm các tên tham số / biến mô tả dài hơn kết hợp các giới từ, chẳng hạn như "Of", "By", "For", v.v. Một số ví dụ được hiển thị bên dưới:

string firstNameOfEmployee;

string lastNameOfEmployee;

// here I nimbly avoid worrying about whether to call it "Id" or "ID" :)
int idOfEmployee;

decimal amountForDeposit;

Account accountForDeposit;

Tôi thấy rằng điều này hoạt động tốt với tính năng intellisense của Visual Studio giúp dễ dàng nhập các tên dài này. Tôi cũng thấy rằng có ít sự trùng lặp của các tiền tố tên biến (ví dụ: personID, personFirstName, personLastName so với idOfPerson, FirstNameOfPerson, lastNameOfPerson), cung cấp một "hàm băm" tốt hơn giúp cho intellisense trở nên hữu ích hơn.


1
Tôi sẽ đưa ra quan điểm thứ hai về các tên biến dài, một lần nữa, Visual Studio (nếu bạn đang sử dụng nó) làm cho điều này trở nên vô nghĩa. Sẽ rất ít có hại nếu có các tên biến dài rõ ràng hơn các tên biến ngắn mà bạn phải "nghĩ" về hoặc điều tra ý nghĩa của tên thực sự. Cũng nghĩ về bối cảnh. Tôi thà thấy "peopleToDelete" hơn là "listOfP People". Một lần nữa, Visual Studio cho bạn biết loại biến, không cần bao gồm nó.
John Bubriski

Tôi cũng không thích ký hiệu tiếng Hungary phức tạp mà bạn đã thêm vào tên biến. Tôi không cần quan tâm nếu một bộ sưu tập ID người là một Listmảng, IEnumerablehoặc ConcurrentQueue. Đó là một loạt các ID tôi cần liệt kê và chi tiết triển khai về cách chúng được lưu trữ là hành lý tinh thần không cần thiết. Mặc dù tôi thường đồng ý rằng nếu một tên dài hơn mô tả đáng kể hơn, thì nó nên được ưu tiên hơn một tên ngắn hơn, ít rõ ràng hơn.
Allon Guralnek

@ ALLon - Hài hước, tôi sắp sửa lại câu trả lời của mình dựa trên nhận xét của SkippyFire. Tôi thực sự đồng ý với bạn; ví dụ của tôi đập vỡ ký hiệu Hungary. Bảo vệ duy nhất của tôi là thật dễ dàng để đọc mã và hiểu các kiểu dữ liệu liên quan mà không có IDE có sẵn, chẳng hạn như nếu tôi đang đọc qua một điều khiển khác biệt kiểm soát nguồn. Đó không phải là lý do. :) Tôi sẽ sửa đổi ví dụ của mình để theo dòng FirstNameOfEmployee, lastNameOfEmployee, v.v.
Học viên của Tiến sĩ Wily

2

Sau đó, khi cuối cùng bạn đã chọn một tên cho loại mà bạn nghĩ mô tả những gì nó đang cố gắng thực hiện, đồng nghiệp của bạn hỏi "WTF có thực sự DomainSecurityMetadataProvider này không?"

Loại tên nào bạn mong đợi cho một lớp cụ thể và miền cụ thể? Điều này tốt như bạn sẽ nhận được mà không đặt tên lớp của bạn thành một câu (điều này sẽ khiến mọi người nghĩ rằng bạn đã giao quá nhiều trách nhiệm cho một lớp học)

Tôi sẽ xem xét bỏ nhà cung cấp từ tên. Nếu nó đặc biệt đề cập đến Siêu dữ liệu, mọi người đều biết bạn đang sử dụng sự phản chiếu. Bạn có thể làm cho nó một từ ngắn gọn hơn (hoặc có thể thay đổi thành một từ khác - đó là một người tiêu dùng nhiều hơn là một nhà cung cấp từ những gì bạn đã viết)


Siêu dữ liệu trong câu hỏi không xuất phát từ sự phản chiếu (nhưng nó mô tả cách xử lý các loại). Kiểu này thực hiện một ISecurityMetadataProvidergiao diện, tồn tại một điểm có thể tiêm trong cơ sở hạ tầng bảo mật, để cung cấp thông tin cho hệ thống con. Đặt tên là khó.
Paul Turner

Tôi coi DomainSecurityMetadataProviderlà một nhà cung cấp DomainSecurityMetadatađối tượng, nơi DomainSecurityMetadatacó siêu dữ liệu. Tên rõ ràng và dễ hiểu. Tôi thậm chí không cần biết nó DomainSecurityMetadatalà gì ! Nó chỉ là một số đối tượng, mà nhà cung cấp này cung cấp. Chỉ loại bỏ một Providerhậu tố không cải thiện khả năng đọc, nhưng hoàn toàn ngược lại - giảm nó. Không có hậu tố này, tôi nghĩ rằng nó chỉ là một siêu dữ liệu (đối tượng chứa một số siêu dữ liệu), nhưng không phải là một đối tượng để lấy siêu dữ liệu từ (một nhà cung cấp).
Ruslan Stelmachenko

0

Sử dụng phép ẩn dụ để mô tả các bộ phận của hệ thống. Không chỉ nó sẽ làm cho bạn khám phá các tương tự mới, nó sẽ giúp đặt tên dễ dàng hơn.

(Tôi biết đây không phải là một ví dụ mạnh nhưng dù sao đi nữa) Ví dụ: bạn có thể gọi một biến hoặc một kiểu như mailbox, đóng vai trò là một hàng đợi cho các tin nhắn nhận được cho một lớp.


-1

Một điều tôi rất chắc chắn là Tên KHÔNG BAO GIỜ được phép không chính xác. Ví dụ tốt nhất, trong một số bao thanh toán lại, rất nhiều mã đã thay đổi và một vài biến bắt đầu đề cập đến một cái gì đó khác với những gì tên của chúng gợi ý.

Ngay sau đó, một lập trình viên đã dành nhiều thời gian và sử dụng một số cuộc gọi cơ sở dữ liệu rất tốn kém để cố gắng nắm giữ một số dữ liệu nhất định đã được trích xuất và lưu trữ. Tôi đã đổi tên tất cả mọi thứ và đột nhiên chúng tôi có thể loại bỏ một tấn logic quá phức tạp và lỗi.


1
bạn nên xóa câu trả lời này và chỉnh sửa thành câu trả lời gốc của mình
Ryathal

Tôi nghĩ rằng đây là một câu trả lời khác nhau cho câu trả lời khác của tôi.
deworde

-1

Hy vọng những trường hợp mà bạn phải suy nghĩ rất nhiều về những cái tên là rất hiếm. Khi những trường hợp đó phát sinh, chỉ cần viết một đoạn văn giải thích những gì lớp làm. Trái với nhận xét trong chức năng hoặc nhận xét cấp chức năng, mục đích chính của một lớp hiếm khi thay đổi nên nguy cơ nhận xét bị lỗi thời là tương đối nhỏ. Vì vậy, bạn có thể viết một vài đoạn hoặc thậm chí vẽ ASCII để giải thích những gì lớp học làm.

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.