- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个实用程序类 CommonDaoOperations
,它包含几个通用方法:Create
、Update
、Delete
.这不是基类,因为一些 DAO 更复杂并且不能使用这些通用方法,但许多 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/
我们有一个包含重复用户记录的数据库,我需要根据几个因素选择“最佳”用户: 应先选择具有成员(member)资格的用户,然后再选择没有成员(member)资格的用户 成员(member)有级别,在所有条
不知道为什么 Visual Studio 发出此警告: Access of shared member, constant member, enum member or nested type thr
我有一个数据库设置来注册网站的成员(member)专用区域的成员(member)。我可以使用复选框回显所有注册成员,以便我可以选择从管理页面删除单个成员,但我似乎无法弄清楚如何在单击提交按钮时选择删除
假定前缀一元运算符可以“由不带参数的非静态成员函数或带一个参数的非成员函数实现”(§13.5.1[over.unary]/1),除了适用于任何成员/非成员函数选择的通常封装/代码重用设计原理之外,还有
拥有 struct Person { string name; }; Person* p = ... 假设没有运算符被重载。 哪个更有效(如果有的话)? (*p).name 对比 p->name
进程文件: members-area or members-area.exe 进程名称: 5-1-61-96 进程类别:存在安全风险的进程 英文描述: 
引用资料 http://msdn.microsoft.com/en-us/library/6tc47t75%28v=VS.80%29.aspx http://msdn.microsoft.com/en
这个问题在这里已经有了答案: Is there any reason to use this-> (16 个答案) 关闭 7 年前。 这有什么区别: int MyClass::getId() {
我正在制作一个网站,您需要在其中注册,然后创建一个角色来玩。我如何将注册页面中使用的表格与玩家的表格结合起来,以便玩家始终获得他创建的角色。 我有一个表members,用于存储注册用户以及角色的 ta
我处于困境中,我被委托(delegate)创建一个 PHP Web 应用程序,该应用程序允许一个人注册,然后该用户可以再注册 5 个其他用户,他注册的其他用户也可以每个注册 5 个成员。 我希望创建数
我试图在成员(member)页面上显示一个非常简单的用户名。我已经在 stackoverflow 上搜索过,但使用我发现的内容不起作用。 我使用 HTML 表单指南中非常常见的注册/登录脚本,该脚本使
我正在使用CodeIgniter,我的问题是关于MySQL查询。我有两个表,分别是成员和关系。 成员表 我正在做的是,根据member_type将所有用户添加到成员表中。如果 member_type
我有一个表,用于存储 2 个成员(成员 A 和成员 B)之间的聊天信息。现在,当成员 A 删除他的消息时,我会抛出这样的 sql 请求 $deleting = mysqli_query($connec
from bs4 import BeautifulSoup import requests r = requests.get('http://medicalassociation.in/doctor-
我有两个我无法修改的类,它们都具有完全相同的成员: class Pose1 { public: double x,y; }; class Pose2 { public: d
我正在测试服务器上运行机器人。当前 channel 中有 3 个成员(member_count of 3),但它只返回一个成员。该成员是机器人。 代码: import discord from dis
我有一个对象,我们称之为 o,以及对 o 的引用。 在o范围内,我设置了一个成员,我们称之为m。 所以在 o 中,我调用: o.m = "blah" 在 o 之外,我访问 m: console.log
我正在尝试实现自定义成员(member)资格提供程序并希望更改 GetUser 方法。问题是 GetUser 返回 MembershipUser,而我想返回 MyMembershipUser,它有两个
我的网站有一个推荐给 friend 的按钮。为了鼓励人们使用此功能,我想用积分奖励那些使用它的人(积分将兑换奖品......还不知道)。 好的,所以我有这样的结构: 表单.php 您可以在此处输入 f
我在 MySQL 中有三个表, 组(键:group_id) 成员(键:member_id) group_member_relations 键:group_id, member_id 最后一个表包含 m
我是一名优秀的程序员,十分优秀!