假设我有一个界面:
package org.my.dicom.CEchoSCU;
public interface CEchoSCU {
// stuff here...
}
我还将有一个接口的实现:
public class SimpleCEchoSCU implements CEchoSCU {
// stuff here...
}
我的问题是,哪个包应该包含实现?我已经看到其他开发人员将实现放在与接口(在这种情况下为org.my.dicom
)相同的包中,以及使用单独包的情况(通常类似于org.my.dicom.impl
)。除了个人偏好之外,是否有理由更喜欢一个而不是另一个?
答案 0 :(得分:6)
一个类实现了等的接口。我会把类放在一个与类的其余部分/包含的内容相关的包中,而不是反映它实现的一个接口的包。例如,如果我有200个实现Printable的类,我不会将它们全部放在com.mycompany.impl.printable包中。实现可打印的飞机类将包含其他飞机的包装。船类将与其他船只一起包装。实现Printable的Car类将与其他汽车产品一起包装。
如果所有SimpleCEchoSCU(以及任何其他未来的类)都实现了CEchoSCU,那么您应该考虑使CEchoSCU成为一个抽象基类并派生出不同的实现。无论哪种方式,(接口或抽象基类)事物都是完全相关的,我会将它们放在同一个包中。
答案 1 :(得分:3)
嗯,关于你将implementation
班级和interface
放在哪里,这不是一个严格的规则。您可以将它们放在任何包中,只要它们可以在应有的位置访问。
但是,当然,您还希望将所有related classes
合在一个package
中,将class
not related
合并到您的set of classes
,待在different package
。
大部分时间,我的方法是: -
我将interfaces
保留在different package
中,将implementing classes
保留在different package
中。这样,如果我想将我的接口提供给其他人,那么我可以直接赠送包含所有接口的包。
但同样,这完全取决于您的要求,以及您在代码中遵循的设计实践。
所以我选择的包名一般是: -
com.someName.api
- >对于接口com.someName.impl
- >用于实现类。这样我就可以轻松地将api
与implementation
分开。
答案 2 :(得分:2)
我通常遵循以下规则:
答案 3 :(得分:1)
我更喜欢将实现放在具有这样名称的包中:
path.to.package.of.interface.impl
但是,我不认为这是一个普遍的惯例,我想这是开发软件的组织所特有的。
答案 4 :(得分:1)
包作为一项规则是一个偏好和组织问题。有些地方会使用构建脚本来过滤掉API接口,例如,如果它们位于不同的实现包中,则可能更容易。真的,我认为最重要的是要保持一致,以便人们知道会发生什么(除非您使用的是对您施加限制的工具或脚本)。
答案 5 :(得分:1)
将实现类放在任何包中都没有错。这不会有任何补偿错误。但是,这取决于项目代码设置放置impl类的位置。在大多数情况下,实现类将与接口位于同一个包中。
然而,接口可以由不同类的类实现,因此在这种情况下,实现类和接口将在不同的包中。
示例是一个接口Bounceable
可以由Ball
,Jelly
甚至是Car
实现!