相关疑难解决方法(0)

记录,面向方面编程和依赖注入 - 试图理解这一切

我知道日志记录是AOP的主要用例.此外,日志记录包装器也可以作为您希望使用DI的示例,以便类不与特定的日志记录实现相结合.但是,有些人认为日志包装器是一种反模式.首先,这样的视图是因为在大多数情况下,包装器往往是简单的并且删除了特定于日志框架的许多特征.如果您实现这些特定功能,为什么不直接使用框架.

我知道Common.Logging外观试图为您提取log4Net,EntLib,NLog的大量功能.但是,即使在这里,我们仍然依赖于Common.Logging.不是关于接口等的代码/单元测试方式,但如果项目死亡(自上次发布以来已超过一年)或者您希望后者切换到不支持的记录器,则可能导致问题.

也就是说,如果通过AOP实现日志记录,是否有必要使用DI作为日志记录依赖项(即为什么不直接引用说NLog)?是的,AOP部分代码将紧密耦合,但是想要进行单元测试的类的逻辑缺乏记录依赖性(至少在编织发生之前).在这一点上,我有点迷失(我还没有尝试过AOP).编织后,没有使用DI作为AOP代码会导致单元测试被测方法的问题吗?或者可以在不编织AOP代码的情况下测试一个单元吗?

除非日志记录是软件用户的要求,否则我不确定测试日志是否与模拟有关是多么有用.我认为被测方法的业务逻辑是大多数人对测试感兴趣的东西.最后,如果想要使用TDD/BDD,是否必须在AOP代码中使用DI来记录日志依赖?或者只是不测试驱动 AOP方面的东西?

正如您所看到的,我正在尝试了解最实用的方法是开发一个应用程序,该应用程序将AOP用于横切关注点,DI用于设计/测试.由于AOP相对较新,而日志记录是最常见的例子,推荐的方法是什么?

.net logging aop unit-testing dependency-injection

33
推荐指数
1
解决办法
1万
查看次数

如何避免多次迭代作为模式?

在函数式语言中(使用F#),我正在努力在功能组合的优点与单一责任之间找到平衡,并在序列上获得单次迭代的性能.实现两者的任何代码模式建议/示例?

我没有扎实的计算理论背景,我一遍又一遍地遇到这种一般模式:迭代一个集合,想要在迭代时做副作用,以避免在同一个集合或其结果集上进一步迭代.

一个典型的例子是"减少"或"过滤"功能:过滤时有很多次我希望根据过滤器的结果采取额外的步骤,但我想避免过滤结果的第二次枚举.

我们将输入验证作为一个简单的问题陈述:

  1. 命名输入数组
  2. 管道传输到"isValid"功能过滤器
  3. 副作用:记录无效的输入名称
  4. 管道有效输入以进一步执行

问题示例

在F#中,我可能最初写道:

inputs
// how to log invalid or other side-effects without messing up isValid??
|> Seq.filter isValid
|> execution
Run Code Online (Sandbox Code Playgroud)

解决方案示例#1

有了内联副作用,我需要这样的东西:

inputs
|> Seq.filter (fun (name,value) -> 
    let valid = isValid (name,value)
    // side-effect
    if not valid then
        printfn "Invalid argument %s" name
    valid
|> execution
Run Code Online (Sandbox Code Playgroud)

解决方案示例#2

我可以使用元组进行更纯粹的关注点分离,但需要第二次迭代:

let validationResults =
    inputs
    // initial iteration
    |> Seq.filter (fun (name,value) -> 
        let valid = isValid (name,value)
        (name,value,valid)
    |> execution

// one example …
Run Code Online (Sandbox Code Playgroud)

theory f# functional-programming

4
推荐指数
1
解决办法
237
查看次数