【问题标题】:Java interfaces directory structure?Java接口目录结构?
【发布时间】:2010-01-29 17:28:41
【问题描述】:

Java 中的接口应该驻留在它们自己的目录中吗?还是应该将接口及其实现放在同一个目录(包)中?谢谢。

【问题讨论】:

  • 根据布局包的逻辑,我通常会添加一个“impl”子包来指定实现,例如:com.stackoverflow.questions、com.stackoverflow.questions.impl。跨度>

标签: java interface directory-structure


【解决方案1】:

我见过的一种模式是将接口放在基目录中,然后将实现放在从那里的子目录中。

例如,接口可能会放在这里:

com.myproject.data.dao.CustomerDao (some people do ICustomerDao for interfaces, but some don't like that.)
com.myproject.data.dao.ProductDao

实现可能会在这里:

com.myproject.data.dao.hibernate.HibernateCustomerDao
com.myproject.data.dao.hibernate.HibernateProductDao
com.myproject.data.dao.someotherorm.SomeOtherOrmCustomerDao
etc.

这可能在某些情况下有效,而在其他情况下可能无效,但只是需要考虑的事情。

【讨论】:

  • 我最终在一个项目中采用了这种方法。我意识到我真的不希望用户可以访问界面以外的任何东西。据我了解,如果类被分成它们自己的包(访问级别需要是公共的),这是不可能的。我更喜欢您提供的方法,但对于我提供的情况,它效果不佳。
  • 这种方法的缺陷甚至出现在您编写 DAO 实现之前:它是逐层打包的。 DAO 应该进入需要它们的功能,而不是在单独的目录中。看到这个:javapractices.com/topic/TopicAction.do?Id=205
【解决方案2】:

接口并不特别需要它们自己的目录。它们应该放在有意义的地方,就像类应该放在有意义的地方一样。在许多情况下,将它们放在同一个地方可能是有意义的。

【讨论】:

    【解决方案3】:

    既然已经有了一些优点,我只想补充一点:

    在某些项目中,我们甚至将所有接口都放在一个子项目(maven 模块)中,将实现放在另一个子项目中。通过这种方式,可以将接口与实现完全分离,并在项目的早期完成接口项目,并将其交付给其他处理这些接口的团队。在每个项目中,我们使用相同的包。

    总的来说,我会说,你应该分开接口和它们的实现,方式并不重要,只要你与它保持一致。

    【讨论】:

      【解决方案4】:

      同一个包。用户不应该知道或关心他们正在使用界面

      【讨论】:

      • 是的。使用I 前缀很疯狂。
      • 用户需要知道他们是否必须自己实例化这些类。
      • "Same package" 没有回答这个问题。将单元测试与正在测试的类放在同一个包中,但将其放在完全不同的目录中是很常见的。
      【解决方案5】:

      任何地方都可以,但是将接口保持在相同的包和目录结构中绝对没问题。看看java api。如果您选择任何一个包,您会注意到许多包同时包含类和接口。有些接口是由同一个包中的类实现的,有些则不是。

      我认为最糟糕的做法是坚持你必须有一个不同的接口目录。我见过像 /services 和 /impl 等目录,它们只会弄乱目录结构。在我目前的工作场所,我们雇佣了很多来来往往的承包商,我们的一些项目有多种类型的界面目录。我认为使用单独目录唯一有意义的情况是,如果您打算将接口复制到其他项目中,例如 EJB,但即便如此,如果您为接口使用共享项目,它们也可以拥有相同的包。

      简短的回答是,在任何你想要的地方,但不要认为你需要分离你的类和你的接口。在许多情况下,最好将它们保存在同一个包/目录中。

      【讨论】:

        【解决方案6】:

        根本不需要将接口放在同一目录(包)中。如果您的接口具有公共访问权限,那么您可以在任何位置、任何包中导入它。

        【讨论】:

          【解决方案7】:

          我读到的问题(但它的表述很奇怪)不是接口是否应该在他们自己的目录中。问题是您是否应该重新创建完整的目录 structure(粗体以强调问题标题中的内容),其中一个分支仅包含接口,如下所示:

          pureooabstraction/
           |
           |_com/
             |
             |_example/
               |
               |__SomeInterface.java
               |__SomeOtherInterface.java
          
          src/
           |
           |_com/
             |
             |_example/
               |
               |__SomeClass.java
               |__...
          

          pureooabstraction/ 目录 structure 将仅包含“纯抽象类”(从 OO 的角度来看,而不是 Java 的“抽象”定义),即接口在 Java 中。

          “代码”所在的小实现细节(OOA/OOD 级别不存在)将放在 src/ 目录中。

          如果您的开发过程从 OOA 到 OOD 再到 OOP,这当然是有意义的。

          【讨论】:

          • 不,他只是问是否将接口与实现放在同一个包中
          猜你喜欢
          • 2013-07-11
          • 1970-01-01
          • 2010-11-27
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多