【发布时间】:2016-03-23 12:21:58
【问题描述】:
嗨,我正在写project,而我现在正在做的部分正在快速膨胀。如何删除这个嵌套的 if 语句,但仍然具有相同的行为?
如果生成的代码简洁,并且不需要额外的本地标志,那就太好了。下面的代码现在可能看起来不那么糟糕了,但是我正计划编写更多方法,直到 T16,你可以想象这些嵌套的 if 语句会变得多么糟糕。
using ContainerExpressions.Containers;
using System;
namespace ContainerExpressions.Expressions.Core
{
internal static class Compose
{
public static Response<T> Evaluate<T>(Func<Response<T>> func) => func();
public static Response<TResult> Evaluate<T1, TResult>(Func<Response<T1>> func1, Func<T1, Response<TResult>> funcResult)
{
var response = new Response<TResult>();
var result = func1();
if (result)
{
response = response.WithValue(funcResult(result));
}
return response;
}
public static Response<TResult> Evaluate<T1, T2, TResult>(Func<Response<T1>> func1, Func<T1, Response<T2>> func2, Func<T2, Response<TResult>> funcResult)
{
var response = new Response<TResult>();
var result1 = func1();
if (result1)
{
var result2 = func2(result1);
if (result2)
{
response = response.WithValue(funcResult(result2));
}
}
return response;
}
public static Response<TResult> Evaluate<T1, T2, T3, TResult>(Func<Response<T1>> func1, Func<T1, Response<T2>> func2, Func<T2, Response<T3>> func3, Func<T3, Response<TResult>> funcResult)
{
var response = new Response<TResult>();
var result1 = func1();
if (result1)
{
var result2 = func2(result1);
if (result2)
{
var result3 = func3(result2);
if (result3)
{
response = response.WithValue(funcResult(result3));
}
}
}
return response;
}
}
}
我最终创建的代码
根据我在这里恢复的建议,我得到了代码膨胀,现在看起来如下:
using ContainerExpressions.Containers;
using System;
using System.Runtime.CompilerServices;
namespace ContainerExpressions.Expressions.Core
{
internal static class Compose
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Response<TResult> Evaluate<T1, TResult>(Func<Response<T1>> func1, Func<T1, Response<TResult>> funcResult)
{
var result = func1();
return result ? funcResult(result) : Response.Create<TResult>();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Response<TResult> Evaluate<T1, T2, TResult>(Func<Response<T1>> func1, Func<T1, Response<T2>> func2, Func<T2, Response<TResult>> funcResult)
{
var result = func1();
return result ? Evaluate(() => func2(result), funcResult) : Response.Create<TResult>();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Response<TResult> Evaluate<T1, T2, T3, TResult>(Func<Response<T1>> func1, Func<T1, Response<T2>> func2, Func<T2, Response<T3>> func3, Func<T3, Response<TResult>> funcResult)
{
var result = func1();
return result ? Evaluate(() => func2(result), func3, funcResult) : Response.Create<TResult>();
}
}
}
【问题讨论】:
-
我投票结束这个问题,因为它属于CodeReview
-
您的链接指向了错误的网站。这是codereview.stackexchange.com :)
-
好的,如果这个问题不属于这个网站,我会移动它here。
标签: c#