Нет, не совсем.
Компилятор способен некоторый stati c анализ, и если вы могли бы попросить его диагностировать это состояние, он может быть в состоянии сделать это в некоторых простых случаях. Но как только у вас появляется нетривиальный поток (например, условия выполнения if
), он очень быстро исчезает из окна. Вероятно, это одна из причин того, что никто не создал такую программируемую функцию для компиляторов: высокая сложность, с незначительной утилитой.
Может быть возможно запрограммировать некоторые сторонние анализаторы состояния (c) (или создать один! ) для диагностики вашего простого случая, но опять-таки это большая работа для обработки только самых простых случаев, которые вы уже можете заметить своими глазами.
Вместо этого вы можете заставить work()
произойти в Bar
конструктор. Тогда невозможно выполнить работу дважды над одним и тем же объектом. Однако выполнение большого количества работы в конструкторе часто не одобряется.
Я бы действительно оставил флаг состояния в пределах Bar
и возвратил бы false
из последующего work()
, поддерживая значение этот флаг соответственно. В качестве бонуса вставьте утверждение в функцию перед возвратом false
, чтобы вы могли обнаружить нарушения во время тестирования.
Флаг состояния не обязательно должен быть логическим; это может быть enum
. Надежные конечные автоматы внутри ваших объектов могут быть очень полезны.
При этом я бы посоветовал пересмотреть ваш текущий подход, когда вы передаете ссылки на вещи в другие вещи, которые работают на них; это не простой дизайн, это всего лишь простой пример вашего дизайна! Вы можете sh рассмотреть возможность передачи какого-либо одноразового типа прокси.