чи слід кидати виняток з конструктора?


46

Я знаю, що можу викинути виключення з конструктора в PHP, але чи варто це робити? Наприклад, якщо значення параметра не таке, як я очікував.

Або я повинен відкладати викидання виключення, поки метод не буде викликаний. Які переваги та недоліки в обох випадках?


питання, чи хочете ви, щоб ваші користувачі бачили некрасиві повідомлення про помилки виключень?

15
@LawrenceCherone ні, це не питання. Зовсім ні. Питання полягає в тому, чи слід негайно ставити виняток, коли ctor не може встановити об'єкт у дійсному стані з аргументів, переданих йому, або відкласти це, поки не буде викликаний метод, що працює в цьому екземплярі з можливим недійсним станом. Хоча краще підходить для програмістів.

4
@LawrenceCherone Ти маєш рацію. Жодне програмне забезпечення ніколи не повинно свідомо виходити з ладу; він повинен просто продовжувати і дивитися, що станеться. / s
user253751

@immibis Добрий сарказм - це добре.
kodeart

Це дивовижне питання !!! Я навіть до сьогодні не вважав цю ідею.
Rhys Johns

Відповіді:


75

Чому б ви відклали викидання винятку?

Якщо ви знаєте, що об'єкт не може належним чином інстанціювати задані параметри, то вам обов'язково слід викинути виняток.

В іншому випадку хтось може перевірити ваш об’єкт на нуль, чого він не буде, і може припустити, що все пішло так, як очікувалося.

Є багато речей, які можна зробити з вашим об'єктом без виклику методу на ньому: його можна додати до списку, його можна порівняти, він може бути надісланий як параметр, і т. Д. І т.д. і т.д. цього не мало статися, вважаючи, що це не дійсний об'єкт.


21

Якщо ваш конструктор викликає неправильні параметри, тоді ви повинні (повинні?) Кинути виняток. Якщо цього не зробити, ви можете отримати поганий предмет, який буде вести себе не так, як очікувалося.


17

Абсолютно !!

Ви повинні викинути виняток, якщо параметри для побудови об'єкта невірні або не відповідають умовам договору. Недоцільно продовжувати рух, знаючи, що об’єкт побудований з поганими даними, які можуть спричинити багато проблем, якщо дозволити абоненту йти вперед.

Завжди краще "НЕВІДКЛЮЧИТЬСЯ ШВИДКО І НЕПРАВНО"


7

Я знаю, що можу викинути виключення з конструктора в PHP, але чи варто це робити?

Це єдиний розумний спосіб повідомити, що будівництво об'єкта не вдалося.


2

Чому б ви не підтвердили встановлений параметр до ініціації об'єкта? Це призведе до того, що ваш об’єкт буде створений, таким чином, видаляючи будь-які побічні ефекти, які можуть виникнути внаслідок його відмови.

Хоча я знаю, що ви можете перевіряти речі у своєму конструкторі та кидати винятки, я вважаю за краще писати свої конструктори таким чином, щоб вони не провалювалися. Я виконую перевірку параметрів перед тим, як створювати об'єкти, на які я можу підкидати винятки, не виходячи з ладу. Я також, як правило, не намагаюся створювати нові об'єкти в своїх конструкторах, вибираючи натомість інстанціювати їх у міру необхідності.

Просто моя думка. PHP пропонує багато свободи - насолоджуйтесь!


Я не впевнений, чому ця відповідь спростована. Він забезпечує правильний підхід, використовуючи перевірку параметрів до побудови об'єкта ( метод "охорона" ), що є хорошим способом проектувати свої класи / функції для конкретних (зазвичай ділових) правил. Якщо також не відповідає безпосередньо на запитання ОП, але це все-таки хороша порада :)
kodeart
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.