Я часто стикаюся з цією проблемою, особливо на 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
, чи не так?