3

私はDnDnsプロジェクトを見て理解しようとしていますが、それは全体として非常に印象的なプロジェクトですが、方法に出くわし、その背後にある理由がわかりません。

public static string GetServByPort(short port, ProtocolType proto)
{
    StringBuilder ans = new StringBuilder();

    switch (proto)
    {
        case ProtocolType.Tcp: 
        {
            TcpServices tcps;
            tcps = (TcpServices)port;
            ans.Append(tcps);
            ans.Append("(");
            ans.Append(port);
            ans.Append(")");
            break;
        }
        case ProtocolType.Udp:
        {
            UdpServices udps;
            udps = (UdpServices)port;
            ans.Append(udps);
            ans.Append("(");
            ans.Append(port);
            ans.Append(")");
            break;
        }
        default:
        {
            ans.Append("(");
            ans.Append(port);
            ans.Append(")");
            break;
        }
    }
    return ans.ToString();
}

TcpServicesとUdpServicesは列挙型です。TcpServicesは次のとおりです。

public enum TcpServices : short
{
    /// <summary>
    /// Domain Name Server Port
    /// </summary>
    Domain = 53
}

UdpServicesは次のとおりです。

public enum UdpServices : short
{
    /// <summary>
    /// Domain Name Server Protocol Port
    /// </summary>
    Domain = 53
}

ポート番号が1であるとしましょう。プロトコルタイプがTCPまたはUDPの場合の出力は、次のようになります。

1(1)

プロトコルタイプがそれ以外の場合、出力は次のようになります。

(1)

したがって、このメソッドを自分のプロジェクト用にこのように書き直したいと思います(元の開発者などに完全なクレジットを与えます)。

private static string GetServerByPort(short port, ProtocolType protocolType)
{
    if (protocolType == ProtocolType.Tcp || protocolType == ProtocolType.Udp)
    {
        return string.Format("{0}({0})", port);
    }

    return string.Format("({0})", port);
}

テストするために、以下の短いコンソールアプリケーションを作成しました。

using System;
using System.Net.Sockets;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetServByPort(1, ProtocolType.Tcp));
            Console.WriteLine(GetServByPort(2, ProtocolType.Udp));
            Console.WriteLine(GetServByPort(3, ProtocolType.SpxII));

            Console.ReadLine();
        }

        public static string GetServByPort(short port, ProtocolType proto)
        {
            switch (proto)
            {
                case ProtocolType.Tcp:
                    return string.Format("{0} ({1})", (TcpServices)port, port);
                case ProtocolType.Udp:
                    return string.Format("{0} ({1})", (UdpServices)port, port);
                default:
                    return string.Format("({0})", port);
            }
        }
    }

    public enum UdpServices : short
    {
        Domain = 53
    }

    public enum TcpServices : short
    {
        Domain = 53
    }
}

そして、これは私の出力でした:

スクリーンショット

しかし、私には見えない理由で、開発者はその複雑さのすべてに取り組んだと思わずにはいられません。

私の質問は、私が計画している方法でこのメソッドをリファクタリングする権利があるか、または元の開発者がこれを行った方法に私が見ていなかった正当な理由があるかどうかです。物事はもっと簡単な方法ですか?

4

3 に答える 3

6

列挙型を呼び出すToString()と、列挙型の値の名前があればそれが使用されます。(対応する名前付きの値がない場合は、数値バージョンが表示されます。)たとえば、TcpServices値が 53 の場合、結果はDomain (53) 元のコード53 (53)になりますが、提案された置換コードになります。

StringBuilderただし、ここで a を使用しても意味がありません。元のメソッドを次のように書き直します。

public static string GetServByPort(short port, ProtocolType proto)
{
    switch (proto)
    {
        case ProtocolType.Tcp: 
            return string.Format("{0} ({1})", (TcpServices) port, port);
        case ProtocolType.Udp:
            return string.Format("{0} ({1})", (UdpServices) port, port);
        default:
            return string.Format("({0})", port);
    }
}
于 2012-12-30T22:59:47.303 に答える
3

既知のサービスの場合、出力は次のようになります。

Domain (53)
HTTP (80)
HTTPS (445)
FTP (21)

など未知のものはあなたが示したようになりますが:

1 (1)
2 (2)

于 2012-12-30T23:00:12.027 に答える
2

値が実際に列挙型メンバーの 1 つである場合、その関数は "53(53)" ではなく "Domain(53)" のようなものを返します。基本的に、すべての値と、存在する場合は値の名前 (そうでない場合は数値) を返す列挙値をStringBuilder呼び出します。ToString

そのコードの一部をリファクタリングする場合は、共通の「(ポート)」部分をスイッチの外に移動し、デフォルトのケースを完全に削除し、不要な一時変数を削除できます。すなわち:

public static string GetServByPort(short port, ProtocolType proto)
{
    StringBuilder ans = new StringBuilder();

    switch (proto)
    {
        case ProtocolType.Tcp: 
            ans.Append((TcpServices)port);
            break;
        case ProtocolType.Udp:
            ans.Append((UdpServices)port);
            break;
    }

    ans.Append("(").Append(port).Append(")");

    return ans.ToString();
}
于 2012-12-30T22:59:51.623 に答える