У меня есть некоторый код и данные, оба в настоящее время инкапсулированы в структуру, которая, в свою очередь, находится в пространстве имен. Я пытаюсь интегрировать внешнюю библиотеку, которая использует старомодные обратные вызовы. Мне нужен доступ к моим данным в контексте обратного вызова, но API обратного вызова не предоставляет средств для добавления персонализированных параметров.
Единственный способ, которым я знаю, чтобы обойти это, это либо добавить глобальный указатель к моей структуре, чтобы колбэк знал, где найти данные, либо использовать путаницу классов повышения, чтобы создать указатель на фальшивую функцию из моей структуры для обратный вызов для использования. Оба варианта больше похожи на взлом ограничений ООП, чем на реальные решения.
Итак, я спорю о том, следует ли полностью отказаться от структуры и преобразовать ее в автономный код и данные. По сути, данные станут глобальными (или, скорее всего, обернутыми в глобальную структуру), но будут находиться в пределах своего пространства имен.
Обоснование для того, чтобы сделать данные "глобальными":
- Код имеет единственную цель в программе и всегда использует один и тот же набор данных для жизни программы. Данные никогда не выделяются и не освобождаются.
- Этот код и данные никогда не создаются. Никогда не бывает и никогда не будет нескольких копий.
- Я не люблю ООП (я использую C ++, потому что это лучший инструмент для работы), поэтому я не чувствую необходимости держать его в инкапсуляции по принципу в одиночку.
Однако есть один недостаток, которого я бы хотел избежать:
- Несмотря на то, что данные находятся в отдельном пространстве имен (и игнорируя тот факт, что я единственный, кто пишет эту программу), ничто не мешает другим частям программы получить доступ к этим данным. И если это произойдет, у меня не будет простого способа отследить это.
Единственная идея, которая у меня была до сих пор, - заключить глобальные данные в безымянное пространство имен. Это должно, во всех смыслах и целях, сделать его невидимым для остальной части кода и устранить наиболее распространенную причину неиспользования глобальных переменных. Однако это также означает, что код, который требует для доступа к нему, должен содержаться в одном файле, что может затруднить работу, если этот файл станет большим.
Есть ли другой вариант, о котором я не думаю, или это так хорошо, как есть?