У меня проблема с этим типом кода, который является распространенным шаблоном. Вам вообще не нужны нулевые проверки, если вы разлагаете то, что на самом деле делаете. Проблема здесь, на мой взгляд, в том, что вы нарушаете SRP.
Метод CustomerVO custVO = CustomerDAO.getCustomer(customerID);
делает две вещи.
Во-первых, он возвращает клиента, если он существует, и, во-вторых, возвращает ноль, если такого клиента нет. Это две разные операции, которые должны быть закодированы как таковые.
Лучший подход был бы:
bool customerExists = CustomerDAO.exists(customerID);
if (customerExists)
{
CustomerVO custVO = CustomerDAO.getCustomer(customerID);
sendEmail(custVO.getFirstName(), custVO.getEmailID());
}
else
{
// Do whatever is appropriate if there is no such customer.
}
}
Итак, разделите метод на два: один, который проверяет, существует ли запрошенный объект, а второй, который фактически его получает. Нет необходимости в каких-либо исключениях, и дизайн и семантика очень понятны (что, на мой взгляд, с шаблоном «не существует, возвращает ноль» не так). Кроме того, в этом подходе метод CustomerDAO.getCustomer(customerID)
выдает ArgumentException
, если запрошенный клиент не существует. В конце концов, вы попросили Customer
, а его нет.
Кроме того, на мой взгляд, ни один метод не должен возвращать null
. Null
явно означает: «Я не знаю, каков правильный ответ, у меня нет значения для возврата». Null
это не значение, это отсутствие значения. Спросите себя: «Почему я возвращаю то, что, как я знаю, на самом деле не должно происходить? Ваш метод GetCustomer
должен возвращать Customer
, очевидно. Если вы вернете null
, вы просто возьмете на себя ответственность за то, что нужно сделать, сделайте резервную копию цепочки вызовов и разорвите контракт. Если есть значимое значение по умолчанию, используйте его, но выбрасывание исключения может заставить вас задуматься о правильном дизайне.