大きな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ステートメントがコンパイル時に固定されている間に、ランタイムで任意の要求を登録できることです。