2013-01-15 87 views
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(); 

...等我結束了一個巨大的醜陋類

+1

你有一些代碼可以分享嗎? – Hitman47

+0

代碼是這樣 如果(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

你可以避免「if」的一種方法是使用switch語句,它使你的代碼更加清潔 – Hitman47

回答

1

始終避免大的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語句在編譯時固定。