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
athabus
post
Post #2





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

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


Hej ale mamy XXI wiek i od takich rzeczy jest IDE (IMG:style_emoticons/default/wink.gif) Przcież w Javie też nikt nie klepie wyjątków z ręki a tam to chleb powszedni i obligatoryjnie musisz je obsłużyć.

W PHP storm metoda z nieobsłużonym wyjątkiem jest domyślnie podświetlona (+ edytor w docku domaga się dodania @throws jeśli wyjątek jest nieobsłużony).

Pisać też nic nie musisz - po prostu stajesz na takiej metodzie alt+enter i wybierasz surround with try/catch block i dostajesz kod z odpowiednim wyjątkiem/wyjątkami:

  1.  
  2. try {
  3. $cacheItem->getValue();
  4. } catch (EmptyCacheItemException $e) {
  5. }
  6.  


Taki zapis jak zaproponowałeś faktyczni byłby bez sensu bo po a - łapiesz WSZYSTKIE wyjątki co jest zaprzeczeniem idei tego mechanizmu, a po drugie obsługujesz je przez dziwaczną strukturę z if, która jest nieczytelna.

Takie porównanie kodu, aby było sprawiedliwie:

  1. //wersja 1
  2. try {
  3. return $cacheItem->getValue();
  4. } catch (Cache\EmptyCacheItemException $e) {
  5. $item = $this->prepareItem();
  6. $this->cache->save($inlineImage);
  7. return $item;
  8. }
  9.  
  10.  
  11. //wersja 2
  12. if ($cacheItem->isHit()){
  13. return $cacheItem->getValue();
  14. }
  15.  
  16. $item = $this->prepareItem();
  17. $this->cache->save($inlineImage);
  18. return $item;


Obie wersje są wg mnie czytelne i klarowne. Wersja 1 zmusza do świadomego obsłużenia wyjątku (IDE będzie o to krzyczeć) - w wersji 2 moim zdaniem łatwiej przeoczyć konieczność kontroli bo IDE już nie podpowie, żebyś sprawdził czy coś jest nullem. Przy fast fail musisz coś zrobić od razu z niewartościowym obiektem, a nulla możesz przekazać dalej w miejsce, gdzie ktoś już nie będzie zakładał, że może on być nullem a nie obiektem, którego oczekiwał.

Trochę wychodzi jakbym było orędownikiem wersji z exceptionami, a w sumie sam się zastanawiam, które podejście jest lepsze.

Ten post edytował athabus 1.01.2019, 19:57:16
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 15.10.2025 - 04:44