2017-07-02 2 views
1

繰り返しを避けるために、これらのメソッドをより機能的なスタイルで結合/マージ/短縮するにはどうすればよいですか?これは、あなたが、単一のオーバーロードされたメソッドを使用することができます繰り返しを避けるために構造的に類似のメソッドをマージする

public static Task<T> GetAsyncHandler(string urlFormat, params object[] args) 
{ 
    string url = string.Format(urlFormat, args); 
    return Task<T>.Run(() => { return GetAsyncHandlerForRestApi(url)}); 
} 

:あなたは、引数としてジェネリック型、URL形式とオブジェクトのPARAMの配列を受け取るメソッドを作成して、オーバーロードすることができます

public Task<List<UsageSummaryModel>> GetBilledUsageSummary(int accountId, string billingRunId) 
     { 
      var url = string.Format("{0}{1}/{2}/usage", BaseUrl, accountId, billingRunId); 
      return GetAsyncHandlerForRestApi<List<UsageSummaryModel>>(url); 
     } 

     public Task<GetSampleInvoiceRunIdResponse> GetUnBilledUsageSampleRunId(int accountId) 
     { 
      var url = string.Format("{0}{1}/sample?usageonly=true", BaseUrl, accountId); 
      return GetAsyncHandlerForRestApi<GetSampleInvoiceRunIdResponse>(url); 
     } 

     public Task<List<UsageSummaryModel>> GetUnBilledUsageSummary(int accountId, int sampleRunId) 
     { 
      var url = string.Format("{0}{1}/sample/{2}/usage", BaseUrl, accountId, sampleRunId); 
      return GetAsyncHandlerForRestApi<List<UsageSummaryModel>>(url); 
     } 


     public Task<List<CallDetailsRecordModel>> GetBilledCallDetailRecords(int accountId, int billingRunId, int cdrSummaryId, int page, int pageSize) 
     { 
      var url = string.Empty; 

      if (page == -1 && pageSize == -1)//load all records 
      { 
       url = string.Format("{0}{1}/{2}/usage/{3}", BaseUrl, accountId, billingRunId, cdrSummaryId); 
      } 
      else 
      { 
       url = string.Format("{0}{1}/{2}/usage/{3}?page={4}&pageSize={5}", BaseUrl, accountId, billingRunId, cdrSummaryId, page, pageSize); 
      } 

      return GetAsyncHandlerForRestApi<List<CallDetailsRecordModel>>(url); 
     } 

     public Task<List<CallDetailsRecordModel>> GetUnBilledCallDetailRecords(int accountId, int sampleRunId, int cdrSummaryId, int page, int pageSize) 
     { 
      var url = string.Empty; 

      if (page == -1 && pageSize == -1)//load all records 
      { 
       url = string.Format("{0}/{1}/SAMPLE/{2}/usage/{3}", BaseUrl, accountId, sampleRunId, cdrSummaryId); 
      } 
      else 
      { 
       url = string.Format("{0}/{1}/SAMPLE/{2}/usage/{3}?page={4}&pageSize={5}", BaseUrl, accountId, sampleRunId, cdrSummaryId, page, pageSize); 
      } 

      return GetAsyncHandlerForRestApi<List<CallDetailsRecordModel>>(url); 
     } 
+0

'int billingRunId'と' string billingRunId'の理由はありますか? –

+0

はい、ただし、わかりやすくするため、どちらか一方のデータタイプを保持しています –

+0

コードレビューに含まれているため、この質問を閉じるトピックに投票していますstackexchange –

答えて

2

ハンドラを生成します。

たとえば、あなたはそれをクラス AsyncHandler<T>でGetAsyncHandlerForRestApiメソッドを定義

を定義することができます。

public class AsyncHandler<T> 
{ 
    private string url; 

    public AsyncHandler(string url) 
    { 
     this.url = url; 
    } 
    public static AsyncHandler<T> GetAsyncHandlerForRestApi(string url) 
    { 
     return new AsyncHandler<T>(url); 
    } 
    public static Task<T> GetAsyncHandler(string urlFormat, params object[] args) 
    { 
     string url = string.Format(urlFormat, args); 
     return Task<T>.Run(() => { return GetAsyncHandlerForRestApi(url)}); 
    } 
} 

あなたは、あなたが希望このどこかのようなメソッドを呼び出すことができます。

string endPointFormat = BaseUrl + "{0}{1}/sample?usageonly=true"; 
Task<List<UsageSummaryModel>> result = AsyncHandler<List<UsageSummaryModel>>.GetAsyncHandler(endPointFormat, accountId); 

まだあなた場合別々のメソッドを定義したい場合は、次のように定義します。

public Task<List<UsageSummaryModel>> GetBilledUsageSummary(int accountId, string billingRunId) 
    { 
     string endPointFormat= BaseUrl + "{0}{1}/{2}/usage"; 
     return AsyncHandler<List<UsageSummaryModel>>.GetAsyncHandler(endPointFormat, accountId, billingRunId); 
    } 

    public Task<List<UsageSummaryModel>> GetUnBilledUsageSampleRunId(int accountId) 
    { 
     string endPointFormat = BaseUrl + "{0}{1}/sample?usageonly=true"; 
     return AsyncHandler<List<UsageSummaryModel>>.GetAsyncHandler(endPointFormat, accountId); 
    } 

GetAsyncHandlerのパラメータとしてstring urlFormat, params object[] argsを使用する代わりに、エンドポイントを構築するクラスを定義できます(例:EndPointBuilder)。

あなたはたとえば public string BuildUrl()のために、方法の内側にあなたのためのエンドポイントのURLを構築するために工場のデザインパターンを使用して、例えば EndPointBuilder

GetAsyncHandlerに渡すことができ

public static Task<T> GetAsyncHandler(EndPointBuilder builder) 
{ 
    string url = BuildUrl.BuildUrl(); 
    return Task<T>.Run(() => { return GetAsyncHandlerForRestApi(url)}); 
} 

あなたが設計することができますEndPointBuilderしかし、あなたはあなたのサービスコールに必要なURLを構築する世話をしたいと思います。

+0

非常にクール!どうもありがとうございました。より高次の関数/クロージャを使用してこれを作成することには何らかのポイントがありますか? –

+0

あなたが望むなら、もちろんそれを行うことができます。たとえば、関数をGetAsyncHandlerに渡してURLを作成することができます。 –

関連する問題