gpt4 book ai didi

c# - 实用程序类 : static class vs member variable vs local variable

转载 作者:行者123 更新时间:2023-11-30 14:58:50 26 4
gpt4 key购买 nike

我正在创建一个实用程序类 CommonDaoOperations,它包含几个通用方法:CreateUpdateDelete .这不是基类,因为一些 DAO 更复杂并且不能使用这些通用方法,但许多 DAO 可以。

我现在正在考虑这个实用类应该是什么样子:

  • 只有静态泛型方法的静态类
  • 具有通用方法的常规类,每个 DAO 创建一次作为私有(private)只读成员
  • 具有泛型方法的常规类,每个 DAO 方法创建一次(在每次调用中)

为每个 DAO/方法创建一个类的实例显然比调用静态方法成本更高,但我很确定这些成本在几乎所有应用程序中都可以忽略不计。

我更喜欢解决方案 2 或 3,因为非静态类的好处(接口(interface),可以模拟,可以派生/增强,如果有必要,将来可以通过构造函数收集参数(与 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 除外)。至少这是我对提供的答案的看法。

  • 静态类 确实有其用途,但也有许多上面简要提到的缺点。
  • 常规类,按方法实例化:只在需要的地方创建和使用实用类。减少依赖性,保持你的类型纯净。
  • 常规类,实例化为成员:当许多/所有方法都需要实用程序类的实例时,创建成员变量可能是更好的主意。通过这种方式更改类型或实例化方式变得更加容易。

最佳答案

我会让那些更有资格的人对性能影响发表评论;然而,以下是我对每一个的看法:

<强>1。静态类

这个概念适用于不需要真正可扩展性的简单、“不全面”的实用程序方法,但是 - 正如您自己注意到的那样 - 您的常见 DAO 操作会变得相当复杂。作为单个静态类,这不太可能非常易于管理,尤其是当它用于多种不同类型的 DAO 时。

<强>2。具体类,每个 DAO 对象实例化

这一切都很好,但你真的需要实用程序类成为单个 DAO 的成员吗?如果您在 DAO 的整个生命周期内需要实用程序类中的某种一致性或状态持久性,我可以理解这一点,但这些方法似乎相当模糊(正如其名称“实用程序”类)。

剩下3。具体类,按方法实例化。这对我来说似乎是最自然的解决方案。这使您可以灵活地利用具体类的所有优势,正如您在问题中所承认的那样,同时将对象的范围限制在需要的地方 - 单个方法调用。

您的类是否应该演变成整个 DAO 都需要的东西,例如你突然需要维护对象的状态(或者如果你需要将它注入(inject) DAO 的构造函数,或者类似的其他东西),你总是可以改变它的实例化位置(尽管在我看来,如果发生这种情况,你真的不再有实用程序类了,你需要重新考虑这个类如何适应你的架构。

关于c# - 实用程序类 : static class vs member variable vs local variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17875160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com