C# 如何转换验证<;字符串,单位>;到';成功是空的吗?
我对函数式编程相当陌生,我尝试在一个非常必要的代码库中工作,所以我尝试编写的代码大部分是FP,但不能完全是FP 我必须为以下方法编写一个重写C# 如何转换验证<;字符串,单位>;到';成功是空的吗?,c#,.net,functional-programming,language-ext,C#,.net,Functional Programming,Language Ext,我对函数式编程相当陌生,我尝试在一个非常必要的代码库中工作,所以我尝试编写的代码大部分是FP,但不能完全是FP 我必须为以下方法编写一个重写 protected override string CreateEntity(XElement xe) …其中xe包含数据库更新所需的两段数据。该方法需要验证xe的内容,然后执行更新,成功时返回“”,否则返回管道分隔的错误列表 我从语言ext测试中得到了一个提示,并编写了一些助手方法,如以下所示(实现与示例非常相似,因此省略了) 我不知道这是否是最好的方
protected override string CreateEntity(XElement xe)
…其中xe
包含数据库更新所需的两段数据。该方法需要验证xe
的内容,然后执行更新,成功时返回“”,否则返回管道分隔的错误列表
我从语言ext测试中得到了一个提示,并编写了一些助手方法,如以下所示(实现与示例非常相似,因此省略了)
我不知道这是否是最好的方法,所以欢迎提出任何建议
我更大的问题是下一步该做什么。下面的作品很管用,但在我看来不是很优雅或优雅
returnvalidation.IsFail
? string.Join(“|”,validation.FailAsEnumerable())
: "";
有更好的方法吗?如果验证失败,您只需抛出一个异常即可。 以后调用代码的人可以对代码应用异常处理
另一个选项是发送错误代码而不是消息。在这种情况下,被调用方可以将每个错误代码转换为特定错误。代码的最后一部分(格式错误)可以这样做:
[事实]
无效测试()
{
验证结果fromdatabase=失败(“错误”);
var-batherror1=string.Join(“|”,resultFromDatabase.FailToSeq());//请使用FailToSeq()将返回空seq的事实来获得成功
var-showError2=string.Join(|),resultFromDatabase.IfSuccess(Seq());//为成功案例显式提供错误类型(Seq)的值
var-batherror3=resultFromDatabase.Match(=>“”,errors=>string.Join(|“”,errors));//仅调用string.Join查找错误
}
以你最喜欢的变体为例。如果希望代码干净/不依赖FailToSeq()实现来处理这两种情况,则应使用Match
或IfSuccess
/IfFail
明确处理这两种情况
如果你想改进你的整体设计(避免不纯的代码),你可能需要改变一些基本的东西。一个(非常灵活的)选择是使用免费的Monad,LanguageExt在这方面取得了进展,但转换传统的OO代码库可能是一个很大的进步。见:
(使用CodeGen的免费Monad)
感谢您的回复,但正如我所说的,我需要覆盖现有的方法,因此无法更改调用代码的功能。我必须返回一个字符串,如果一切正常,该字符串将为空,否则将包含以管道分隔的错误。@avrohmyisroel在这种情况下,您编写的是可以的,如果您确实需要组合返回错误消息,我看不到其他选项。谢谢。我没有任何理由不想使用
FailToSeq()
(有什么理由我应该这么做吗?),这提供了一个简洁的解决方案。我很乐意采用一种非常灵活的方法,但我的工作有一个非常庞大的、非常必要的代码库,而且我的经理也不太热衷于彻底的改变。我也被我的理解力不足所阻碍,尽管随着我的努力,我的理解力越来越强。再次感谢,不客气。采取低挂果实来改进本地代码是完全好的。关于FailToSeq()
:如果您也将其称为“success”,则会增加两个(小)风险:如果LanguageExt中的实现发生更改(例如,在“success”=>异常中不允许此操作),则会导致代码中断。我不认为Paul会改变这一点(但单元测试似乎没有涵盖这一点)。第二个风险是,代码的读者可能想知道在“成功”的情况下(异常与空结果)会发生什么。取决于您的上下文,整体可读性。。。
private Validation<string, int> ValidateRegionID(XElement xe)