Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Traitsy
Forum PHP.pl > Inne > Hydepark
Stron: 1, 2
marcio
Cytat(Crozin @ 26.10.2011, 13:28:28 ) *
Posiada. Traitsy działają trochę jak preprocesor, "doklejają" odpowiedni kod z zew. zasobu. W wyniku pracy obie klasy są de facto dokładnie takie same.

Co jest w nim złego?

No wlasnie te traitsy dodaja metody w czasie interpretacji kodu?

Tez chcialbym wiedziec co jest nie tak w tym przykladzie...!?!

Cytat
To że klasa MyDefClass nie posiada fizycznie metody setSomething a implementuje interfejs który wymusza jej posiadanie.

I to wedlug ciebie jest chore?I psuje kompozycje?Zamiast implementowac ta metode potem w klasie dolaczasz traits-a ktory owa metoda juz posiada...ulatwienie jesli zrobione z glowa!

Cytat
Nie podoba mnie się ten sposób.

A co tu jest do podobania sie?Kodzenie to nie widzimisie nie podoba sie to nie uzywasz nie wiem jak uzywac nie uzywasz..dla mnie tez pewne mechanizmy np z python sa dziwne i ich nie uzywam bo poprostu nie widze takiej potrzeby!
wookieb
Niepotrzebny jest interfejs dla metody, która implementuje traits. Jest to kompletnie nadmiarowe.
Theqos
Cytat(cojack @ 26.10.2011, 11:32:58 ) *
marcio bo jak człowiek zrozumiał stwierdzenie: "Przekładaj kompozycję nad dziedziczenie" a tu Ci wyjeżdżają z "anty wzorcem" lepiej by AOP zrobili.

Przecież traitsy to jest kompozycja, a nie dziedziczenie.
marcio
@wookieb hmm czyli traits sam w sobie dziala jak interfejs dodajac go do klasy wiadomo ze ta bedzie implementowala metoda ktora potrzebujemy dobrze rozumiem?
wookieb
  1. class Test {
  2. use SomeTrait;
  3. }
  4.  
  5. $object = new Test();
  6. $object instanceof Test; // true
  7. $object instanceof SomeTrait: // true
  8. // w takim razie po co interfejs? Nic nie daje a jedynie istnieje "tak sobie".
  9. // W traitsie możesz mieć abstrakcyjne metody = pewien substytut interfejsu

Jeżeli ktoś znajdzie przykład sensownego zastosowanie interfejsu + traitsów to chętnie zobaczę smile.gif
Crozin
@wookieb: Nic nie jest tam nadmiarowe. Jak chcę mieć pewność, że obiekt implementuje interfejs to to jasno określam. A to czy implementacja tego interfejsu jest zrealizowana przy pomocy traitsa, jest odziedziczona czy "normalnie" napisana obchodzi mnie tyle co sytuacja dzieci w Afryce - w ogóle.

Cytat
No i to można załatwić komponentowo. Nie podoba mnie się ten sposób.
Częściowo tak - sam bym poszedł w tę stronę - ale nie do końca. Traitsy w przeciwieństwie do kompozycji umożliwiają Ci transparentne wydzielenie części implementacji. Kompozycja zaś wpływa na interfejs obiektów. Kiedy to się może przydać - sam nie wiem, nie jestem raczej zwolennikiem traitsów, bo w realnym świecie nie za bardzo jest je gdzie zastosować.
wookieb
Cytat(Crozin @ 26.10.2011, 13:47:31 ) *
@wookieb: Nic nie jest tam nadmiarowe. Jak chcę mieć pewność, że obiekt implementuje interfejs to to jasno określam. A to czy implementacja tego interfejsu jest zrealizowana przy pomocy traitsa, jest odziedziczona czy "normalnie" napisana obchodzi mnie tyle co sytuacja dzieci w Afryce - w ogóle.

