我正在创建一个CommonDaoOperations
包含几个通用方法的实用程序类:Create
, Update
, Delete
. 这不是基类,因为一些 DAO 更复杂,不能使用这些泛型方法,但许多 DAO 可以。
我现在正在考虑该实用程序类应该是什么样子:
- 只有静态泛型方法的静态类
- 具有通用方法的常规类,每个 DAO 作为私有只读成员创建一次
- 具有泛型方法的常规类,每个 DAO 方法创建一次(在每次调用中)
为每个 DAO / 方法创建一个类的实例显然比调用静态方法的成本更高,但我很确定这些成本在几乎任何应用程序中都可以忽略不计。
我倾向于解决方案 2 或 3,因为非静态类的好处(接口,可以模拟,可以派生/增强,如果有必要,将来可以通过构造函数收集参数(与 10 参数相比)静态类中的方法))。
所以我想真正的问题是:我应该将我的实用程序类创建为成员变量,还是按照 DAO 方法实例化它?
public void Create(User user) {
new CommonDaoOperations().Create(user);
}
public void Delete(User user) {
var daoOps = new CommonDaoOperations();
daoOps.CheckSomething(); // just an example of multiple calls to the class
daoOps.Delete(user);
}
我很想听听其他开发人员对这些方法的看法,或者是否还有另一种/更好的方法来做到这一点。
编辑
刚刚意识到我应该更多地考虑方法#3 - 正如 Vadim 指出的那样,在每个方法中实例化具体类时替换具体类会很麻烦,但我可以在属性中考虑到这一点:
private CommonDaoOperations DaoOps {
get { return new CommonDaoOperations(); }
}
public void Create(User user) {
DaoOps.Create(user);
}
我相信这比上面的代码片段更易于维护,但是知道我在我的 DAO 中为“实用程序”类引入了一个属性,这本身可能是一种代码味道(正如 Ant P 指出的那样)。
概括
这是一个艰难的决定——虽然我接受了 Ant P 的回答,但 Vadim 的回答也是合理的。使用哪种方法取决于实用程序类,所有 3 种方法都有其用途(更新的 #3 除外)。至少这是我对提供的答案的看法。
- 静态类确实有它们的用途,但也有许多上面简要提到的缺点。
- 常规类,按方法实例化:实用程序类在需要的地方创建和使用。减少依赖,保持你的类型纯净。
- 常规类,实例化为成员:当许多/所有方法需要实用程序类的实例时,创建成员变量可能是一个更好的主意。通过这种方式更改类型或实例化方式变得更加容易。