4

これを行うためのもっとオブジェクト指向の方法があると確信していますが、その方法はわかりません。さまざまな「レポート」オブジェクトがあります (例: Report1、Report2、Report3 など)。これらのレポート オブジェクトをメソッドの 2 つの引数として受け取るサービス オブジェクトがあります。メソッドには、どの 2 つのレポート オブジェクトがメソッドに渡されたかを判断する大きな if else ブロック ステートメントがあります。このロジックは OO ではないようです。渡された 2 つのレポートを特定し、それら 2 つのレポートに正しいロジックを提供するためのより良い方法はありませんか?制御し、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...
}
4

2 に答える 2

8

OK、私の C# は少しさびていますが、メソッドのオーバーロードを使用してこれを達成することはできませんか? つまり、複数のメソッドを定義します

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

...

異なる引数に対して異なる実装を使用しますか?

Report クラスで定義された、たとえば、combine(Report r) と呼ばれるメソッドを持つこともできます。その後、各 Report は、他のさまざまなレポートと組み合わせる方法を定義します。

于 2013-06-16T02:12:08.840 に答える
0

責任の連鎖パターンがあなたに合っているかどうかを確認してください(メタコード):

public class ChainOfResponsibility
{
    ChainOfResponsibility _next;
    Type _t1;
    Type _t2;
    Action _action;

    public ChainOfResponsibility(Type t1, Type t2, Action action)
    {
        _t1 = t1;
        _t2 = t2;
        _action = action;
    }

    public void Execute(object o1, object o2)
    {
        if(CriteriaMatches(o1, o2))
        {
            _action();
            return;
        }

        if(_next != null)
            _next.Execute(o1,o2);
    }

    public ChainOfResponsibility SetNext(Type t1, Type t2, Action action)
    {
        _next = new ChainOfResponsibility(t1,t2,action);
        return _next;
    }

    private bool CriteriaMatches(object o1, object o2)
    {
        return (o1 as t1) and (o2 as t2);
    }
}

使用法は次のようになります。

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);
}

あなたが提供したコードのパターンのバリエーションを書きました。実際のニーズに合わせて自由に調整してください。

于 2013-06-18T12:05:52.693 に答える