JnDev
@JnDev
Inquisitive

Чистый код: блоки try/catch. Стоит ли так делать?

Читаю Рики Роберта Мартина - "Чистый Код". И до сих пор думаю об одном его совете, с которым мне тяжело согласиться. Мартин советует изолировать блоки try/catch, т.е. всю область, что находится в блоке try выделить в ОДИН отдельный метод. Например, вот такой довольно лаконичный и легко читаемый метод:
public void delete(Page page)
{
  try {
    deletePage(page);
    registry.deleteReference(page.name);
    configKeys.deleteKey(page.name.makeKey());
  } catch (Exception e) {
    logger.log(e.getMessage());
  }
}

Мартин предлагает преобразовать в два метода:

public void delete(Page page)
{
  try {
    deletePageAndAllReferences(page);
  } catch (Exception e) {
    logger.log(e.getMessage());
  }
}

private void deletePageAndAllReferences(Page page)
{
  deletePage(page);
  registry.deleteReference(page.name);
  configKeys.deleteKey(page.name.makeKey());
}

Мартин говорит, что таким образом мы отделяем бизнес-логику от обработки ошибок.

Но, мне кажется, это избыточно. Да, разумеется, если у нас в try {} сложная логика то ее следует декомпозировать, но если у нас в try {} несколько понятных вызовов методов, то разве нужно выделять их в один метод? Тем более, становится сложно придумать РАЗНЫЕ названия для двух методов, которые делают по сути одно и то же. При этом, сам же Мартин очень большой акцент делает на хорошем и не запутывающем именовании методов.

Как считаете, стоит ли так делать? И следуете ли вы сами такому примеру?
  • Вопрос задан
  • 1971 просмотр
Решения вопроса 2
  • @Adamos
    Я бы сказал, применимость такого правила сильно зависит от того, приходится ли вам, читая обработку исключений, лезть в код того, что их вызвало.
    Если код выплевывает исключения, которые полностью понятны без чтения этого кода - можно его завернуть в функцию и убрать с глаз долой.
    Если же исключительные ситуации связаны с самой логикой метода, то размазывание этой логики по разным функциям просто нелепо.
    Ответ написан
  • @FanatPHP
    > если у нас в try {} несколько понятных вызовов методов,

    причем таких как в примере, далеющих только логирование, и поэтому повторающихся сотни и тысячи раз, то try catch в таеом случае писать не нужно вообще. А добавить либо глобальный трай для всего приложение, либо написать отдельный хендлер/обработчки исключений, если язык позволяет.

    То есть ответ на вопрос очевиден:

    - если у нас в кетче только логинование, то трай не пишем вовсе
    - если в кетче замороченная логика, то трай разумеется имеет смысл вынести в отдельный метод
    Ответ написан
Пригласить эксперта
Ответы на вопрос 6
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Вакансии с Моего Круга Все вакансии
Заказы с Фрилансим Все заказы