РЕДАКТИРОВАТЬ: я не беспокоюсь о том, что вызов вызывается в неправильном порядке, поскольку это обеспечивается с помощью нескольких интерфейсов, я просто беспокоюсь о том, что терминальный метод вызывается вообще.
Я использую шаблон для создания разрешений в нашей системе. Я выбрал шаблон компоновщика, потому что безопасность очень важна в нашем продукте (в нем задействованы несовершеннолетние, поэтому COPPA и др.), Я чувствовал, что крайне важно, чтобы разрешения были читаемыми, и чувствовал, что читаемость имеет первостепенное значение ( т. е. использовать шаблон построителя в свободном стиле, а не одну функцию с 6 значениями).
Код выглядит так:
permissionManager.grantUser( userId ).permissionTo( Right.READ ).item( docId ).asOf( new Date() );
Методы заполняют частный компонент поддержки, который после того, как терминальный метод (то есть asOf) передаст разрешение базе данных; если этот метод не вызывается, ничего не происходит. Иногда разработчики забывают вызывать метод терминала, который не вызывает ошибку компилятора и его легко пропустить при быстром чтении / просмотре кода.
Что я мог сделать, чтобы предотвратить эту проблему? Мне бы не хотелось возвращать объект Разрешения, который должен быть сохранен , так как это вносит больше шума и затрудняет чтение, отслеживание и понимание кода разрешения.
Я думал о том, чтобы поставить на подложку флаг, который помечается командой терминала. Затем проверьте флаг в методе finalize
и запишите в журнал, если объект был создан без сохранения. (Я знаю, что finalize
не гарантированно работает, но это лучшее, что я могу придумать.)