Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免大型if语句?_C#_Oop_Design Patterns_Command Pattern - Fatal编程技术网

C# 如何避免大型if语句?

C# 如何避免大型if语句?,c#,oop,design-patterns,command-pattern,C#,Oop,Design Patterns,Command Pattern,我确信有一种更糟糕的方法可以做到这一点,但我不确定如何做到。 我有不同的“报告”对象(例如Report1、Report2、Report3等)。 我有一个服务对象,它将这些报表对象作为方法中的两个参数。 在该方法中,我有一个很大的if-else块语句,用于确定已将哪两个报表对象传递到该方法中。这个逻辑似乎不是面向对象的,难道没有更好的方法来确定我传入了哪两个报告,然后为这两个报告提供正确的逻辑,这样我就不会有一个if-else块失控,最终超过100行吗?命令模式在这里是否工作得很好,或者是否有更好

我确信有一种更糟糕的方法可以做到这一点,但我不确定如何做到。 我有不同的“报告”对象(例如Report1、Report2、Report3等)。 我有一个服务对象,它将这些报表对象作为方法中的两个参数。 在该方法中,我有一个很大的if-else块语句,用于确定已将哪两个报表对象传递到该方法中。这个逻辑似乎不是面向对象的,难道没有更好的方法来确定我传入了哪两个报告,然后为这两个报告提供正确的逻辑,这样我就不会有一个if-else块失控,最终超过100行吗?命令模式在这里是否工作得很好,或者是否有更好的更以对象为中心的模式

Report1 r1 = new Report1();
Report2 r2 = new Report2();
Report3 r3 = new Report3();
Report4 r4 = new Report4();
etc...

SomeServiceObject serviceObj = new SomeServiceObject();
var returnedData1 = serviceObj.GetReportLogic(r1, r2);
var returnedData2 = serviceObj.GetReportLogic(r1, r3);
var returnedData3 = serviceObj.GetReportLogic(r3, r4);
etc..

public GetReportLogic(object someReport1, object someReport2)
{
    if ((someReport1 as Report1) and (someReport2 as Report1))
    {
        DoSomething();
    }
    else if ((someReport1 as Report1) and (someReport2 as Report2))
    {
        DoSomethingElse();
    }
    else if ((someReport1 as Report1) and (someReport2 as Report3))
    {
        DoSomethingElseAgain();
    }
    etc...
}
好的,我的C#有点生锈了,但是你不能使用方法重载来实现这一点吗?即定义 多种方法

public GetReportLogic(Report1 someReport1, Report1 someReport2)
public GetReportLogic(Report1 someReport1, Report2 someReport2)
public GetReportLogic(Report2 someReport1, Report2 someReport2)

针对不同的参数使用不同的实现

您还可以在报表类中定义一个名为combine(Report r)的方法,然后每个报表定义它与其他不同报表组合的方式。

如果适合您,请检查(元代码):

使用方法如下:

public GetReportLogic(object someReport1, object someReport2)
{
    var chain = new ChainOfResponsibility(typeof(Report1), typeof(Report1), DoSomething)
                    .SetNext(typeof(Report1), typeof(Report2), DoSomethingElse)
                    .SetNext(typeof(Report1), typeof(Report3), DoSomethingElseAgain);

    chain.Execute(someReport1, someReport2);
}

我为您提供的代码编写了模式的变体。可以根据您的实际需要对其进行调整。

假设报告从一个公共父级导入,为什么不使用一个方法,例如
getReportNumber()
,以便报告可以告诉您正在处理哪些报告?
如果((someReport1作为Report1)和(someReport2作为Report1))
?这甚至不需要编译if((someReport1是Report1)和(someReport2是Report1))看看责任链,这个示例中的大部分是seudo代码,以显示我的point@user1186050这就是为什么你不应该用伪代码来回答这样的问题的原因之一。你基本上是让我们猜你到底是什么意思。
public GetReportLogic(object someReport1, object someReport2)
{
    var chain = new ChainOfResponsibility(typeof(Report1), typeof(Report1), DoSomething)
                    .SetNext(typeof(Report1), typeof(Report2), DoSomethingElse)
                    .SetNext(typeof(Report1), typeof(Report3), DoSomethingElseAgain);

    chain.Execute(someReport1, someReport2);
}