- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在看书Adaptive Code via C# ,作者 Gary McLean Hall 说:
[Logging, and Transactional Code,] is laborious and error-prone, and it instantly pollutes every method with irrelevant boilerplate code, increasing the noise-to-signal ratio. Instead, you can factor out such cross-cutting concerns into encapsulated functionality and apply them to the code in a much less invasive fashion. The most common way of adding functionality non-invasively is through aspect-oriented programming.
对于这段代码:
public void OpenNewAccount(Guid ownerID, string accountName, decimal openingBalance)
{
log.WriteInfo("Creating new account for owner {0} with name '{1}' and an opening balance of {2}", ownerID, accountName, openingBalance");
using(var transaction = session.BeginTransaction())
{
var user = userRepository.GetByID(ownerID);
user.CreateAccount(accountName);
var account = user.FindAccount(accountName);
account.SetBalance(opening Balance);
transaction.Commit();
}
}
我知道它很费力,而且它会做方法名称未指明的事情,例如日志记录,但我不明白为什么它容易出错。可能是因为您经常重复自己的话?
他的建议是改用这段代码:
[Logged]
[Transactional]
public void OpenNewAccount(Guid ownerID, string accountName, decimal openingBalance)
{
var user = userRepository.GetByID(ownerID);
user.CreateAccount(accountName);
var account = user.FindAccount(accountName);
account.SetBalance(opening Balance);
}
但如果您只是简单地寻找一个通用的记录器,那么您可以调用类似_log.Log()
的方法,这相对来说是相同的工作量。除非属性具有检查方法实现的能力,否则在这种情况下我看不出它们有多大值(value),只是它们提供了稍微更具描述性的代码。
最佳答案
取cross-cutting concern日志记录示例。这被认为是横切,因为日志记录策略会影响记录系统的每个部分(至少它必须考虑到这一点)。在这方面,系统的每个部分都需要考虑一些事情,这意味着更改日志记录意味着您可能必须更改系统记录的每个部分,(例如添加更多相关信息)。 (此外,如果您忘记记录重要的内容,您可以称之为容易出错)。在实践中,日志记录通常是良性的,因此它是一个乏善可陈的例子,并且可以称其为容易出错。
我认为一个更好的例子是检查安全性。我不认为看到在各处剪切和粘贴安全代码会很容易出错,而且对该代码的更新可能会变得难以正确。
如果您需要更改安全/权限的实现方式(在非 Aspect 世界中),您(可以想象)需要重新访问每个进行安全检查的地方,因为安全检查分散在整个程序中。复杂的设计使得从设计/维护的角度来看很难考虑所有可能的交互。如果您有 [CheckSecurity] 属性,那么纠缠就会最少,并且永远不需要重新访问需要检查安全性的每个函数。
这里的关键是 Aspects 会根据检查在编译时/运行时更改代码。因此,如果您需要更改检查安全凭证的方式,您只需转到代码中的一个位置。这与仅使用单一方法/函数进行安全检查有很大不同,因为函数无法检查它们的堆栈并根据调用者改变它们的行为。 c# 中的代码注入(inject)可以。
关于c# - 方法中的日志记录以何种方式容易出错且具有侵入性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28910568/
所以我试图让(例如)输入一些值:1 -2 -3 2 5正数的数量是 5 负数的数量是 -3总计为 3 平均值为 0.6我想让它像这样,但是当我运行它时,它不起作用哪一部分是错误的??? import
我编写了一个使用 OpenCV 的 cvCalcOpticalFlowLK 的程序。它在低分辨率网络摄像头输入上表现良好,但我需要在全高清流上运行它,并在对每一帧进行光流分析后进行重要的其他计算。处理
如果我有一个 ruby 脚本 Daemon,顾名思义,它作为守护进程运行,监视系统的各个部分并能够执行需要身份验证的命令,例如更改权限,是否存在一个简单的方法来拥有第二个 ruby 脚本,比如
我们有一个基于 Ant 和 Ivy 的构建管理系统,它基本上由一个共享的 ant 文件和一组围绕目录结构的约定组成。 我试图克服的一个障碍是相当常见的“递归发布”情况。比如说,我们有 5 个内部代码模
我在嵌入式 Linux 环境中遇到了问题。尝试确定它是否可以由应用程序引起。应用程序导致内核崩溃/锁定或终止 init 有多容易? 最佳答案 非根应用程序应该不可能影响任何一个。 以 root 身份运
我目前正在尝试学习 Nim(进展缓慢 - 无法投入太多时间)。另一方面,为了获得一些工作代码,我想对我正在 ruby 中开发的 Nim 应用程序的各个部分进行原型(prototype)设计。 由于
我是一名优秀的程序员,十分优秀!