始終避免大的IF或交換機上,這是非常不可讀而且很難維護。 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方式,添加新類型請求的唯一方法是修改這些IF/SWITCH語句,該語句打破Open/Closed Principle。正如你所看到的,這個問題已經通過引入多態來解決。我的建議的另一個好處是,您可以在運行時註冊任何請求,而IF/SWITCH語句在編譯時固定。
你有一些代碼可以分享嗎? – Hitman47
代碼是這樣 如果(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(); 等等...... –
你可以避免「if」的一種方法是使用switch語句,它使你的代碼更加清潔 – Hitman47