В настоящее время network.h
включает в себя множество заголовков, специфичных для платформы (например, u.h
, windows.h
и unistd.h
). Мы должны ограничить их одним файлом (или несколькими файлами).
Я предлагаю создать тонкую абстракцию по средствам ОС для работы в сети, а другую - по средствам монотонных часов. Тогда мы могли бы иметь один файл для каждого типа платформы (например, ${module}_win32.c
, _unix.c
, _osx.c
, _posix.c
, ...) и условно скомпилировать их в соответствии с препроцессором. символы, как и мы. Обратной стороной является то, что это немного больше накладных расходов на объявление, потому что в настоящее время эти #ifdef
s являются внутренними функциями, которые необходимо будет переопределить для каждой платформы. Преимущество состоит в том, что в самом коде нет или мало #ifdef
s, а специфичный для платформы код находится в наборе небольших файлов вместо (как сейчас) в 1100-строчных абстракциях платформы смешивания файлов с код приложения.
Звучит отлично
Как насчет того, чтобы создать «системный» интерфейс, который может быть реализован «системой Windows», «системой posix» и «системой тестирования»? Тестовая система может использоваться в модульных тестах и имитировать систему, фактически не выполняя системных вызовов.
Я не согласен с предложением по реализации. Я бы предпочел видеть все функции в одном файле {network,time,...}.c
, где #ifdef
s используется для обертывания функций, которые должны быть написаны по-разному для каждой платформы.
Преимущества этого метода по сравнению с отдельными файлами заключаются в том, что мы можем заставить весь код платформы как статическую функцию и предоставить единый API для более высоких уровней toxcore. Любые детали реализации платформы можно будет легко просмотреть из одного файла. Особенности платформы потребуют абстракции и обработки в одном файле, а не в нескольких файлах. Это также упростит сопровождение файла cmakelists.txt (он уже начинает ускользать от нас). И последующее рассмотрение с нашей текущей системой проверки.
Не полностью исправлено
@GrayHatter согласился. Пусть будет единый файл, реализующий специфику ОС.
Я пока отменяю назначение
Самый полезный комментарий
Как насчет того, чтобы создать «системный» интерфейс, который может быть реализован «системой Windows», «системой posix» и «системой тестирования»? Тестовая система может использоваться в модульных тестах и имитировать систему, фактически не выполняя системных вызовов.