Những gì đặt tên chống mẫu tồn tại? [đóng cửa]


35

Có một số tên, trong đó nếu bạn thấy mình đang tìm kiếm những cái tên đó, bạn biết bạn đã nhầm lẫn một cái gì đó.

Ví dụ:

XxxManager
Điều này là xấu vì một lớp nên mô tả những gì lớp làm. Nếu từ cụ thể nhất bạn có thể nghĩ ra cho những gì lớp học làm là "quản lý" thì lớp đó quá lớn.

Những gì chống đặt tên khác tồn tại?

Để làm rõ, tôi không hỏi "tên gì là xấu" - câu hỏi đó hoàn toàn chủ quan và không có cách nào để trả lời nó. Tôi đang hỏi, "những cái tên nào chỉ ra các vấn đề thiết kế tổng thể với hệ thống." Đó là, nếu bạn thấy mình muốn gọi một thành phần Xyz, điều đó có thể cho thấy thành phần đó bị che giấu. Cũng lưu ý ở đây rằng có các ngoại lệ cho mọi quy tắc - Tôi chỉ tìm kiếm các cờ cảnh báo khi tôi thực sự cần dừng và suy nghĩ lại về một thiết kế.


1
Làm thế nào về Công ước đặt tên Smurf ?
back2dos

4
Đối với những người bỏ phiếu đóng cửa là "không mang tính xây dựng" - bạn có sẵn lòng giải thích lý do tại sao không? Điều duy nhất mà điều này không làm quá tốt là các câu trả lời có thể ngắn, nhưng nó chắc chắn đáp ứng năm nguyên tắc khác ...
Billy ONeal


2
@Aaronaught: Có gợi ý nào không? Tôi đã nói rõ điều này cũng như tôi có thể chỉnh sửa ....
Billy ONeal

1
@jhocking - Tôi đồng ý với một số liên kết đó - đặc biệt là một chút về "Người quản lý" và "Người xử lý" quá giá trị để cho đi. Và tôi không bán nó trên các thiết kế thay thế dựa trên mẫu thiết kế và các lựa chọn khác, có vẻ ít nhất là mơ hồ trong nhiều trường hợp. Đôi khi, "Hàng đợi" hoặc bất cứ điều gì có thể phù hợp, nhưng thường thì việc người quản lý giữ (hoặc tham chiếu) các mục trong hàng đợi chỉ là một khía cạnh của việc quản lý các mục đó. Giống như một cái gì đó hữu ích được thể hiện bởi "người quản lý" như một chức danh công việc, IMO cũng áp dụng tương tự trong OOP.
Steve314

Câu trả lời:


22

Các kiểu chống đặt tên sau đây có liên quan đến .NET và đặc biệt là C #:

  • Mâu thuẫn . Nếu bạn quyết định bắt đầu mọi tên trường bằng dấu gạch dưới hàng đầu, hãy bám vào nó .
  • Chữ viết tắt Ambiguos với nguyên âm bị thiếu . Tôi đã nghiêm túc nhìn thấy tên trường như cxtCtrlMngr. Bạn khó có thể đoán được những gì được cho là đại diện cho.
  • Tên biến quá dài và dài dòng . ILoginAttemptRepositorylà tốt và mô tả - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappinglà mô tả, nhưng chắc chắn không tốt.

7
Inghĩa là interfaceở đây implementer, hoặc ngôi thứ nhất số ít? Vì hầu hết các lớp thực hiện một giao diện, việc có quá nhiều lớp / liên kết bắt đầu với một số vốn Ilà điều gây khó chịu và cản trở khả năng đọc và mùi mã của chính nó.
người dùng không xác định

3
+1 cho "Chữ viết tắt của Ambiguos với các nguyên âm bị thiếu" khiến chúng phát điên!
Thất vọngWithFormsDesigner

6
@Billy ONeal: C ++ có giao diện; họ chỉ không tách biệt khỏi các lớp học một cách giả tạo. ;)
Jon Purdy

