Предположим, у вас есть метод для объекта, который при некотором входе изменяет состояние объекта , если , вход проверяется в соответствии с некоторой сложной логикой.
Теперь предположим, что когда входные данные не проверяются, это может быть связано с несколькими разными вещами, с каждой из которых мы хотели бы иметь дело по-разному.
Я уверен, что многие из вас думают: для этого есть исключения! Я тоже об этом думал.
Но моя оговорка против использования исключений заключается в том, что в некоторых случаях нет ничего исключительного в том, что входные данные не проверяются, и я действительно хотел бы избегать использования исключений для управления тем, что действительно находится в ожидаемом потоке программы.
Если бы была возможна только одна интерпретация, я мог бы просто выбрать возвращаемое логическое значение, указывающее, привела ли операция к изменению состояния или нет, и соответствующий ответ, если это не так.
Конечно, существует также возможность вернуть код состояния, который клиент может затем интерпретировать или нет. Мне это тоже не очень нравится, потому что в кодах состояния нет ничего семантического.
Решение, которое я имею до сих пор, состоит в том, чтобы всегда проверять каждую возможную ситуацию, которую я могу обработать до Я вызываю метод, который затем возвращает логическое значение, чтобы сообщить клиенту, изменилось ли состояние объекта. Это оставляет мне возможность обрабатывать как можно меньше или столько возможных ситуаций, сколько я хочу, в зависимости от контекста, в котором я нахожусь. Это также дает преимущество, заключающееся в упрощении написания метода, который я вызываю. Недостаток в том, что в клиентском коде достаточно много дублирования, где бы я ни вызывал метод.
Какое из этих решений вы предпочитаете и почему?
Какие еще шаблоны используют люди для обеспечения значимой обратной связи от функций? Я знаю, что некоторые языки поддерживают множественные возвращаемые значения, и если бы у меня была такая опция, я бы ее предпочел.