Я не думаю, что есть ответ на ваш вопрос. все они кажутся действительными, это зависит от выполняемой вами операции и от согласованного состояния объекта, следующего за этой операцией.
Например: у меня есть метод, который включает подсветку синтаксиса, если вы решите включить его, и он уже включен, что бы вы заботились. В таком случае вы просто устанавливаете логический флаг независимо от предыдущего состояния (вариант 2).
Если, с другой стороны, я не просто изменяю логическое поле, а скорее выполняю некоторую сложную логику, которая может быть дорогостоящей для повторного запуска, например, просматривая DOM документа и окрашивая все нужные места, я бы не стал хочу сделать это снова только потому, что кто-то «перепроверил» флаг включения.
Примерно так:
public void enableHighlighting() {
if (!isHighlighting) {
isHighlighting = true;
colorView(); // very expensive method
}
}
Теперь давайте предположим, что у вас есть случай, когда двойное включение отражает несогласованное состояние машины (что-то вроде того, для чего вы будете использовать assert
. В этом случае вы захотите создать исключение, чтобы указать, что пользователь сделал что-то недопустимое .
Например, скажем, подсветка синтаксиса влияет только на определенные типы файлов, такие как код XML или Java, и пользователь пытается применить его к коду PHP. Теперь выделение уже включено, но разочарованный пользователь пытается включить его, потому что он не видит никаких изменений. В таком случае вы можете напечатать пользователю сообщение о том, что выделение уже включено. В таком случае возвращаемое значение того, произошло ли изменение, вероятно, будет иметь больше смысла, но вы также можете использовать исключение.
Возвращаемое значение:
public boolean enableHighlighting() {
prevState = isHighlighting;
isHighlighting = true;
return prevState != isHighlighting; //return true if value changed
}