Программирование - это работа
Я думаю, что самый простой способ ответить на это, это понять прогресс, достигнутый ООП за эти годы. Все, что делается в ООП (и в большинстве случаев в парадигмах программирования), смоделировано вокруг необходимости работы .
Каждый раз, когда вызывается метод, вызывающий абонент говорит: «Я не знаю, как выполнить эту работу, но вы знаете, как, поэтому вы делаете это для меня».
Это представляло сложность: что происходит, когда вызываемый метод обычно знает, как выполнять работу, но не всегда? Нам нужен был способ общения: «Я хотел помочь тебе, я действительно помог, но я просто не могу этого сделать».
Ранняя методология для сообщения об этом состояла в том, чтобы просто возвращать «мусорное» значение. Возможно, вы ожидаете положительное целое число, поэтому вызываемый метод возвращает отрицательное число. Еще один способ сделать это - установить где-нибудь значение ошибки. К сожалению, оба способа привели к тому, что код « дай мне проверить здесь, чтобы убедиться, что все есть», кошерный . Когда все усложняется, эта система разваливается.
Исключительная аналогия
Допустим, у вас есть плотник, сантехник и электрик. Вы хотите, чтобы сантехник починил вашу раковину, поэтому он на это смотрит. Это не очень полезно, если он говорит только вам: «Извините, я не могу это исправить. Он сломан». Черт, еще хуже, если бы он посмотрел, ушел и отправил вам письмо, в котором говорилось, что он не может это исправить. Теперь вам нужно проверить свою почту, прежде чем вы даже узнаете, что он не сделал то, что вы хотели.
Что бы вы предпочли, так это попросить его сказать: «Послушайте, я не смог это исправить, потому что, похоже, ваш насос не работает»
С помощью этой информации вы можете сделать вывод, что хотите, чтобы электрик посмотрел на проблему. Возможно, электрик найдет что-то связанное с плотником, и вам нужно будет починить его.
Черт, вы можете даже не знать, что вам нужен электрик, вы можете не знать, кто вам нужен. Вы просто менеджер среднего звена в сфере ремонта дома, и ваше внимание сосредоточено на сантехнике. Итак, вы говорите, что вы босс о проблеме, а затем он говорит электрику, чтобы исправить это.
Это то, что являются исключениями моделирования: сложные режимы отказов в развязанном виде. Сантехнику не нужно знать об электрике - ему даже не нужно знать, что кто-то в цепи может решить проблему. Он просто сообщает о проблеме, с которой столкнулся.
Так что ... анти-паттерн?
Итак, понимание точки исключений является первым шагом. Следующее - понять, что такое анти-паттерн.
Чтобы считаться анти-паттерном, необходимо
- решать проблему
- иметь категорически негативные последствия
Первый пункт легко соблюдается - система работала, верно?
Второй момент более липкий. Основная причина использования исключений в качестве нормального потока управления плохая, потому что это не является их целью. Любая конкретная часть функциональности в программе должна иметь относительно ясную цель, и совместное использование этой цели приводит к ненужной путанице.
Но это не окончательный вред. Это плохой способ сделать что-то, и странный, но анти-паттерн? Нет ... Просто ... странно.