Предложения по очистке этого API - PullRequest
1 голос
/ 24 сентября 2010

Для забавного проекта я пытаюсь реализовать спецификацию BitTorrent, и сейчас я работаю над частью BEncoding.

Кодировка в основном может кодировать из int / string / dictionary -> string для передачи. У меня есть все различные кодировки, написанные / протестированные / работающие как перегруженные методы Encode (...), и у меня есть отдельные методы декодирования, написанные / протестированные / работающие как DecodeString (...), DecodeInt (... ) и т. д.

Я не могу найти способ иметь 1 метод декодирования для всех декодирований, чтобы сохранить API для кодирования / декодирования как можно более чистым (2 открытых метода, топы, на данный момент).

Обратите внимание, что у меня есть метод, который может получить тип результата, который будет иметь декодированная строка.

Код клиента, прямо сейчас должен выглядеть примерно так каждый раз, когда он хочет декодировать сообщение:

string s = ...; // Encoded string
Type t = Encoder.GetDecodedType(s);
if (t == typeof(int))
    process(Encoder.DecodeInt(s));
else if (t == typeof(string))
    process(Encoder.DecodeString(s));
else if (t == typeof(Dictionary<string, string>))
    process(Encoder.DecodeStringDictionary(s));
else if (t == typeof(Dictionary<string, int>))
    process(Encoder.DecodeIntDictionary(s)):

и я бы хотел почистить это так:

string s = ...; // Encoded string
process(Encoder.Decode(s));

где в обоих случаях процесс (...), вероятно, будет перегружен функциями на стороне клиента, принимая 4 типа декодированных значений.

Ответы [ 4 ]

3 голосов
/ 24 сентября 2010

Вы можете позволить DLR сделать это за вас.

public static void Process(int i) { ... }
public static void Process(string s) { ... }
public static void Process(Dictionary<string, string> dic) { ... }
public static void Process(Dictionary<string, int> dic) { ... }

[...]

public dynamic Decode(string input)     // or 'object' if you prefer
{
    var t = GetDecodedType(input);
    if (t == typeof(int))
        return DecodeInt(input);
    else if (t == ...)
        // ...
}

[...]

string s = ...; // Encoded string
Process(Encoder.Decode(s));            // if you used 'dynamic' above
Process((dynamic)Encoder.Decode(s));   // if you used 'object' above
1 голос
/ 24 сентября 2010

Если вы пишете библиотеку / фреймворк ... это будет самый бесценный ресурс в вашем начинании :-) У меня есть бумажная копия, и я прочитал ее на обложке, чтобы покрыть:
Руководство по разработке для разработки библиотек классов от Microsoft

0 голосов
/ 24 сентября 2010

Я в замешательстве. почему бы просто не выполнить логику GetDecodedType в общедоступном методе Decode и определить тип, а затем сделать разные вызовы после определения?

0 голосов
/ 24 сентября 2010

Я бы сказал, что вы должны следовать принципу подстановки Лискова здесь и создать метод для каждого типа данных.Таким образом, вы не добавляете к страданиям использование typeof, когда начинаете передавать пользовательские объекты.Перечитав свой вопрос еще раз, вы уже знаете, какой тип ему передается, что дополнительно поддерживает необходимость удаления операции typeof

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...