Для забавного проекта я пытаюсь реализовать спецификацию 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 типа декодированных значений.