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 AbstractTask
thay thế?
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 AbstractTask
thay thế?
Câu trả lời:
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.
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).
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.
abstract
và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?
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ã.
Đâ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
.
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.
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.
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 abstract
từ 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
.
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 local
là một ngoại lệ chẳng hạn.
Trong hầu hết các trường hợp, Abstract
cá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.
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 List
làm tên cho AbstractList
lớ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).
Tôi không phải là nhà phát triển Java (INAJD?) Và không biết danh pháp tiêu chuẩn cho những thứ đó, nhưng tôi nghĩ Task
âm thanh đủ trừu tượng để nó có thể đứng một mình.
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.