【发布时间】:2014-02-11 20:39:58
【问题描述】:
我正在开发一个基础库,旨在为大型应用程序提供通用接口,该应用程序旨在支持多个 DBMS(Oracle、SQLServer、MySQL、PostgreSQL 等)。此外,具体的类可以使用 JDBC 或 JPA 与 DBMS 进行交互。
我想提供一个涉及域(模型)类的基本持久性操作的合同,所以我使用泛型制作了这个接口:
public interface IDomainDAO<T> {
public int insert(T domainObject);
public int update(T domainObject);
public int delete(T domainObject);
public List<T> getList(IQueryFilter queryFilter);
}
注意:IQueryFilter 与我的问题无关。
我正在尝试决定是否应该提供更专业的接口,以便具体类可以实现这些接口而不是IDomainDAO,或者这样做只是浪费时间。例如:
public interface IUserDAO extends IDomainDAO<User>{}
这是一个具体实现的示例:
public class UserDAOJDBC implements IUserDAO {
public int insert(User domainObject){...};
public int update(User domainObject){...};
public int delete(User domainObject){...};
public List<User> getList(IQueryFilter queryFilter){...};
}
另一方面,实现可以简单地如下所示(而且我不必花一些时间提供专门的接口):
public class UserDAOJDBC implements IDomainDAO<User> {
public int insert(User domainObject){...};
public int update(User domainObject){...};
public int delete(User domainObject){...};
public List<User> getList(IQueryFilter queryFilter){...};
}
【问题讨论】:
-
额外的接口有什么用?因为据我所知,如果您需要
UserDaoJdbc,您可以将其替换为IDomainDao<? extends User> -
另外,我“继承”了一个使用第一种方法的项目。比这个设计问题更重要的是,不要局限于这些方法来实现,添加具体的方法(如
UserDao中的addUserRole)。否则,您的业务逻辑将分散并复制粘贴到各处(最后修复的错误之一需要将相同的代码替换 30 次)。 -
@SJuan76 感谢您的评论,我会记住的。在过去(2 年前),我不得不向完全以这种方式设计的应用程序添加新功能。我必须修改至少 10 个接口/类来添加一个微不足道的功能。我讨厌制作所有这些界面的人,但现在我处于同样的境地,我正努力避免在脚下开枪。