如何避免大if语句?

use*_*050 4 c# oop design-patterns command-pattern

我确信有更多OO方式可以做到这一点,但我不确定如何.我有不同的"报告"对象(例如Report1,Report2,Report3等).我有一个服务对象,它将这些报表对象作为方法中的两个参数.在方法中,我有一个大的if else块语句,用于确定哪两个报表对象已传递给方法.这个逻辑似乎不是OO,没有更好的方法来确定我传入哪两个报告,然后为这两个报告提供正确的逻辑,所以我没有一个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...
}
Run Code Online (Sandbox Code Playgroud)

MK.*_*MK. 8

好吧,我的C#有点生疏,但是你不能用方法重载来实现这个目的吗?即定义多种方法

public GetReportLogic(Report1 someReport1, Report1 someReport2)
public GetReportLogic(Report1 someReport1, Report2 someReport2)
public GetReportLogic(Report2 someReport1, Report2 someReport2)
Run Code Online (Sandbox Code Playgroud)

...

不同的参数不同的实现?

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