Предположим, у вас есть подсистема, которая выполняет какую-то работу. Это может быть что угодно. Очевидно, что в точке (точках) входа в эту подсистему будут введены определенные ограничения. Предположим, эта подсистема в первую очередь вызывается через графический интерфейс. Подсистема должна проверить все входные данные, которые она получает, чтобы убедиться, что она действительна. Мы бы не хотели FireTheMissles (), если был неправильный ввод. Пользовательский интерфейс также заинтересован в проверке, потому что он должен сообщить, что пошло не так. Возможно, пользователь забыл указать цель или нацелил ракеты на самой панели запуска. Конечно, вы можете просто вернуть нулевое значение или выдать исключение, но это НЕ дает пользователю СПЕЦИАЛЬНО сообщения о том, что пошло не так (если, конечно, вы не напишите отдельный класс исключений для каждой ошибки, с чем я согласен, если это лучшая практика).
Конечно, даже с исключениями, у вас есть проблема. Пользователь может захотеть узнать, верен ли ввод, ДО того, как нажмете «Огненные пропуски!» кнопка. Вы можете написать отдельную функцию проверки (конечно, IsValid () на самом деле мало помогает, потому что она не говорит вам, что пошло не так), но тогда вы будете вызывать ее из обработчика нажатия кнопки и снова из FireTheMissles ( ) функция (я действительно не знаю, как это изменилось с неопределенной подсистемы на программу запуска ракет). Конечно, это не конец света, но кажется глупым вызывать одну и ту же функцию проверки дважды подряд без каких-либо изменений, особенно если эта функция проверки требует, скажем, вычисления хеш-файла 1 ГБ.
Если предварительные условия функции понятны, графический интерфейс может выполнять собственную проверку ввода, но тогда мы просто дублируем логику проверки ввода, и изменение одной из них может не отражаться в другой. Конечно, мы можем добавить проверку в GUI, чтобы убедиться, что цель ракеты не находится в союзной стране, но затем, если мы забудем скопировать ее в процедуру FireTheMissles (), мы случайно взорвем наших союзников, когда перейдем к консольный интерфейс.
Итак, вкратце, как вы достигаете следующего:
- Проверка ввода, которая говорит вам не только о том, что что-то пошло не так, но и о том, что конкретно пошло не так.
- Возможность запустить эту проверку входных данных без вызова функции, которая на нее опирается.
- Нет двойной проверки.
- Нет повторяющегося кода.
Кроме того, и я только что подумал об этом, но сообщения об ошибках не должны записываться в методе FireTheMissles (). GUI отвечает за выбор соответствующих сообщений об ошибках, а не за код, который вызывает GUI.