4
@Billy ONeal: Đó là quan điểm của tôi.
Jon Purdy

2
@MariusSchulz: oh yeah, tôi đồng ý với bạn :) Chỉ cần nghĩ rằng đó không phải là một từ viết tắt quá khủng khiếp.
amara

9

Một cái mà tôi gặp phải thường là, đơn giản, không sử dụng bất kỳ mẫu đặt tên nào cả. Điển hình cho thấy sự thiếu hiểu biết của nhà phát triển (rằng các mẫu đặt tên là một điều tốt ) và cả kiểu chống này có xu hướng vi phạm nghiêm trọng SRP bằng cách nhồi nhét tất cả các loại phương thức liên quan đến một lớp vào chính lớp đó, ví dụ như một Khách hàng lớp có các thuộc tính, phương thức CRUD, mọi thứ liên quan từ xa đến Khách hàng mà một phần của ứng dụng cần.

Tôi cũng sẽ thêm rằng việc sử dụng "Engine" làm hậu tố cũng giống như sử dụng "Manager". Điều này rất mơ hồ và một lớp được gọi là XxxEnginecó xu hướng tương đương với Mô-đun kiểu VB có chứa một loạt các phương thức để nó ở một điểm "dễ sử dụng", mà không có bất kỳ kiến ​​thức hay ý tưởng nào về lập trình hướng đối tượng.


7

Chà, câu trả lời đơn giản trước tiên: hãy nhập tên tiếng Anh ( http://mindprod.com/jgloss/unmainnaming.html , cũng có một số ý tưởng tuyệt vời khác. Một cái nhìn cân bằng hơn về khi mà Drake không xấu xa, http://www.joelonsoftware.com /articles/Wrong.html )


7
Ký hiệu Hungary LUÔN là xấu xa :)
Wayne Molina

12
@Wayne: Thật ra, không phải lúc nào cũng xấu. Tôi đã làm việc cho Charles tại Xerox vào cuối những năm 70 và hệ thống đặt tên ban đầu là một cứu cánh. Chúng tôi đã làm việc trong BCPL có 1 loại: số nguyên. Tất cả mọi thứ khác về loại được truyền đạt bằng cách sử dụng và quy ước đặt tên. Chúng tôi đã có 7 lập trình viên + Charles và bất kỳ ai trong chúng tôi có thể truy cập vào mã của người khác và ngay lập tức có hiệu quả. Điều này không có nghĩa là nó không thể bị xoắn / áp dụng sai (thậm chí bởi Charles), chỉ trong bối cảnh phù hợp, đó là giải pháp đúng đắn.
Peter Rowell

3
@Marius: Đọc bài viết của Joel. Hệ thống loại không thể luôn luôn thực thi tất cả các khác biệt về ngữ nghĩa giữa các biến. Intellisense cũng không giúp được gì trong những trường hợp như vậy.
Billy ONeal

4
Loại dễ suy luận hơn sử dụng, đặc biệt. với các biên tập viên hiện đại. Tuy nhiên, nó đòi hỏi kỷ luật. Bạn không cần phải thêm tiền tố vào mọi thứ . Tôi làm việc trong Java và hầu hết các ứng dụng tiếng Hungary không cần thiết, nhưng khi tôi làm bất cứ điều gì đòi hỏi một số loại biến giống nhau (như từX và toX) trong các hệ thống tọa độ thì đó là một cứu cánh.
Michael K

3
Những gì sẽ tốt đẹp là một khả năng chung để tạo ra các loại mới một cách dễ dàng. "Cái này giống như một int, ngoại trừ việc nó áp dụng cho số hàng."
David Thornley

6

Tiền tố một 'Tôi' với tên của một giao diện, hoặc 'Trừu tượng' với tên của một lớp trừu tượng. Điều này có thể dễ dàng sử dụng trong các ngôn ngữ không có khái niệm về các lớp trừu tượng hoặc không phân biệt giữa các giao diện và các lớp trừu tượng - nhưng trong Java, chẳng hạn, đó luôn là một ý tưởng tồi.

