2011-07-11 28 views
10

Chúng tôi đã chia ứng dụng của mình để gói A xử lý dữ liệu từ một nguồn bên ngoài và gói B từ nguồn khác. Trong cả hai trường hợp, chúng ta cần phải tạo một đối tượng miền và có một "Biến" để làm điều này.Thực hành không tốt để có hai lớp cùng tên trong các gói khác nhau?

Vì vậy, tôi có com.foo.bar.a.ThingTransformercom.foo.bar.b.ThingTransformer

tôi nghi ngờ rằng đây là thực hành kém, nhưng muốn xem những gì người tốt của SO nghĩ.

Trả lời

15

Tôi sẽ không đi xa như nói rằng nó luôn luôn là một thực tế xấu, nhưng nó là một phần của một code smell.

Nếu cả hai lớp học đều làm những thứ khác nhau, vậy tại sao chúng không có tên khác?

nếu cả hai lớp học đều làm cùng một điều thì tại sao có hai lớp?

Từ một quan điểm thực tế nó có thể trở thành rất gây phiền nhiễu nếu hai lớp bao giờ cần phải được tham chiếu trong cùng một lớp: bạn sẽ phải sử dụng các FQN cho một trong những người (nó có lẽ sẽ là tốt nhất để sử dụng nó cho cả trong trường hợp này, để rõ ràng). Nếu hai lớp đó nằm trong các phần đủ riêng biệt của mã mà chúng sẽ không được tham chiếu từ cùng một mã, thì vấn đề thực tế không quá tệ.

+0

Tôi đang duy trì một dự án mà mô hình đó là khắp nơi. Một số lớp có cùng tên, trong các thư mục khác nhau. Đôi khi tôi cảm thấy như đuổi theo ai chịu trách nhiệm cho điều đó và đánh bại họ. – Mirko

3

Không có gì sai với điều đó, vì rất khó bạn sẽ sử dụng cả hai lớp với nhau trong cùng một mã. Nhân đôi sự khác biệt a/b từ gói trong tất cả các tên lớp sẽ tồi tệ hơn.

+2

+1 để không nhân đôi thông tin khoảng trắng tên trong tên đơn giản! –

5

Thực tế không thực sự kém, như trong nhiều miền có thuật ngữ tương tự, vì vậy bạn sẽ có cùng tên. Mặt khác, nếu cả hai đều ở cùng một miền, nhưng chỉ cần triển khai khác nhau, bạn có thể (bằng cách nào đó) chỉ ra các chi tiết cụ thể trong tên.
Điều rất xấu sẽ là nếu bạn phải sử dụng cả hai trong cùng một tệp nguồn, trong trường hợp này bạn phải sử dụng tên đủ điều kiện cho ít nhất một tệp.

Ví dụ:

java.util.List java.awt.List

chỉ thực hiện trong tên:
java.util.ArrayList
java.util.LinkedList

+0

+1 để nêu lên rằng các miền khác nhau có thuật ngữ tương tự. Ví dụ: Lucene có một lớp Document mà tôi chắc chắn là một cái tên có thể dễ dàng xuất hiện trong một API khác. – lightalchemist

5

Đó là tốt. Đây chính là lý do tại sao, theo thiết kế, các gói khác nhau có các không gian tên khác nhau.

1

Bạn phải quyết định xem điều này hữu ích hay khó hiểu hơn. Bạn có thể nhận được cùng một vấn đề với việc sử dụng tên tương tự trong cùng một gói mà sự khác biệt không rõ ràng.

Một ví dụ về nhiều-khó hiểu hơn hữu ích là một cái gì đó giống như

com.sun.corba.se.internal.Interceptors.PIORB extends 
com.sun.corba.se.internal.POA.POAORB which extends 
com.sun.corba.se.internal.iiop.ORB which extends  
com.sun.corba.se.impl.orb.ORBImpl which extends 
com.sun.corba.se.spi.orb.ORB which extends  
com.sun.corba.se.org.omg.CORBA.ORB which extends 
org.omg.CORBA_2_3.ORB which extends 
org.omg.CORBA.ORB 
Các vấn đề liên quan