У меня есть DLL, которая экспортирует ряд функций для получения или установки различных значений в некоторых базовых объектах данных. В некоторых случаях DLL выдаст уведомление приложению, использующему его, через зарегистрированный указатель функции обратного вызова. Затем приложение должно ответить на уведомление через определенную функцию в интерфейсе DLL (но не обязательно сразу). Пока ответ не получен, объекты данных в DLL могут быть прочитаны, но не записаны.
DLL, конечно, должна экспортировать все методы в глобальном масштабе. Но если уведомление было подано, все функции установки запрещены.
Вдобавок ко всему, я могу придумать два решения: я мог бы реализовать простой механизм состояний на основе флагов и обернуть каждый установщик в оператор if, проверяющий этот флаг. Или я мог бы реализовать два состояния в соответствии с шаблоном State.
Первое решение должно быть дешевым в построении, но требует от всех разработчиков не забывать проверять флаг при реализации новой экспортируемой функции сеттера. И это может стать уродливым, если в какой-то момент состояние «только для чтения» ожидает ответ определенного типа на основе исходного уведомления.
Второе решение требует реализации новых экспортируемых функций в обоих состояниях, что побуждает разработчика задуматься о том, что функция делает в режиме только для чтения. Но большинство методов будут делать то же самое в обоих состояниях, а остальные не должны ничего делать или даже генерировать исключения ...
Есть ли еще лучший способ добиться чего-то подобного?