Ngoài ra, tôi không đồng ý với bạn về điều Manager. Đôi khi tôi sử dụng mô hình đó và điều đó chỉ có nghĩa là nếu tôi cố gắng đặt tên cho cái gì đó khác, thì tên đó sẽ không được mô tả nhiều hơn XxxxxManager. Có một số nhiệm vụ (không nhất thiết phải phức tạp) mà không thể tóm tắt gọn gàng trong một hoặc hai từ.


@Mike: Tôi hoàn toàn không đồng ý với tuyên bố của bạn, xin lỗi. Theo tôi, XxxxManagerlà cái tên tồi tệ nhất mà một lớp có thể có. Tất nhiên là nó quản lý một cái gì đó! Đó là lý do nó được viết cho. Managerlà một từ điền vào vô nghĩa không thêm giá trị để hiểu - theo tên của nó - những gì một lớp chịu trách nhiệm.
Marius Schulz

1
Những gì về, nói , TabManager? Có một tên tốt hơn cho một lớp điều khiển cơ chế tab JSP? Hoặc thở hổn hển TabController ... Theo như tiền tố Abstract, tôi cảm thấy nó bị lạm dụng nhưng thường hợp lệ (xem các thư viện Java để biết ví dụ). Tôi nghĩ rằng tôi có thể nói một cách an toàn rằng tôi chưa bao giờ thấy Igiao diện ở bất kỳ nơi nào mà ai đó không cố gắng lập trình dựa trên giao diện không nên có ở đó. Giống như, chỉ có một lớp thực hiện giao diện.
Michael K

1
@Darien (Và những người khác): Dù bằng cách nào - không thành vấn đề. Không ai trong số những cái tên đó là chống mẫu (và do đó chúng không có chủ đề cho câu hỏi này). Tôi không nghĩ bạn có thể nói bất cứ điều gì về thiết kế của một hệ thống từ việc họ có sử dụng IXxxhay không XxxImpl.
Billy ONeal

2
Điều này là hoàn toàn, hoàn toàn sai. Có nhiều lý do chính đáng để phân biệt trực quan các giao diện với các lớp: (a) chúng không thể được khởi tạo, (b) chúng không thể được giải phóng / xử lý, (c) chúng không thể được nối tiếp, (d) chúng có thể được ủy nhiệm / chặn, v.v., v.v., bạn vừa vứt bỏ thứ gì đó mà cá nhân bạn không thích (vì một lý do kỳ quái và không giải thích được) như một ví dụ về một mô hình chống đối mà không có bất kỳ biện minh nào cả.
Aaronaught

1
Bất cứ khi nào có thể, các giao diện nên được ưu tiên hơn các lớp cụ thể cho các kiểu đối số và kiểu trả về. Do đó, thật hợp lý khi các giao diện có được tên "sạch" và các cài đặt cụ thể (loại thực tế mà người gọi thậm chí không biết hoặc không quan tâm) để có được mụn cóc.
Kevin Krumwiede

6

Cảm giác:

Tôi có một khuyết tật nghiêng và không thể đánh vần. Với trình kiểm tra chính tả, tôi bất lực, tôi cố gắng sao chép tất cả các tên tôi tạo vào một trình xử lý văn bản để xác minh nhưng tôi luôn bỏ lỡ một số. Trong dự án cuối cùng của tôi, tôi đã viết một phần lớn của api và tôi đoán rằng tôi đã không kiểm tra chính tả ngay lần đầu tiên tôi sử dụng từ responce và tôi cho rằng nó đúng vì không ai nói với tôi. Chúng tôi đã có ít nhất 50 chức năng với mặt nạ trong đó. Một người mới vào đội và hỏi tại sao chúng tôi sử dụng responce tôi cảm thấy thật ngớ ngẩn.


2
Tôi đã sử dụng một plugin jQuery một cách nhanh chóng trong đó một trong các tham số là affect(thay vì hiệu lực). Nó làm tôi phát điên và tôi nhanh chóng tìm thấy một plugin khác để làm điều tương tự.
zzzzBov

