Java 这是DAO管理器模式吗?什么是合适的类和接口名称?
我有一个接口,Java 这是DAO管理器模式吗?什么是合适的类和接口名称?,java,oop,design-patterns,Java,Oop,Design Patterns,我有一个接口,SomethingDao,还有一个实现类,SomethingDaoImpl。该接口仅由11个方法组成,但每个方法都需要一个或多个复杂的SQL查询 我将实现类分为几个较小的类,让我们称它们为Helper1,Helper2,Helper3帮助者因为没有更好的名字。SomethingDaoImpl每个都有一个实例,并将方法调用路由到每个实例 public class SomethingDaoImpl implements SomethingDao { private Helper
SomethingDao
,还有一个实现类,SomethingDaoImpl
。该接口仅由11个方法组成,但每个方法都需要一个或多个复杂的SQL查询
我将实现类分为几个较小的类,让我们称它们为Helper1
,Helper2
,Helper3
<代码>帮助者因为没有更好的名字。SomethingDaoImpl
每个都有一个实例,并将方法调用路由到每个实例
public class SomethingDaoImpl implements SomethingDao {
private Helper1 helper1;
private Helper2 helper2;
private Helper3 helper3;
// ...
private Helper8 helper8;
public List<X> getX(...) {
return helper1.getX();
}
public List<Y> getY(...) {
return helper2.getY();
}
public List<X> getDetailedX(...) {
List<X> ds = getX(...);
helper6.addTo(ds);
helper7.addTo(ds);
helper8.addTo(ds);
return ds;
}
}
public类SomethingDaoImpl实现SomethingDao{
私人佣工1名佣工1名;
私人佣工2名佣工2名;
私人佣工3名佣工3名;
// ...
私人佣工8名佣工8名;
公共列表getX(…){
return helper1.getX();
}
公共列表getY(…){
return helper2.getY();
}
公共列表getDetailedX(…){
列表ds=getX(…);
助手6.添加到(ds);
助手7.添加到(ds);
助手8.添加到(ds);
返回ds;
}
}
这种技术有名字吗?一个复杂的刀有几个“工蜂”为它做所有的工作,而它只是管理它们
它仅仅是DAO管理器模式,其中Helper1、Helper2、Helper3是DAO对象吗?我对正确的命名约定感兴趣,因此在本例中,我将SomethingDaoImpl
重命名为SomethingDaoManager
,而Helper
将成为HelperDao
我还看到了“服务”这个名称的使用,在这种情况下,SomethingDao
接口将被重命名为SomethingService
,工蜂类将在其名称的末尾携带DAO
谢谢。。。我想我只是在寻找与此场景相关的命名约定和设计模式。我希望实现尽可能清晰,并且有一些名称表明我正在使用的模式将非常有用。我认为代码是“坏代码”模式,更确切地说是紧耦合代码。8个帮手是很多,这显然是一个糟糕的设计对象。我知道这是java,可能你没有像c#扩展这样的方法,这些方法非常适合帮助者,所以我认为正确的方法是通过DI容器使用依赖注入 每个需要DAO或服务的对象都会将它们作为抽象依赖项,主要是构造函数参数
public class MyObject
{
public MyObject(ISomeService serv,IRepository repo){}
}
关键是,如果只使用与上下文相关的对象,代码会将这些对象作为依赖项。我很怀疑你可能需要8个帮手。如果是这样的话,那么代码就太多了,需要重新设计。如果DAO类中只有11个方法,那么很奇怪,需要这么多帮助器类来实现它们 问题是,为什么SQL查询如此复杂 确保数据库/数据源中的每个实体/表都有一个不同的DAO接口/类。 这将帮助您拥有更简单的DAO类并减少紧耦合 更新
正如你在评论中所写的,我认为把你的<代码> SomethingDao <代码>作为一个复杂逻辑的外观界面是比较正确的。(对此非常清楚)
因此,您可以为每个实体创建不同的DAO,并在SomethingDaoImpl
中使用这些类,实现facade接口
如果你想遵循某种命名约定,你可以在
somethingfaceadeimpl
和SomethingFacadeImpl中简单地重命名你的类。我同意@MikeSW,似乎“DAO”做了太多的事情。它访问了多少个表?DAO接口(已经存在,我正在维护实现)可能访问15到20个表。原因是每个方法都规范化了来自多个源的数据,这意味着每个方法平均查询4到5个表。为什么我觉得DAO“管理器”是存储库模式,实现得非常糟糕?接口本来应该是针对单个DAO的,但是。。。考虑到接口的任何实现都需要访问15-20个表,返回10个不同数据结构的实例,这只是一个设计拙劣的概念。。。然而,很多应用程序都使用它,我认为正确的解决方案是将我的实现变成一个facade,它使用几个(8个左右)DAO。但仍然存在命名问题。我们可能需要进行重构,将其命名为SomethingService
,以及SomethingServiceImpl
。您需要的名称是Repository