Tôi có nên thêm một tiền tố Tóm tắt vào các lớp trừu tượng của tôi không? [đóng cửa]


20

Giả sử tôi có một lớp trừu tượng có tên Task.

Có một tiêu chuẩn hoặc quy ước sẽ đề nghị tôi nên đặt tên AbstractTaskthay thế?


Các quy ước đặt tên được liệt kê ở đây: oracle.com/technetwork/java/codeconventions-135099.html đề nghị không, mặc dù liên kết này: stackoverflow.com/questions/1006332/. Nói rằng bạn có thể và nó sẽ không phải là điều tồi tệ nếu bạn làm vậy.
Thất vọngWithFormsDesigner

Trong C #, quy ước chuẩn là Suffix với '* Base'.
Den

Câu trả lời:


26

Theo Java hiệu quả của Bloch (Mục 18), tiền tố trừu tượng là một quy ước được sử dụng trong trường hợp đặc biệt.

Bạn có thể kết hợp các ưu điểm của giao diện và các lớp trừu tượng bằng cách cung cấp một lớp triển khai khung xương trừu tượng để đi với mỗi giao diện không cần thiết mà bạn xuất. ... Theo quy ước, các triển khai bộ xương được gọi là AbstractInterface, trong đó Interface là tên của giao diện mà chúng thực hiện.

Nhưng Bloch cũng chỉ ra rằng cái tên SkeletalInterface sẽ có ý nghĩa, nhưng kết luận rằng

các quy ước trừu tượng bây giờ được thiết lập vững chắc.

Như các câu trả lời khác đã chỉ ra, nói chung không có lý do để áp dụng quy ước đặt tên này cho tất cả các lớp trừu tượng.


15

Không có quy ước. Đó là tất cả về những gì sẽ giúp bạn, với tư cách là nhà phát triển, mã nhanh hơn và tốt hơn và giúp người khác hiểu mã của bạn.

Hỏi những người sẽ nhìn thấy và duy trì mã. Họ muốn nhìn thấy gì hơn? Điều gì sẽ làm cho nó dễ dàng hơn trên chúng? Sau đó, đặt tên cho nó dựa trên những gì họ muốn.

Một lưu ý khác, Các quy ước mã cho ngôn ngữ lập trình Java: 9. Các quy ước đặt tên cho thấy không có yêu cầu:

Tên lớp nên là danh từ, trong trường hợp hỗn hợp với chữ cái đầu tiên của mỗi từ nội bộ được viết hoa. Cố gắng giữ cho tên lớp của bạn đơn giản và mô tả. Sử dụng toàn bộ từ - tránh các từ viết tắt và viết tắt (trừ khi chữ viết tắt được sử dụng rộng rãi hơn nhiều so với dạng dài, chẳng hạn như URL hoặc HTML).


13

Không. Intellisense sẽ nói với tôi một cách tầm thường nếu nó trừu tượng, vì vậy bạn chỉ vi phạm DRY ở đây.


21
-1 Thêm abstractvào tên lớp không vi phạm DRY và không phải ai cũng sử dụng thông tin. Ví dụ, bạn sẽ làm gì nếu bạn đang đọc mã trên trang web hoặc nếu đó là một phần của bản vá bạn đang xem trong trình soạn thảo văn bản thuần túy hoặc công cụ tìm khác biệt bên ngoài?
Bryan Oakley

10
@Bryan: Tất nhiên là nó vi phạm DRY. abstract class AbstractName? Rõ ràng đã "trừu tượng" hai lần. Và nếu bạn không sử dụng Intellisense, thì đó là vấn đề của bạn, mọi người khác sử dụng các công cụ lành mạnh để xem mã.
DeadMG

13
"Bao giờ"? Hầu hết những người tôi biết sử dụng emacs và vi, với một số ít người sử dụng nhật thực. Nói điều gì đó là "vấn đề của bạn" không chính xác là định nghĩa của tinh thần đồng đội. Quan điểm đáng tiếc của tôi là, bạn không thể đặt ra một quy tắc chăn và nói rằng đó là cách nó được thực hiện. Các đội khác nhau có các yêu cầu khác nhau và không phải ai cũng cần hỗ trợ về intellisense. Ngoài ra, như tôi đã nói, có nhiều lần bạn đang xem mã trong một số công cụ khác ngoài trình soạn thảo chính hoặc IDE của bạn.
Bryan Oakley

1
+1 chắc chắn vi phạm DRY. Dựa vào Intellisense là một chút mạnh mẽ, nhưng bất cứ ai sử dụng lớp cơ sở ít nhất nên nhìn để xem những gì họ đang mở rộng như là một phần của RẮN.
Gary Rowe