4
Vấn đề tồi tệ nhất mà tôi gặp phải là, một khi tôi nhìn thấy một cái tên sai chính tả, nó thực sự làm tổn thương khả năng của tôi để nhớ những cái tên đó là gì.
David Thornley

1
Nó trở nên tồi tệ hơn khi cùng một thứ được đánh vần khác nhau trong các phần khác nhau của mã. Giống như khi bạn có một trường cường độ của lớp Srtstep được truy cập bằng phương thức getStrenth ().
Eva

5

Vâng, tôi sợ ý kiến ​​của tôi là một chút tranh cãi. Nhưng hãy thử ...

Theo như tôi quan tâm, tôi phải đồng ý với Mike Baranczak, những cái tên như XxxControll, XxxHandler là thứ chúng tôi thực sự thường sử dụng. Đối với chúng tôi, Bộ điều khiển giống như một điểm khởi đầu cho một cái gì đó "được gói gọn", ví dụ như quản lý các giao dịch, xử lý các lỗi không mong muốn, gọi XxxHandler để thực hiện công việc thực tế. Tôi muốn nói XxxManager là từ đồng nghĩa với bộ điều khiển. Tôi nghĩ điều quan trọng là không sử dụng Trình quản lý trong một trường hợp và Trình điều khiển trong trường hợp khác. Sự nhất quán là rất quan trọng nếu bạn làm việc trong một nhóm.

Sẽ rất khó hoặc thậm chí có thể không tìm được tên tốt hơn cho những thứ như thế này. Xxx nên được lựa chọn tốt để làm cho tình hình rõ ràng hơn.

Điều cá nhân tôi không thích là, khi một phương thức gọi là get ... hoặc set ... không chỉ là một công cụ truy cập đơn giản. Tôi thích Det ... để xác định.

Một điều khác, điều đó xuất hiện trong tâm trí của tôi: Theo chú Bob. Một "Và" trong một tên phương thức là một dấu hiệu của việc làm nhiều. Nhưng cuộc sống không phải lúc nào cũng chỉ là đen trắng - có những tình huống mà tôi nghĩ nó ổn - ví dụ. do vấn đề về hiệu suất (khi bạn đã có dữ liệu do kiểm tra tại sao không xử lý chúng) ...

Cá nhân tôi cũng là một fan hâm mộ lớn của các ký hiệu của hệ thống - hầu hết thời gian bạn đang xử lý mã nguồn trong một IDE đều ổn. Nhưng thường thì bạn đang sử dụng chỉ một trình soạn thảo hoặc bạn đang duyệt repo trong trình duyệt. Một nhược điểm có thể là hỗ trợ công cụ do tiền tố loại ...

Tôi nghĩ rằng điều quan trọng nhất là sự đồng ý nuôi ong - một quy ước dưới mức tối ưu - đối với tôi - tốt hơn là không có quy ước ...


1
"Trình điều khiển" có ngữ nghĩa khác với "Người quản lý". Cá nhân tôi cũng không thích, nhưng "Trình điều khiển" có được bởi vì đó là thành phần phổ biến của nhiều mẫu, đặc biệt là MVC. XxxHandler cũng tệ như vậy. Nếu lớp chỉ "xử lý" một cái gì đó - thì lớp đó quá lớn hoặc nó chỉ nên được gọi là phần "Xxx".
Billy ONeal

3
"Sẽ rất khó hoặc thậm chí có thể không tìm được tên tốt hơn cho những thứ như thế này" - không phải nếu bạn thiết kế hệ thống phân cấp kiểu của mình đúng cách, với các phụ thuộc và trách nhiệm được xác định rõ. Tất nhiên, nếu bạn đang sử dụng "Trình điều khiển" như một phần của MVC hoặc "Trình xử lý" cho trình xử lý thông báo / sự kiện chung thì điều đó sẽ khác - đó là những ví dụ của biệt ngữ - nhưng nếu chúng chỉ được sử dụng làm tên chung cho - các lớp được định nghĩa sau đó là một cờ đỏ lớn.
Aaronaught

