我有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();
依此类推......我最终得到了一个巨大的丑陋课程
答案 0 :(得分:1)
总是避免大IF或SWITCH,它非常难以理解且难以维护。 OOP中的多态性可以解决这个问题。至于您的问题, command pattern 可能有所帮助。示例代码可以是:
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方式,添加新类型请求的唯一方法是修改这些中断Open/Closed Principle的IF / SWITCH语句。如您所见,这个问题已通过引入多态来解决。我的提议的另一个好处是你可以在运行时注册任何请求,而IF / SWITCH语句在编译时是固定的。