4

戻り値の型を使用してメソッドを明確にすることはできないため、戻り値の型だけを変更したい場合にメソッドをオーバーロードする最もクリーンで最良の方法は何ですか? 以下はサンプルコードです。

public static string Get(string url, Guid id, bool logResponse = true, bool baseKey = false)
{
     Tuple<string, int> response = Get(url, id, true, logResponse, baseKey);

     if (response.Item2 > 399)
        return null;
     return response.Item1;
}


public static Tuple<string, int> Get(string url, Guid id, bool returnStatus, bool logResponse = true, bool baseKey = false)
{
    // leaving out lots of code in this method, you should be able to get the point without it
    int http_status;  
    string response = CallApi(url, key, "GET", out http_status);

    return new Tuple<string, int>(response, http_status);
}

上記のコードは機能しますが、目的を果たさない追加のパラメーター ( returnStatus ) があります。コンパイラーが 2 つのメソッドの違いを認識できるようにするためです。これを行うためのより良い方法はありますか、それとも役に立たないパラメーターを追加するだけですか?

4

3 に答える 3

10

メソッドの名前を変更します。

string Get(string url, Guid id, bool logResponse)
Tuple<string, int> GetWithStatus(string url, Guid id, bool logResponse)

プログラミングの主な目的は、コンパイラーに違いを伝えることではなく、コードを読む開発者に違いを伝えることです。out別のオプションは、パラメーターとしてステータスを返すことです。

string Get(string url, Guid id, bool logResponse, out int status)

outパラメータはあまり好きではありませんが、タプルはさらに好きではありません -Item2メソッドを使用する開発者に名前を伝えるものは何ですか? ステータスですか、それとも再試行回数ですか、それとも応答の長さですか? メソッド名も戻り型も、それが何であるかを言うことはできません。

したがって、名前が変更されたメソッドを使用した最初のケ​​ースでも、戻り値の型を次のようなものに変更しました

public class ServerResponse
{
    public string Content { get; set; }
    public HttpStatusCode Status { get; set; } // enum

    // use this in first method to check if request succeed
    public bool IsError
    {
       get { return (int)Status > 399; }
    }
}
于 2013-08-01T22:49:05.393 に答える
2

3 つのオプションが表示されます。

  1. 呼び出し元のメソッドに戻りobject、曖昧さをなくします。
  2. メソッドをジェネリックにしてから、リフレクションを使用して目的の型を検出します。
  3. メソッドの名前を変更します。

私は#3を選びます。それらを「GetOne」と「GetTuple」にすると、準備完了です。

于 2013-08-01T22:49:14.107 に答える
0

私の謙虚な意見では、関心の分離です。メソッドが異なる機能を実行する場合、2 つのメソッド (異なるメソッド名) に分離します。

しかし、そのうちの 1 つをリフレクション ループのプライベート メソッドにします。最初のメソッドは、T のジェネリック型または単に T を返します (オーバーロードのトピックからは外れているかもしれません。私が言いたいのは、上記の例は戻り文字列ですが、複雑な場合オブジェクト、それはさまざまな型を返すために多くのオーバーロード メソッドになる可能性があります。T を返すだけでなく、呼び出し元に T のオブジェクトを取得させます)。

過負荷は良いですが、要件によって異なります。

于 2013-08-02T03:50:16.353 に答える