Я часто стикаюся з цією проблемою, особливо на Java, навіть якщо вважаю, що це загальна проблема OOP. Тобто: підвищення винятку виявляє проблему дизайну.
Припустимо, у мене є клас, який має String nameполе і String surnameполе.
Потім він використовує ці поля для складання повного імені людини для того, щоб відобразити його в якомусь документі, наприклад, рахунку-фактурі.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Тепер я хочу посилити поведінку свого класу, видавши помилку, якщо displayCompleteNameOnInvoiceвиклик до того, як ім'я було призначено. Здається, це гарна ідея, чи не так?
Я можу додати getCompleteNameметод підвищення винятків до методу. Але таким чином я порушую «неявний» контракт із користувачем класу; в цілому одержувачі не повинні викидати винятки, якщо їх значення не встановлено. Гаразд, це не стандартний геттер, оскільки він не повертає жодного поля, але, з точки зору користувача, відмінність може бути надто тонкою, щоб думати про це.
Або я можу викинути виняток ізсередини displayCompleteNameOnInvoice. Але для цього я повинен перевірити безпосередньо nameабо surnameполя і при цьому я б порушити абстракції , представлені getCompleteName. Саме цей метод відповідає за перевірку та створення повного імені. Він навіть міг би вирішити, грунтуючись на рішенні на інших даних, що в деяких випадках це достатньо surname.
Таким чином, видається, що єдиною можливістю є зміна семантики методу getCompleteNameна composeCompleteName, що передбачає більш "активну" поведінку і, відповідно, здатність кидати виняток.
Це краще рішення дизайну? Я завжди шукаю найкращий баланс між простотою та правильністю. Чи є проектна посилання на це питання?
displayCompleteNameOnInvoiceможна просто кинути виняток, якщо getCompleteNameповертається null, чи не так?