Всем здравствовать! Какой бы то ни было протокол обычно имеет несколько версий, поэтому сервер должен уметь обрабатывать запросы не только новейших, но и старых версий. Отсюда вопрос: как структурировать код сервера, чтобы он мог это делать?
Самое простое решение, оно же самое расточительное, заключается в написании отдельного модуля для каждой версии. При этом имеются следующие недостатки: низкое переиспользование кода; высокая ветвистость -- возникают конструкции вроде следующих:
if (protocol_version == 0)
protocol_method_0(...);
else if (protocol_version == 1)
protocol_method_1(...);
Более того -- при обновлении протокола придётся дописывать по ветви во *всей* программе!
Ещё одним способом решения может быть модификация предыдущего метода: включить в вызов каждой функции протокола аргумент версии. Тогда можно будет делать так:
protocol_method(protocol_version, ...);
Ветвистость, конечно, останется, но её будет меньше, поскольку мы её перенесли в код самих функций, реализующих протокол.
Но вот что делать, скажем, если в новой версии протокола изменена сигнатура функции? Тогда мы снова вынуждены городить if-else для того, чтобы правильно работать. В этом случае можно придумать ввести дополнительный аргумент "сырых" данных, в которых может быть что угодно или сделать все функции с переменным числом аргументов, а что туда писать прописать в документации, однако это уж слишком непрозрачно.
Делают же как-то это и уже много лет! Например, если указать gcc использовать такой-то стандарт, он и будет его использовать! Читал ещё про шаблон "Стратегия", но он годится только для объектно-ориентированных языков. Как-то же справлялись с этим до Java/C++ и подобных? @tech@mastodon.ml
@devadideva @tech
Хорошо, что не свой универсальный стандарт, а то было бы три стандарта. 😅