Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dyskusja - typ mixed - zwracanie i przekazywanie danych
Forum PHP.pl > Forum > PHP
Inscure
Witam,

Nawiązując do tego wątku: http://stackoverflow.com/questions/3525507...pes-good-or-bad

Co myślicie na temat zwracania typu mixed przez funkcje/metody. Jakie macie podejście do sprawy, przy niepowodzeniu FALSE czy rzucanie wyjątku.
Myślę że warto podyskutować, może rozwinąć się ciekawy wątek.
Crozin
Mieszanie typu zmiennej (dotyczy również typu zwracanej wartości przez funkcje) jest bardzo, bardzo złą praktyką. Zmniejsza czytelność kodu i zwiększa jego podatność na błędy. Natomiast zwracanie null/false w celu poinformowania o błędzie to już czysty sadyzm ze strony dewelopera - właściwie w każdym kodzie, w którym stosuje się takie coś istnieją dziesiątki miejsc, gdzie nie sprawdzono czy aby przypadkiem nie wystąpił błąd.
Inscure
Czyli wg Twojego rozumowania funkcja powinna mieć z góry ustalony typ dla każdej z danych wejściowych.

1. Argument ma niewłaściwy typ, rzucany jest wyjątek.
2. Nie może być zwrócona wartość o typie danych jak z założenia - rzucany jest wyjątek.

Nikt inny się nie udziela to pewnie uważają tak samo ;P
darko
Pseudotyp mixed zwykło się umieszczać w komentarzach funkcji/metod w przypadku jeśli dany kod powinien normalnie zwrócić jakieś dane (tablicę/obiekt) ale może również zwrócić (tylko w przypadku błędu) false, null, -1 (wszystko, co spełni warunek skróconego zapisu):
  1. if(cos_tam())
  2. {
  3. // ok
  4. }
  5. else
  6. {
  7. // coś poszło nie tak
  8. }

ot cała filozofia. Zwracanie false lub null przez funkcje/metody wydaje się być pewnym niepisanym standardem php. Wyjątek można rzucić później (w podanym warunku sprawdzającym). Oczywiście wyjątki są bardzo dobrym rozwiązaniem, bezpieczniejszym, ponieważ nie ma potrzeby przewidywania różnych sytuacji w zależności od danych wejściowych.
Crozin
PHP jest językiem z dynamicznym typowaniem zmiennych, jednak jest to cecha wygodna tylko przy pisaniu "na szybko/śmieciowego" kodu. Każda zmienna powinna przechowywać wyłącznie jeden typ danych, bądź ewentualnie null, w przypadku gdy "nie ma wartości". Wyjątkiem będzie sytuacja, gdzie potrzebujemy uzyskać kilka różnych sygnatur dla danej metody, czyli gdy ją przeciążamy. Wtedy jednak należy jak najszybciej doprowadzić typy zmiennych do ich docelowych typów i dopiero brać się za wykonywanie właściwego kodu metody.

A do zgłoszenia każdego błędu/nieprawidłowości mamy wyjątki.
skowron-line
Cytat(darko @ 13.08.2012, 10:02:33 ) *
Zwracanie false lub null przez funkcje/metody wydaje się być pewnym niepisanym standardem php.

Jeżeli twoja funkcja w zalożeniu ma zwrócić tablicę | string | int to w przypadku blędu może zwrócić pustą tablicę | string | 0.

  1. class user {
  2.  
  3. protected $_insert_id;
  4. protected $_affected_rows;
  5.  
  6. public function save()
  7. {
  8. // Validacja danych wejsciowych
  9. if($valid)
  10. {
  11. return false;
  12. }
  13.  
  14. // zapis / update do bazy
  15. if(zapis)
  16. {
  17. $this->_insert_id = (metoda zwraca id)
  18. return true;
  19. }
  20.  
  21. $this->_afected_rows = (metoda zwraca ilosc rekordów na ktore zadziałało zapytanie);
  22. return true;
  23. }
  24.  
  25. public function insert_id()
  26. {
  27. return $this->_insert_id;
  28. }
  29.  
  30. public function affected_rows()
  31. {
  32. return $this->_affected_rows();
  33. }
  34. }
Taki mały przykładzik jak trzymać się typu zwracanego w modelu. Wyjątki rzucają metody odpowiedzialne za obslugę bazy danych.
Inscure
Kod
class User
{
  protected $data;

  public function get($id)
  {
      if (isset($this->data[$id]))
      {
          return $this->data[$id];
      }

      throw new arrayException('Array index does not exist.');
  }
}


W takim przypadku nie da się przewidzieć, jaki typ danych zwróci metoda, bo przecież można zażądać ID użytkownika (int) albo jego loginu (string).
Wtedy pozostaje walidować zwróconą wartość w zależności od kontekstu użycia metody.

Ktoś zna lepsze rozwiązanie?
Zakładamy, że tych indeksów jest 200 i tworzenie dla każdego oddzielnej metody jest przerostem formy nad treścią.
Crozin
Lepszym rozwiązaniem jest nie tworzenie czegoś takiego.. Jeżeli masz użytkowników, to niech w aplikacji będą oni widoczni jako... użytkownicy, tj. obiekty typu Użytkownik.

Jednak co do samego przypadku. Tak, mogą zdarzyć się kolekcje danych o różnym typie, ale w miarę możliwości powinno się ich unikać.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.