Похоже, у вас уже есть этот вопрос, основанный на вашем вопросе. В идеале модель должна знать, как защитить свое состояние, поскольку объекты данных обычно разрабатываются с учетом переносимости (даже если они никогда не будут использоваться таким образом).
Но в этом случае вы хотите предотвратить действие до того, как пользователь даже получит доступ к модели. Использование проверки модели в этом случае означает, что вы опоздали, и пользователь уже пошел дальше, чем он должен, имея доступ и пытаясь списать продукт, который никогда не должен был быть доступным на основании его проданного статуса.
Так что я думаю, что идеальный ответ - «оба». Модель «должна» знать, как защитить себя, в качестве резервной копии и на случай, если она когда-либо будет использоваться извне.
Однако в реальном мире у нас разные приоритеты и ограничения, поэтому я бы предложил осуществить внесенные вами изменения, если это возможно, или сохранить их для следующего проекта, если нет.
Что касается использования обратного вызова модели по сравнению с проверкой, я думаю, что это более сложный вопрос, но я остановлюсь на проверке, потому что вы, вероятно, захотите представить сообщение пользователю, а проверка построена именно для этого использования ( Я бы посчитал это более дружественной и ожидаемой ошибкой пользователя, чем враждебной или связанной с безопасностью, с которой вы могли бы по-разному реагировать).
Это то, что вы рассматривали?