1

私は50以上のタイプのリクエストを持っており、それぞれに料金計算を行うためのパラメータがあります(たとえば、タイプXの料金のリクエストはエリア*以前の送信の数によって計算されます)私が行ったことは、リクエストのタイプをチェックしてから別のクラスを呼び出す大きなIFでしたタイプごとに料金を計算する方法があります。これを行うためのよりクリーンな方法が必要です、何か提案はありますか?

if(mySubmittal.Name == Label.STS_zadc_01) 
myTempRequest.Fees__C = myFeeCalculator.LandDemarcationRequestFees(myTempRequest.Number_of_Points__c) ;
else if(mySubmittal.Name == Label.STS_zadc_02)
myTempRequest.Fees__C = myFeeCalculator.RequestForSiteServicesInformation(); 

など...私は巨大な醜いクラスになってしまいました

4

1 に答える 1

1

大きなIFやSWITCHは常に避けてください。非常に読みにくく、保守が困難です。OOPのポリモーフィズムはその治療法です。あなたの問題に関しては、コマンドパターンが役立つかもしれません。サンプルコードは次のとおりです。

public interface IRequest
{
    void Execute();
}

public class RequestManager
{
    private Dictionary<string, IRequest> requests = new Dictionary<string, IRequest>();

    // register a request by its unique label/name
    public void RegisterRequest(string name, IRequest request)
    {
        requests.Add(name, request);
    }

    // execute a request according to its label/name
    // thanks to polymorphism, no IF/SWITCH any more
    public void ExecuteRequest(String name)
    {
        requests[name].Execute();
    }   
}


public class LandDemarcationRequest : IRequest
{
    private FeeCalculator myFeeCalculator;
    private Request myTempRequest;

    public LandDemarcationRequest(...)
    {
        //initialization ...
    }

    public void Execute()
    {
        myTempRequest.Fees__C = 
            myFeeCalculator.LandDemarcationRequestFees(myTempRequest.Number_of_Points__c);
       // more code...
    }
}

public class SiteServicesInformationRequest : IRequest {
    // similar to the above...
}

// more requests...

これらのリクエストにいくつかの共通コードがある場合は、それらをさらに抽象基本クラス(継承元)に、またはより適切には新しいconcreateクラス(構成対象)に分解できます。

IF / SWITCHの方法を採用することにより、新しいタイプの要求を追加する唯一の方法は、これらのIF / SWITCHステートメントを変更することです。これは、 Open /ClosedPrincipleに違反します。ご覧のとおり、この問題はポリモーフィズムの導入によって解決されました。私の提案の他の利点は、IF / SWITCHステートメントがコンパイル時に固定されている間に、ランタイムで任意の要求を登録できることです。

于 2013-01-15T06:10:31.147 に答える