powinienem wrzucić wyjątek od konstruktora?

46

Wiem, że mogę zgłosić wyjątek od konstruktora w PHP, ale czy powinienem to zrobić? Na przykład, jeśli wartość parametru nie jest taka, jak się spodziewałem.

A może powinienem odłożyć zgłoszenie wyjątku do momentu wywołania metody Jakie są zalety i wady w obu przypadkach?

WordsWorth
źródło
pytanie brzmi: czy chcesz, aby użytkownicy widzieli brzydkie komunikaty o błędach wyjątków?
15
@LawrenceCherone nie, to nie jest pytanie. Ani trochę. Pytanie brzmi, czy natychmiast zgłosić wyjątek, gdy ctor nie może ustawić obiektu w prawidłowy stan na podstawie przekazanych mu argumentów, czy też odłożyć go do momentu wywołania metody działającej na tej instancji z możliwym niepoprawnym stanem. Jednak lepiej nadaje się dla programistów.
4
@LawrenceCherone Masz rację. Żadne oprogramowanie nigdy nie powinno celowo zawieść; powinien po prostu iść dalej i zobaczyć, co się stanie. / s
user253751
@immibis Dobry sarkazm jest dobry.
kodeart
To niesamowite pytanie !!! Nigdy nawet nie rozważałem tego pomysłu do dziś.
Rhys Johns

Odpowiedzi:

75

Dlaczego miałbyś przełożyć rzucanie wyjątku?

Jeśli wiesz, że obiekt nie może poprawnie utworzyć instancji z podanymi parametrami, zdecydowanie powinieneś rzucić wyjątek.

W przeciwnym razie ktoś może przetestować twój obiekt na wartość zerową, co nie będzie, i może założyć, że wszystko poszło zgodnie z oczekiwaniami.

Istnieje wiele rzeczy, które można zrobić na obiekcie bez wywoływania metody: można go dodać do listy, można go porównać, wysłać jako parametr itp. Itd. Wszystko to są rzeczy to nie powinno się zdarzyć, biorąc pod uwagę, że nie jest to prawidłowy obiekt.

Andrei G.
źródło
21

Jeśli twój konstruktor jest wywoływany ze złymi parametrami, powinieneś (musisz?) Zgłosić wyjątek. Jeśli tego nie zrobisz, możesz dostać zły przedmiot, który nie będzie się zachowywał zgodnie z oczekiwaniami.

Félix Gagnon-Grenier
źródło
17

Absolutnie!!

Powinieneś zgłosić wyjątek, jeśli parametry budowy obiektu są nieprawidłowe lub niezgodne z umową. Nie jest dobrym pomysłem kontynuowanie przepływu, wiedząc, że obiekt jest skonstruowany ze złymi danymi, co może powodować wiele problemów, jeśli pozwolisz dzwoniącemu iść naprzód.

Zawsze lepiej jest „FAIL FAST AND FAIL EARLY”

java_mouse
źródło
7

Wiem, że mogę zgłosić wyjątek od konstruktora w PHP, ale czy powinienem to zrobić?

To jedyny rozsądny sposób poinformowania, że ​​konstrukcja obiektu nie powiodła się.

BЈовић
źródło
2

Dlaczego nie sprawdziłbyś zestawu parametrów przed utworzeniem wystąpienia obiektu? Takie postępowanie zapewni utworzenie obiektu, a tym samym usunięcie wszelkich skutków ubocznych, które mogą wystąpić po jego awarii.

Chociaż wiem, że możesz sprawdzać rzeczy w swoim konstruktorze i podrzucać wyjątki, wolę pisać moje konstruktory w taki sposób, aby nie zawiodły. Sprawdzam poprawność parametrów przed tworzeniem instancji obiektów, które mogę następnie odrzucać wyjątki bez awarii moich konstruktorów. Generalnie nie próbuję również tworzyć instancji nowych obiektów w moich konstruktorach, zamiast tego tworzę instancję w razie potrzeby.

Tylko moja opinia. PHP oferuje dużo swobody - ciesz się!

Tony Mays
źródło
Nie jestem pewien, dlaczego ta odpowiedź jest odrzucona. Zapewnia prawidłowe podejście przy użyciu sprawdzania poprawności parametrów przed budową obiektu ( metoda „strażnicza” ), co jest dobrym sposobem na zaprojektowanie twoich klas / funkcji dla określonych (zwykle biznesowych) reguł. Jeśli też nie odpowiada bezpośrednio na pytanie PO, ale nadal jest to dobra rada :)
kodeart