2011-06-01 17 views
2

我主要讲Java和经典OOP。假设我正在使用DAO模式。所以我创建了诸如CustomerDao,AccountDao和其他的界面。然后我将它放入org.example.dao包中:命名接口和实现并将它们放入包中的良好实践

org.example.dao.CustomerDao 
org.example.dao.AccountDao 
... 

到目前为止,这一切对我来说似乎都很好。然后我为这些接口创建实现。这里提出我的第一个问题:如何命名他们?我见过的一种做法是使用像CustomerDaoImpl这样的Impl后缀。或者名字应该反映实现的性质,例如AccountDatabaseDao或DatabaseBasedAccountDao?或者可能该名称应该保持不变,然后该包会描述这些实现的性质?如果您以某种方式提出建议,那么这些实施应该放在哪里?一个单独的包(什么命名逻辑?)或相同的包?

+0

也许是一个骗局:http://stackoverflow.com/questions/541912/interface-naming-in-java – 2011-06-01 13:12:14

回答

2

有两大阵营:功能和技术的命名。

的一个,如:

org.example.customer 
org.example.account 

的其他类似:

org.example.dao 
org.example.service 

我个人喜欢有接口,并在一个地方的实现,使只有接口公众和功能包因为这种包装具有更高的凝聚力。

随着尺寸的不断增加,您仍然可以拆分包装,例如org.example.customer.dao,org.example.customer.serviceorg.example.customer.ui。 (从技术上讲,这是一样的org.example.dao.customer.daoorg.example.service.customerorg.example.ui.customer作为Java包没有嵌套。)

对于您的例子我想先从:

org.example.customer.CustomerDao 
org.example.customer.DatabaseCustomerDao (package private) 
org.example.account.AccountDao 
org.example.account.DatabaseAccountDao (package private) 

为了使实现包私人你需要一个工厂创建实例。如果你使用DI。 DI框架为您实现工厂,您可以将实例注入仅依赖于接口合约的用户类中。

+0

我也喜欢看到用作功能层次而不是类类型的包。 – Robin 2011-06-01 13:47:18

0

我不确定这是否有一个确定的最佳实践。通常我们根据我们的实施情况使用子包。

例如:该接口可以是com.company.product.dao.ExampleDAO,以及(如果我们使用的MyBatis)的实施将是:com.company.product.dao.mybatis.ExampleDAOMyBatis

我不知道这是做的最好的方式,但我认为这里的一致性比做'最好'的方式更重要 - 不管你选择哪种方案,都要确保你坚持贯穿你的代码库。

0

这完全取决于你。

您列出的所有内容都是针对您问题的可行解决方案,并且您不会是第一个完成其中的任何解决方案的人。

这么说,我宁愿保持类的命名是最大的描述:

public interface AccountDao {} 

public class MySqlAccountDao implements AccountDao {} 

我将使无论是在org.company.dao

1

还有一些谁做

src 
    org 
     companyname 
      dao 
       impl 

,并在IMPL例如

import org.companyname.dao.UserDao; 

public class MySQLUserDAO implements UserDao; 

src 
    org 
     companyname 
      dao 


import org.companyname.dao.UserDao; 

public class UserDaoImpl implements UserDao; 

我喜欢的第一个选项的原因是,你浏览impl文件夹放置接口的DAO实现。它很整洁。