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...

如果这些请求有一些共同的代码,您可以进一步将它们分解为一个抽象基类(从其继承),或者更好地分解为一个新的创建类(由其组成)。

采用IF/SWITCH方式,添加新类型请求的唯一方法就是修改这些IF/SWITCH语句,打破了Open/Closed Principle。如您所见,这个问题已经通过引入多态性得到解决。我的提议的另一个好处是你可以在运行时注册任何请求,而 IF/SWITCH 语句在编译时是固定的。

于 2013-01-15T06:10:31.147 回答