Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Где лучше проверять данные для алгоритма на валидность?

#java #ооп #исключения


Я реализовал алгоритм. Этому алгоритмы на вход надо подавать только положительные
числа. Сейчас я проверяю положительность чисел в GUI и если они не положительные вывожу
предупреждение и прошу заново ввести числа. 

Не лучше ли перенести эту проверку в сам класс алгоритма? Что бы перед началом выполнения
он проверял числа и бросал исключение, если есть отрицательные. И поставить throws
на метод. А в GUI взять вызов метода алгоритма, в котором как раз бросаю исключение
в try-cacth и в catch прописать нужное мне сообщение об ошибке для пользователя?
    


Ответы

Ответ 1



Если "алгоритм" работает только с положительными числами, то он должен это и проверить. "Алгоритм" может предоставлять методы для верификации своих аргументов. И в этом случае gui может вызвать этот метод, вывести красиво сообщения об ошибке. А может просто обработать исключения. Почему так? Ваш "алгоритм" вполне возможно нужно будет использовать из других "мест", например, в консольном приложении или для веб приложения. И не факт, что пользователи "алгоритма" всё напишут правильно. UPD Есть такой принцип - DRY SPOT - do not repeat yourself (не повторяй себя) and Single Point of Truth (единый источник истины). Поэтому, если два куска кода будут знать, как проверить параметры - рано или поздно будет беда.

Ответ 2



Для больших проектов применяется подход, согласно которому рекомендуется отделять логику работы от логики проверок. Заключается в следующем: Пишем класс, отвечающий за логику, и ловящий исключения только нижележащих слоев. Класс никак не проверяет переданные ему значения на корректность: падает при NullPointerException, делениях на 0 и т.д. В вашем случае при передаче отрицательных чисел должен бросать своё исключение (можно унаследовать его от IllegalArgumentException или InvalidParameterException). Пишем к нему классы-обертки с нужными нам проверками. Таким образом, если ваш код будет использоваться сторонними программистами, они сами смогут обработать исключения, которые бросает ваш класс, так, как посчитают нужным. А может, они его расширят (унаследуют) для работы вашей логики и с отрицательными числами, и тогда не надо будет встраивать в него проверку на положительность. И тут ой, беда: вы уже её встроили, и придется переписывать ваш класс. Класс никак не проверяет переданные ему значения на корректность Имеется в виду, что он не обрабатывает неправильные значения, скрывая их от вызывающих методов. И предложенное вами решение обрабатывать исключения в GUI допустимо, если судьба вашего класса - умереть в этом приложении :) Если же вы будете использовать его хоть где-то ещё, в более крупных приложениях, сами его расширять (наследовать), или использовать в командной разработке, или где-то публиковать - сделайте для него классы-обертки, проверяющие входные данные различными способами.

Комментариев нет:

Отправить комментарий