将我的公共接口放入他们自己的包中是否可以(仅适用于我的组织)。
例如
com.example.myprogram - contains all normal code
com.example.myprogram.public - contains public accessible interfaces
com.example.myprogram.abstract - contains abstract classes
这是好事还是坏事,有没有缺点?
答案 0 :(得分:3)
我根本不喜欢这种做法。您应该根据功能对抽象和具体的类以及接口进行分组。
以Java API为例。 Sun是否将Collections接口与实现分开?没有.Sun的做法并不总是最好的指导,但在这种情况下我同意。
不要这样做。
答案 1 :(得分:2)
我可以建议你两种常见的方式:
如果你真的认为你的接口将来可以有更多的实现(即你正在使用API),那么将它们移动到一个单独的模块,并创建一个名为'core'的特殊包。 (com.example.myprogram.core
)。实现应该在相应的包中(如com.example.myprogram.firstimpl
)。
如果您只有1个实现,那么让所有接口都在com.example.myprogram
包中,并使用所有具体类in com.example.myprogram.impl
包。
答案 2 :(得分:0)
我不能认为这是一种不好的做法,但你可能会考虑将每个逻辑功能组织你的东西而不是语法定义,以便给定单位的功能接口/抽象类/普通代码的所有代码进入相同的包。这是modular programming的原则之一。
这样说,根据项目的大小,将所有接口(但只有那些接口)放在一个单独的包中可能是必要的,如果你有一个基于纯组件的插件架构,那么可能几乎是必要的(以便其他模块)只知道接口,实际的实现以某种方式动态注入)。
答案 3 :(得分:0)
公共接口是系统模块或系统之间的正式合同。因此,将它们与代码的其余部分隔离开来是有意义的,以使它们脱颖而出。
例如,在我所使用的系统中,系统的服务器和客户端组件之间的所有公共接口都被放置在一个特殊的系统模块中(称为“api”)。这有许多令人满意的效果,其中包括: - 在语义上,如果您需要有关如何进行通信的任何信息,您知道在哪里查看 - 您可以单独对api模块进行版本控制,这在您不想要移动目标时特别有用,即您签订合同以交付支持“api v.1.1”的应用程序,而不是在其他人不断播放时更改界面并要求您调整您的身边
这并不意味着您不应该在子包中进一步组织它们以区分它们的用途。 :)
总之,通过将接口与代码库的其余部分分离,您正在做正确的事情,尽管根据您的特定需求,您可能会更进一步,并将接口隔离在单独的系统模块中