2009-02-04 38 views
26

Có thể chấp nhận sử dụng từ 'Cơ sở' trong tên lớp là đáy của cây thừa kế không?Sử dụng "Cơ sở" trong Tên lớp

Tôi đã luôn tìm thấy điều này một chút của một cảnh sát, chỉ cần tự hỏi nếu có ai đồng ý với tôi.

Ví dụ, nếu tôi tái cấu trúc một số yếu tố từ MyClassA và MyClassB thành một lớp cơ sở chung, tôi sẽ bị cám dỗ để tạo ra một MyBaseClass mà từ đó hai kế thừa.

Nhưng điều gì xảy ra nếu tôi cần phải tái cấu trúc MyBaseClass? MyBaseBaseClass? Bây giờ đó chỉ là ngớ ngẩn.

Tôi biết rằng Rocky Lhotka không quan tâm đến khuôn khổ CSLA của mình, nhưng tôi luôn cảm thấy khó chịu về 'definites' trong lập trình.

Suy nghĩ?

Hãy để tôi làm rõ lý do tại sao Tôi thậm chí còn lo lắng về điều này.

Tôi có hai không gian tên - MySpecificNamespace và MyCommonNamespace. MyNamespace sử dụng MyCommonNamespace, như bạn có thể mong đợi.

Bây giờ, tôi muốn sử dụng tối đa Không gian tên bất cứ khi nào có thể để mô tả bối cảnh của sự cố và tránh thêm ngữ cảnh vào tên lớp. Vì vậy, ví dụ, hãy xem xét rằng tôi có một lớp trong MyNamespace mà xuống từ một trong MyCommonNamespace.

Lựa chọn A

tôi thể cuộc gọi này

MySpecificClass: MyClass 
{ 
} 

Nhưng sau đó tôi thêm 'Cụ' (ngữ cảnh) để tên - đó là không cần thiết vì nó đã có trong MySpecificNamespace.

Lựa chọn B

MyClass: MyCommonNamespace.MyClass 
{ 
} 

Bạn có thể xem làm thế nào chúng ta có thể bị lẫn lộn ở đây, phải không?

Lựa chọn C

Người tôi nghĩ là tanh:

MyClass: MyBaseClass 
{ 
} 
+0

câu hỏi hay. cảm ơn – frameworkninja

+0

Cảm ơn câu hỏi. Đã trở thành mục nhập thứ hai trên truy vấn mà tôi đã nhập vào Google, muốn xem liệu có ai đó đã hỏi điều tương tự không, cũng như chỉ đổi tên các lớp và tự làm "Yuk!" :) –

+0

Ngoài ra, hãy xem http://stackoverflow.com/questions/429470/naming-conventions-for-abstract-classes – nawfal

Trả lời

0

Tôi nghĩ rằng nó có lẽ nên tránh nếu có thể có lợi cho một định danh mà thực sự mô tả nó là gì!

Câu hỏi này khó trả lời vì nó trừu tượng. Tôi có thể, ví dụ, xem xét việc gọi cơ sở của MyClassA và MyClassB, "MyClass".

+0

Cảm ơn phản hồi của bạn - hy vọng tôi đã giúp làm sáng tỏ câu hỏi này một chút! – Duncan

3

Tôi nghĩ rằng nó đáng để giải quyết vấn đề này.

FWIW, tôi đồng ý. Tôi thường cố gắng tìm một cụm từ "chung chung" hơn cho các lớp cơ sở của mình. Vì vậy, nếu tôi có một "khách hàng" lớp và cần phải giới thiệu một lớp cơ sở mới cho nó, tôi muốn đi với "Liên hệ" hoặc một cái gì đó chứ không phải là "CustomerBase".

8

Tôi bên cạnh "không" cho chính xác lý do tái cấu trúc mà bạn đã trích dẫn.

Lớp học phải được đặt tên sau khi biểu diễn một cách hợp lý và không có gì ngoài lớp Object là thực sự thực sự là cơ sở. Siêu hình học ftw :)


lại: Lựa chọn B, không có gì khó hiểu về

namespace MySpecificNamespace 
{ 
    MyClass: MyCommonNamespace.MyClass 
    { 
    } 
} 
9

tôi có xu hướng để thêm một hậu tố cơ sở để tên của lớp cơ sở chỉ nếu nó tồn tại từ góc độ kỹ thuật (là để chia sẻ một số mã) và không thực sự cấu thành bất kỳ lớp nào có thể sử dụng được (do đó tất cả các lớp này đều trừu tượng). Đây là những trường hợp khá hiếm, và nên tránh như các lớp Helper.

2

Tôi cũng đứng về phía không có trại ... đặt một cơ sở trong đó ngày hôm nay và trong 6 tháng một người nào đó sẽ whack một lớp MyDerivedClass trong cơ sở mã của bạn trong khi bạn không tìm kiếm.