Zależy od kontekstu i przeznaczenia. Osobiście nie pchałbym traitsów w takie miejsce.
Crozin
Właśnie teraz wpadło mi do głowy, że traitsy przede wszystkim mogłyby się przydać właśnie jako takie "code snippety" na kształt tego co pokazałem w przykładzie. Coś w stylu "hej, tutaj masz gotową podstawową implemetnację interfejsu". Miałoby to kilka zalet nad abstrakcyjną klasą robiącą za domyślną implementację.

Swoją drogą sprawdzanie czy obiekt korzysta z traitsa (instanceof) raczej nie ma racji bytu ze względu na fakt, że takim traitesem można manipulować (zmieniać widoczność metod czy ich nazwy). Chyba, że instanceof działałoby wyłącznie z nietkniętym traitsem.
wookieb
Nie możesz dynamicznie zmienić widoczności metod traitsa ani jego nazw. Takie coś tylko przez ReflectionAPI, które nikt w innych celach niż diagnostyczne/testów nie używa.
A sprawdzanie typu, który jest traitsem ma rację bytu. Przykład w 1 moim poście w tym temacie.
Crozin
@wookieb: http://php.net/manual/en/language.oop5.traits.php przykłady #5 i #6. Swoją drogą ReflectionAPI używa się poza celami testów - szczególnie, gdy trzeba zadecydować co odpalić na podstawie jakiś danych dostępnych tylko w czasie wykonywania.
wookieb
Nie zauważyłęm. Przepraszam sad.gif
Kajam się sad.gif
wiewiorek
Czyli jak mam:
  1. interface Testowy
  2. {
  3. public function KuKu();
  4. }
  5.  
  6. class Klasa implements Testowy
  7. {
  8. public function KuKu()
  9. {
  10. echo "KuKu";
  11. }
  12. }


to będę mógł zapisać tak:
  1. trait Testowy
  2. {
  3. public function KuKu()
  4. {
  5. echo "KuKu";
  6. }
  7. }
  8.  
  9. class Klasa
  10. {
  11. use Testowy;
  12. }


questionmark.gif

Ponadto w traitsach mogę deklarować zmienne np.:
  1. trait Testowy
  2. {
  3. private $zmienna1;
  4. private $zmienna2;
  5. private $zmienna3;
  6.  
  7. public function KuKu()
  8. {
  9. echo "KuKu";
  10. }
  11. }


questionmark.gif

A do tego metoda zaimplementowana w traitsie może być przesłonięta przez metodę w klasie wykorzystującej traitsa?


Przeglądnąłem kody paru blogów (przyznam, że patrzyłem tylko na kod, bo nie chciało mi się czytać, a poza tym nie mam php 5.4 żeby sprawdzić):
http://cogo.wordpress.com/2011/07/01/playi...-php-5-4alpha1/
http://davedevelopment.co.uk/2011/08/06/tr...ging-trait.html
i widzę, że traits może mieć nawet konstruktor:
  1. trait ParamsHandler {
  2. 05 private $params;
  3. 06
  4. 07 public function __construct(array $params) {
  5. 08 $this->setParams($params);
  6. 09 }
  7. 10
  8. 11 public function setParams(array $params) {
  9. 12 $this->params = $params;
  10. 13 }
  11. 14
  12. 15 public function getParams() {
  13. 16 return $this->params;
  14. 17 }
  15. 18
  16. 19 public function setParam($key, $value) {
  17. 20 $this->params[$key] = $value;
  18. 21 }
  19. 22
  20. 23 public function getParam($key) {
  21. 24 return (isset($this->params[$key]) ? $this->params[$key] : null);
  22. 25 }
  23. 26 }


Jakoś mi to przypomina klasę i wielodziedziczenie....
marcio
Z tego co sie orientuje to traitsy nie maja konstruktorow i nie mozna utworzyc ich istancji...przynajmniej tak jest w Scali chyba ze w php jest inaczej lub mozna to oszukac za pomoca operator AS -> https://bugs.php.net/bug.php?id=55554
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.