8
@BryanOakley tại sao không đặt công khai và cuối cùng là tốt? Một tên lớp sau đó sẽ trông giống như Public AbTHERPersonThatImplementsInterfaceHuman. Hmm, không chắc chắn là tốt. Nhưng tôi đồng ý, không có gì như một quy ước chung - sử dụng bất cứ điều gì làm tăng năng suất tập thể của nhóm.
Apoorv Khurasia

9

Đây là một phần của vấn đề ưu tiên (nhưng thực tiễn xấu biên giới), nhưng hầu hết mọi người không muốn thấy một phần của vòng loại trong tên của lớp.

Hầu hết các IDE sẽ làm cho thông tin đó dễ dàng có sẵn cho bạn bằng mọi cách, vì vậy việc đặt nó vào tên là không cần thiết và sẽ sạch hơn nếu chỉ bỏ qua nó. Nó gợi nhớ đến ký hiệu của Lynn về cách đặt tên thay đổi, và điều đó chắc chắn được coi là hình thức tồi tệ hiện nay. Tôi khuyên bạn chỉ cần gọi nó Task.


9

Trong .NET, việc sử dụng "Base" làm hậu tố để biểu thị một lớp cơ sở trừu tượng thường được thấy. Tôi sẽ nói với các câu trả lời khác là liệu đây có phải là thông lệ phổ biến trong Java không.


1
+1 cho hậu tố "Base" và "Impl". Họ tạo ra một điểm cấu trúc (một lớp trừu tượng sẽ là cơ sở cho một cái gì đó).
vski

7
@vski: không, tôi hoàn toàn không đồng ý: chúng là một nỗi đau vô dụng ở mông. Nói chung, hoàn toàn ổn khi đặt tên cho giao diện hoặc cơ sở của bạn với một tên chung mô tả giao diện và việc triển khai cụ thể của bạn với các tên dễ hiểu hơn.
haylem

3
Tôi có xu hướng sử dụng ... Base cho một lớp cơ sở đằng sau một giao diện. Tên tốt đã được giao diện lấy và lớp cơ sở không được sử dụng bởi mã máy khách.
starblue

1
@Haylem nhiều mẫu thiết kế java sử dụng giao diện chỉ với một triển khai dự kiến. Impl là một hậu tố rất hữu ích trong những trường hợp này.
funkybro

Về việc sử dụng Impl, xem Mặc định so với Impl - tránh xa Impl! Sử dụng Base làm hậu tố (ví dụ: TaskBase) ngụ ý rằng một lớp cơ sở là một mẫu chứ không phải là một cấu trúc ngôn ngữ.
Gary Rowe

8

Theo tôi, tên của một thực thể không nên truyền đạt thông tin về cấu trúc kiểu của nó, mà về ngữ nghĩa của nó. Vì vậy, sẽ không có nghĩa gì khi định nghĩa lớp của bạn là "Tóm tắt" nếu tính trừu tượng không nằm trong mục tiêu thời gian chạy của nó. Rằng nó là một lớp trừu tượng cơ sở có thể nhìn thấy được đối với người lập trình và không cần phải được phản ánh trong tên.

Tuy nhiên, nếu làm cho hoàn hảo để gọi một triển khai của một nhà máy trừu tượng là Trừu tượng, bởi vì điều đó liên quan đến ý định của lớp.

Nói chung, ủng hộ quy ước đặt tên giúp truyền đạt nhiều thông tin nhất về mục tiêu của lớp học của bạn.

Tương tự, ở lại rõ ràng từ SomethingImpl. Chúng tôi không quan tâm rằng đó là một triển khai và không phải là một lớp cơ sở. Nếu hệ thống phân cấp lớp của bạn được thiết kế đúng cho kế thừa, thì ai đó có thể thừa kế từ nó. Chắc chắn sẽ không có giá trị trong việc thêm các hậu tố "Impl" hoặc các tạo tác khác. Cũng không có giá trị trong việc thêm hậu tố "Giao diện" hoặc tiền tố "I".

Xem xét:

IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl

Như trái ngược với:

Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
                                   <-- Ferrari
                                   <-- Trabi

Tôi thích cái sau cho đến nay.