3

tôi cũng sẽ đề nghị Không, nhưng không đúc bằng đá ...

Sau OO thần chú, hệ thống đặt tên của bạn nên thể hiện tốt nhất các đối tượng cơ bản rằng mã là vụ phải được đóng gói. Nên thực sự không có 'ngôn ngữ meta', liên quan đến trang điểm cú pháp thực tế của ngôn ngữ lập trình được lựa chọn trong đó.

Điều đó nói rằng, nếu đối tượng của bạn thực sự trừu tượng và bạn thực sự không thấy nó thay đổi bất cứ lúc nào sớm, có một lý lẽ cho rằng việc thêm 'Cơ sở' giúp với khả năng đọc chung.

Như với hầu hết mọi thứ, không có câu trả lời đúng và sai - nó phụ thuộc vào bố cục tổng thể của mã của bạn, mã cụ thể này được cho là đại diện và kiểu nội bộ bạn có. Chỉ cần cố gắng nhất quán.

Cơ sở có được sử dụng ở nơi khác không?

0

"Tóm tắt" tiền tố có thể?

+0

gần như chắc chắn, nhưng không giải quyết được vấn đề không gian tên – annakata

1

Trong Java, tôi có xu hướng cung cấp triển khai cơ sở của giao diện Foo trong lớp trừu tượng FooBase. Tôi nghĩ rằng đó là hoàn toàn ok, và làm cho kết nối với giao diện rất rõ ràng và thường xuyên.

Nếu không có giao diện, tôi sẽ gọi lớp cơ sở trừu tượng là Foo.

0

Tôi thường đi với IFoo cho giao diện và AbstractFoo để triển khai bộ xương, là sự kết hợp giữa các quy ước .NET và Java.

+0

Hmmm, tôi không thấy sự khác biệt giữa việc sửa chữa trước với Tóm tắt và sau sửa lỗi với Base là tôi sợ! – Duncan

1

Tôi đồng ý, AbstractFoo là giải pháp tốt. Tôi cố gắng chọn những cái tên không cần thêm tính từ. Tôi sẽ tránh xa việc sử dụng Base.

5

Các lớp có cùng tên với lớp cha mẹ của chúng khiến tôi không có kết thúc. Trong Java java.sql.Date mở rộng java.util.Date. Điều này rất khó chịu vì bạn phải chỉ định lớp chính xác mà bạn muốn nhập hoặc chỉ định tên lớp đầy đủ (bao gồm cả gói/không gian tên).

Cá nhân tôi thích đặt tên những thứ giống như chúng; nếu một lớp Base hoặc Abstract chỉ tồn tại để cung cấp một phần thực hiện một cái gì đó, và không đại diện cho giao diện cho điều đó, nó thường được chấp nhận để đặt từ Abstract hoặc Base trong tên của nó. Tuy nhiên, nếu lớp đó đại diện cho giao diện là tốt, sau đó bạn chỉ cần đặt tên nó sau khi nó làm gì.

Ví dụ: trong Java, chúng tôi có giao diện Kết nối (đối với kết nối DB). Nó chỉ được gọi là kết nối, không phải IConnection. Bạn sử dụng nó như thế này:

Connection con = getConnectionFromSomewhere(); 

Nếu bạn đang làm cho một trình điều khiển JDBC và cần phải thực hiện kết nối, bạn có thể có một hoặc ConnectionBase AbstractConnection đó là lớp dưới của chi tiết thi hành kết nối cụ thể của bạn. Bạn có thể có

abstract class AbstractConnection implements Connection 

class OracleConnection extends AbstractConnection 

hoặc tương tự như vậy. Các khách hàng của mã của bạn, tuy nhiên, không bao giờ thấy AbstractConnection cũng không nhìn thấy OracleConnection, họ chỉ thấy Connection. Vì vậy, nói chung, các lớp học có nghĩa là hữu ích nói chung nên được đặt tên theo những gì chúng đại diện/làm, trong khi các lớp là người trợ giúp cho việc bảo trì/tổ chức mã có thể được đặt tên theo chúng.

* ps Tôi ghét đặt tên Giao diện với I. Mọi người có đặt tên tất cả các lớp của họ bằng C không? Đó là năm 2009! IDE của bạn có thể cho bạn biết loại đối tượng đó là gì, trong trường hợp kỳ lạ khi nó thậm chí còn quan trọng nếu đó là một giao diện hoặc một lớp.

4

"Tất cả BaseClass của bạn đều thuộc về chúng tôi".

Tôi ở bên cạnh số không dứt khoát, với một ngoại lệ duy nhất. Nếu bạn đang viết một ứng dụng để quản lý các cơ sở quân sự hoặc sân vận động bóng chày, hãy tìm nó.

Các vấn đề liên quan