滥用关闭?违反各种原则?还是好吗?
编辑:修复了几个语法和一致性问题,使代码更加明显,接近我实际做的事情。
我有一些看起来像这样的代码:
SomeClass someClass;
var finalResult =
DoSomething(() =>
{
var result = SomeThingHappensHere();
someClass = result.Data;
return result;
})
.DoSomething(() => return SomeOtherThingHappensHere(someClass))
.DoSomething(() => return AndYetAnotherThing())
.DoSomething(() => return AndOneMoreThing(someClass))
.Result;
HandleTheFinalResultHere(finalResult);
其中DoSomething
方法是一个扩展方法,它期望传递给它的Func。因此,每个DoSomething => lambda中的每个方法调用都返回一个Result类型。
这类似于一个可能的monad。除了检查空值,我检查Result类的状态,并调用传递给DoSomething的Func或返回前一个Result而不调用Func
我面临的问题是希望在我的代码中使用这种组合,但我还需要能够将一个组合调用结果中的数据传递给另一个调用结果,如you2ѭ变量所示。
我的问题不是这在技术上是否正确......我知道这是有效的,因为我现在正在这样做。我的问题是这是否是滥用闭包,命令查询分离或任何其他原则......然后询问有什么更好的模式来处理这种情况,因为我很确定我是现在,这种类型的代码陷入了“闪亮的新锤子”模式。
没有找到相关结果
已邀请:
3 个回复
赣借
使用LINQ to Results,首先执行
。如果成功,它将获得结果的
属性的值并执行
。如果成功,则执行
,依此类推。 如您所见,您可以轻松地链接操作并参考先前操作的结果。每个操作将一个接一个地执行,并且在遇到错误时执行将停止。 每行的
位有点吵,但IMO没有任何相当的复杂性会比这更具可读性! 我们如何使这项工作? C#中的Monads由三部分组成: 类型Something-of-T,
/
扩展方法,和 将T转换为T的Something的方法。 你需要做的就是创造一个看起来像Monad的东西,感觉像Monad,闻起来像Monad,一切都会自动运行。 LINQ to Results的类型和方法如下。 结果< T>类型: 一个表示结果的简单类。结果是类型T的值或错误。结果可以从T或Exception构造。
扩展方法:
和
方法的实现。方法签名在C#规范中给出,因此您需要担心的是它们的实现。如果您尝试以有意义的方式组合所有方法参数,这些很自然。
您可以自由修改结果< T>例如,类和扩展方法,以实现更复杂的规则。只有扩展方法的签名必须完全符合规定。
场竟矩喘崩
来使其成为一个合适的monad,有一些方法来设置要传入的初始
值,并且让
将一个的返回值作为下一个的参数传递 - 这将使链接显式而不是依赖于词法范围的共享状态。
烷刨画颠离