Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Używanie Exceptionów a typowanie
athabus
post
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Ostatnio ciekawi mnie temat używania Exceptionów - muszę przyznać, że trochę słabo to czuję. Kiedyś Exception stosowałem do rzeczy, które po prostu mogły spowodować niedziałanie aplikacji - np. brak dostępu do pliku czy coś podobnego. Ostatnio jednak widzę, że coraz częściej w nowych bibliotekach Exceptiony stosuje się w inny sposób tj. do wymuszenia typowania metody bez zwracania NULL.

Np taka klasa:

  1. <?php
  2.  
  3. class MySampleRepository
  4. {
  5. public function getItemV1(int $id): SomeObject
  6. {
  7. //pobieramy item, który może nie istnieć (null)
  8. $item = $this->fetch($id);
  9.  
  10. if (!$item) {
  11. throw new ItemNotFoundException('Item does not exist');
  12. }
  13.  
  14. return $item;
  15. }
  16.  
  17. public function getItemV2(int $id): ?SomeObject
  18. {
  19. //pobieramy item, który może nie istnieć (null)
  20. $item = $this->fetch($id);
  21.  
  22. return $item;
  23. }
  24. }


Pierwsza metoda (podejście o którym mówię) nigdy nie zwraca nulla, tylko obiekt lub rzuca wyjątek. Druga metoda (tradycyjna) zwraca obiekt lub null.

Które podejście stosujecie? Dlaczego.

Ja po rozmowie z kolegą zacząłem skłaniać się ku pierwszej wersji i brak możliwości zwrócenia oczekiwanego obiektu traktuję jako wyjątek.Podświadomie wydaje mi się to bardziej logiczne i wymusza trochę więcej dyscypliny.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
markonix
post
Post #2





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Ja bym jednak wolał aby repozytoria zwracały puste tablice/kolekcje oraz null w przypadku gdy pobieram w zamierzeniu jeden obiekt.

  1. if (MySampleRepository::getItemV1($id) !== null) {
  2. //
  3. }


  1. if ($object = MySampleRepository::getItemV1($id)) {
  2. //
  3. }


  1. $object = MySampleRepository::getItemV1($id) ? ? Alternative::get($id);


Generalnie wszystko np. w Laravel typu get(), find(), first(), firstWhere(), config() zwraca null gdy nie znajduje nic i ciężko by mi się było przerzucić na łapanie wyjątków. Najnormalniej w świecie było by więcej kodu i byłby dla mnie mniej czytelny.

edit: Oprócz findFail(), który właśnie zwraca zgodnie z intencją wyjątek ResourceNotFound, idealny do wyświetlania resource/{id} i wyświetlenia po prostu 404ki bez zbędnych warunków.

Temat w każdym razie mnie zaciekawił bo akurat ostatnio często rozmyślam na repository pattern. Znalazłem na Stacku temat: https://stackoverflow.com/questions/175532/...en-it-cant-prod

Ten post edytował markonix 31.12.2018, 17:29:56
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.10.2025 - 04:56