Использование словарей вместо операторов switch - PullRequest
0 голосов
/ 27 марта 2020

Я пишу библиотеку, и возник вопрос о stati c классах и stati c полях / реквизитах. что я делаю:

static class PacketFactory
{
    private static readonly Dictionary<int, Type> RadiusPacketTypes;
    static PacketFactory()
    {
        RadiusPacketTypes = new Dictionary<int, Type>() {
            {1,typeof(AuthPacket)},
            {2,typeof(AuthPacket)},
            {3,typeof(AuthPacket)},
            {4,typeof(AccPacket)},
            {5,typeof(AccPacket)},
            {11,typeof(AuthPacket)},
        };
    }

    /// <summary>
    /// Returns an instance of the PacketBuilder class, that can be used to build a IRadiusPacket object
    /// </summary>
    /// <param name="code"></param>
    /// <returns></returns>
    /// <exception cref="InvalidCodeException"></exception>
    public static PacketBuilder GetInstance(byte code)
    {
        var valueFound = RadiusPacketTypes.TryGetValue(code, out var type);

        if (!valueFound) {
            throw new InvalidCodeException();
        }

        var instance = (IRadiusPacket)Activator.CreateInstance(type);
        instance.Code = (Enums.PacketCode)code;
        var packetBuilder = new PacketBuilder(instance);

        return packetBuilder;
    }
}

Во-первых, считается ли поле stati c плохим дизайном? Во-вторых, в основном я создал фабрику, которая возвращает IRadiusPacket, конкретная реализация c, которая возвращается, зависит от кода. Я использовал словарь для этого, имеет ли это смысл? Что было бы лучшим способом решить это? Каков еще один хороший способ избежать операторов переключения, который имеет смысл в этой ситуации.

Кстати, предложения и критика всегда приветствуются!

...