Điều này, về mặt nào đó, tương tự như sự lạm dụng trắng trợn của Ký hiệu Hungary mà sau đó đã cho nó là đại diện xấu , vì mọi người bắt đầu hiểu sai khi yêu cầu các nhà phát triển tiền tố biến của họ bằng một chỉ báo của loại biến. Mặc dù điều này đôi khi có thể có công dụng của nó (chủ yếu là nếu bạn lười tìm kiếm định nghĩa của loại), nhưng nó hầu như vô dụng. Ý tưởng ban đầu của Simonyi với Ký hiệu Hungary là sử dụng nó như một cách ghi nhớ để nhắc nhở nhà phát triển về các khả năng của thực thể, chứ không phải loại này.


3

Một nguyên tắc nhỏ là không bao gồm các thuộc tính trong một tên rõ ràng từ cú pháp. Vì trong Java, bạn cần đánh dấu một lớp trừu tượng bằng abstracttừ khóa được đặt tên thích hợp , tôi sẽ không bao gồm nó trong tên. Ví dụ, trong C ++, trường hợp này không quá rõ ràng, nhưng ít nhất trình biên dịch sẽ cho bạn biết khi bạn sử dụng không đúng một lớp trừu tượng. Trong một cái gì đó giống như Python một lần nữa, đặt tên rõ ràng cho một lớp trừu tượng như vậy không phải là một ý tưởng tồi.

Ngoại lệ thông thường cho quy tắc là khi tên không rõ ràng. Nếu, vì bất kỳ lý do gì, có một lớp con cụ thể Task(trong các ví dụ khác, điều này có thể hợp lý hơn, nhưng bất cứ điều gì), thì chắc chắn, sử dụng AbstractTask.


... hoặc một giao diện như ListAbstractListlớp (thực hiện nó).

3
protected abstract SomeClass { }

Điều này cho tôi biết đây là một lớp Trừu tượng. Thêm tiền tố là một tautology và chống mẫu và không phù hợp trong hầu hết các trường hợp, hãy xem liên kết nơi nó nói về việc package locallà một ngoại lệ chẳng hạn.

Trong hầu hết các trường hợp, Abstractcác lớp không nên là một phần của API đối mặt công khai, nếu đó thực sự phải là một lý do chính đáng và một lý do chính đáng sẽ cung cấp một tên rõ ràng tốt hơn là AbstractSomeClass.

Trong hầu hết các trường hợp nếu bạn không thể đưa ra một cái tên mô tả hơn, có lẽ bạn cần phải thiết kế lại.


0

Năm xu của tôi, Có lẽ bạn sẽ có các triển khai của lớp trừu tượng đó và chúng sẽ được đặt tên là 'Một số đặc điểm', 'TaskWithBubble', 'StrangeTask', v.v. Vì vậy, sẽ không có xung đột tên giữa 'Nhiệm vụ' trừu tượng của bạn và chúng.

Ngoài ra, từ 'trừu tượng' là về cú pháp ngôn ngữ, không phải các thực thể miền kinh doanh, vì vậy tôi không muốn sử dụng nó như một phần của tên.

Mặt khác, trong một câu trả lời ở đây, tôi đã thấy đoạn trích từ J.Bloch Java hiệu quả nói rằng sử dụng 'trừu tượng' như một phần của tên là một thực tiễn được thiết lập tốt. Nó có thể là như vậy. Nhưng dù sao trong các quy ước mã java chính thức, không có gì về điều đó.


public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- người ta không thể sử dụng Listlàm tên cho AbstractListlớp vì đó là tên của giao diện. Đó là một thực tiễn được thiết lập tốt và là một phần của mã Java chính thức được sử dụng trong đó một cái gì đó thực hiện giao diện có thể hoặc không thể mở rộng một lớp trừu tượng (cũng thực hiện (một số) giao diện).

-1

Nếu bạn làm việc trong một nhóm, thì toàn bộ nhóm phải quyết định xem bạn có nên thêm tiền tố vào các lớp trừu tượng với "Trừu tượng" hay không.

Nếu bạn tự làm việc thì điều đó hoàn toàn phụ thuộc vào bạn chứ không phải tôi hay bất kỳ ai khác trên trang web này.



-2

Nếu bạn muốn viết một AbstractSyntaxTreelớp trừu tượng thì sao? Hoặc có lẽ chỉ là một bản tóm tắt SyntaxTree?

Nó không thông thường và nó có thể dễ dàng gây nhầm lẫn cho mọi người.


-2

Tôi đã làm điều này. Tôi đã thêm 'Trừu tượng' làm tiền tố vào lớp trừu tượng của mình có tên là Tóm tắt. Lý do tôi làm điều này là có một gói khác có một lớp không trừu tượng có tên là Hoạt động, và nó đã giúp nhóm của tôi và các lập trình viên tiếp quản sau này để tránh bất kỳ sự nhầm lẫn nào giữa hai ngườ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.