Проблема дизайна: в какой степени я должен полагаться на исключения для потока управления? - PullRequest
2 голосов
/ 16 февраля 2012

Я работаю над Java-приложением и у меня есть несколько вопросов относительно дизайна.

В основном в своей текущей версии он в значительной степени полагается на перехват исключений для определения потока управления .

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

@Override
public boolean validateEmailAddressDoesNotExist(String accountEmailAddress) {
    try {
         return !dao.checkIfEmailAddressAlreadyExists(accountEmailAddress);
    } catch (NoResultException re) {
        log.error("NoResultException", re);
    } catch (RuntimeException re) {
        log.error("RuntimeException", re);
    }
    return true;
}

//from "dao" class
public boolean checkIfEmailAddressAlreadyExists(String accountEmailAddress) {
    return (loadAccountFromAccountEmailAddress(accountEmailAddress) == null ? false : true);
}

//also from "dao" class
public Account loadAccountFromAccountEmailAddress(String accountEmailAddress) {
    return entityManager.createNamedQuery("Account.findByEmailAddress", Account.class).setParameter("accountEmailAddress", accountEmailAddress).getSingleResult();
}

Я подозреваю, что мой текущий дизайн, вероятно, неверен, но я был бы признателен за чтение ваших комментариев и мнений по этому поводу и в какой степени вы считаете, что это неправильно.

Ответы [ 4 ]

4 голосов
/ 16 февраля 2012

Общее правило гласит, что исключения относятся к «исключительным» условиям.

Таким образом, если элемент данных может присутствовать или может отсутствовать в разумных пределах, возврат логического значения будет более нормальным. Обычно это также приводит к более простому и понятному коду.

Затем вы можете сохранить исключения для действительно исключительных условий, таких как сбои сети и т. Д.

В некоторых случаях сторонние библиотеки могут не дать вам никакого выбора - если они выдают исключения, вам приходится иметь дело с ними!

3 голосов
/ 16 февраля 2012

Методы проверки в вашей сервисной модели не должны вызывать исключения.Это плохо по нескольким причинам:

  • Это не исключительное условие.«Нет результатов» - обычная ситуация.

  • Это косвенно связывает вашу проверку с реализацией методов извлечения данных из инфраструктуры.Чтобы понять, почему это нехорошо, представьте, что ваш фреймворк меняется так, что теперь он поднимает EmptyResultSetException.Вы должны обновить все свои методы проверки.Yikes!

Вы не можете обязательно помочь, если ваша базовая структура вызывает исключения, указывающие «нет результатов», но вы, безусловно, можете контролировать то, что делает checkIfEmailAddressAlreadyExists.

Измените этот метод так, чтобы он возвращал true, если адрес существует, и false, если он не существует или если результатов не было найдено.

3 голосов
/ 16 февраля 2012

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

1 голос
/ 16 февраля 2012

Я не программист на Java, никогда не использовал его на самом деле.

Но я действительно знаю, что получение и отлов исключений очень дороги в мире C #.Таким образом, управление потоком с ними очень неэффективно, в отличие от проверки самих вещей и исключения из тех вещей, о которых вы не думали, как сказал DNA .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...