невалидный стейт и не можешь быть уверен, что твой эксепшен не проигнорят. это не "на короткий срок", это в целом. если на вызывающей стороне будет catch (...) { // do nothing; } дальше объект будет невалидным.
2ой вариант хорош по идее, потому что решает проблему первого, но плох по реализации, зачем тебе что-то считать и складывать в отдельную переменную, если ты можешь просто чуть умнее проверить текущий стейт на возможность его изменить в нужную сторону.
хочешь добавить? убедись что есть хотя бы одно свободное место (читай count($this->apples < 3)), хочешь убрать - убедись что они вообще есть.
действительно, может такое быть с вариантом 1, про то что можно так поступить с эксепшеном не подумал =\ В общем я вроде понял идею - проверять стейт на то, находится ли он уже в пограничном положении с точки зрения инварианта
Обсуждают сегодня