5

Có lẽ cách chống tên xấu nhất là cái này:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Chúng tôi có một danh sách ba yếu tố của các cặp [foo, bar]. Nếu chúng ta cần một thứ tư, chúng ta sẽ phải thêm các cột mới vào bảng.

Dẫn đến mã như thế này:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Một bảng riêng biệt phải được tạo với các cột foo và thanh và được liên kết với bảng thứ:

create table fubar(foo string, bar string, stuff_id long)

Điều tồi tệ thứ hai là đây:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Ở đây chúng tôi có sáu trường thay vì hai trường hợp của một lớp Địa chỉ.

Mẫu chống này được đánh dấu bằng một loạt các tên hai phần liệt kê mọi kết hợp của hai bộ, ví dụ: [foo, bar] x [1,2,3] hoặc [home, perm] x [street, city, state]


-1 - điều này không đề cập đến việc đặt tên ở tất cả.
Billy ONeal

Một mô hình chống đặt tên không thể bao gồm nhiều hơn một tên?
kevin cline

Làm thế nào để quá nhiều đối số ==đặt tên antipotype? Tôi bối rối.
Billy ONeal

1
theo như tôi hiểu anh ta, quy ước là một quy tắc cho phép các số trong đó phải lấy tên thật. Những con số này dẫn đến một ấn tượng sai lầm, rằng các mục là một loại danh sách hoặc mảng
keppla

3
@Billy ONeal: Có họ làm. Vấn đề thiết kế là thiếu chuẩn hóa, và hậu tố số là mẫu đặt tên chỉ vào nó.
Revierpost

3

Bất kỳ lớp hoặc giao diện đặt tên nào là tautology đều là một thứ xấu, không chỉ trong Java mà liên kết nói về, mà trong bất kỳ ngôn ngữ nào.

Tautology (hùng biện), sử dụng các từ khác nhau để nói cùng một điều ngay cả khi sự lặp lại không cung cấp rõ ràng.


2
Hấp dẫn. Ví dụ nào?
Mike Baranczak

2
Tôi đọc liên kết, nó nói "tautology" ...;)
Stewol

10
Quy tắc đầu tiên của câu lạc bộ tautology là quy tắc đầu tiên của câu lạc bộ tautology.
Cercerilla

Tôi đọc liên kết (được rồi, nội dung của liên kết) và không tìm thấy ví dụ nào
barjak

được rồi, theo liên kết đó, chúng ta nên ngừng sử dụng I <InterfaceName> ... đúng.
Dal

3

Tôi thường xuyên bắt gặp các thư viện phần mềm có tên chung như Libraryhoặc Common. Chúng chỉ ra thiết kế dưới mức tối ưu: các nhà phát triển nỗ lực để tránh sao chép mã nhưng không có bất kỳ nỗ lực nào để tạo ra một thiết kế bị phân tách trên cơ sở chức năng.


+1 - Tôi thấy "Chung" mọi lúc.
Morgan Herlocker

1

Từ Microsoft về cách đặt tên, tôi có thể cung cấp danh sách này cho các tên xấu:

  1. Chúng không phải là ngữ nghĩa, có nghĩa là chúng có tên thay vì nhấn mạnh vào những gì nó làm, nhấn mạnh vào công nghệ mà nó sử dụng hoặc mẫu mà nó dựa trên .
  2. Họ không tuân theo một sự thống nhất cú pháp. Ví dụ, một phần của tên là vỏ lạc đà, trong khi phần khác là vỏ pascal.
  3. Chúng là những từ viết tắt, rất khó hiểu, như ScrollableX thay vì CanScrollH theo chiều ngang
  4. Họ được chọn sao cho họ lộn xộn với các từ khóa của môi trường đó.

2
Tôi thực sự thích "ScrollableX" ít nhất là "CanScrollH Widthally". "X" không thực sự là viết tắt.
1172763
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.