Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

4 Stron V   1 2 3 > »   
Reply to this topicStart new topic
> Traitsy, omg -_-
cojack
post
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Wiecie co, jak wejdą te Traitsy w php a to już nie długo, to jak najszybciej będę chciał się przebranżowić z php na inny język, najbliżej mi do c++ albo javy.

Straszne rzeczy się będą działy w php...
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Aj tam, a kto ci każe z nich korzystać? Nie chcesz to nie używaj.

Gorzej, gdy będziesz musial poprawiać kod po kimś, ale z tym zawsze są problemy niezależnie od traitsów a zalezne od wyobraźni pierwszego autora kodu (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
cojack
post
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Przecież te Traitsy nie będą miały nic wspólnego z polimorfizmem, co innego gdyby się dało użyć traitsu tylko takiego samego typu interfejsu, ale nie, tam sobie będziesz mógł zrobić latająco-szczekający-pływający but.
Go to the top of the page
+Quote Post
marcio
post
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


tez nie widze korzysci tego mechanizmu...jedyne co to bedzie spaghetti code....czy jest odpowiednik tych traits'ow w python'ie czy C#?!?Pytam bo moze jest a nie wiem chociaz watpie
Go to the top of the page
+Quote Post
el.pablo.72
post
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 1.11.2010

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


Nie przesadzajcie, po pierwsze co całkiem użyteczny mechanizm jeśli będzie z głową używany (jak wszystko w programowaniu), po drugie od czego jest phpDoc, trzeba pisać komentarze.
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wymienię parę elementów, które tylko skorzystają na traitsach.
EventDispatcher
Iterator
Collection
Mocki/Stuby

Dlaczego?
  1. trait EventDispatcher {
  2. // cos
  3. }
  4.  
  5. class Module {
  6.  
  7. }
  8.  
  9. class SpecialModel extends Module {
  10. use EventDispatcher; // bo np tylko w tym module jest mi potrzebny
  11. }

Oczywiście php znów spieprzył sprawę ponieważ traitsy powinno móc dodawać przy tworzeniu instancji klasy
  1. $object = new Module with EventDispatcher; // Tego nie ma w php a powinno być


Jak naprawdę głęboko się zastanowicie to Traitsy odwalają za was cała masę roboty. Należy ich tylko umiejętnie używać.

Jak wyglądałby powyższy przykład w aktualnym php?
  1.  
  2. interface EventDispatcher_Interface {
  3. // metody
  4. }
  5.  
  6. class Module {
  7.  
  8. }
  9.  
  10. class SpecialModule extends Module implements EventDispatcher_Interface {
  11. // i tutaj PRZEPISUJESZ (tak dokładnie) implementację metod event dispatchera
  12. // ale po co? marnujesz pamięć a traitsy zrobią to za Ciebie znacznie wydajniej i szybciej!
  13. }


Zastanówcie się zanim zaczniecie wieszać psy nad rzeczami, które po prostu nie rozumiecie.

Nie zamierzam dyskutować nad sensem traitsów z osobami, które nie wyszły z poziomu "Po co obiekty? Przecież wystarczą mi tablice i prefixowane funkcje!" oraz tych które nie rozumieją, że przy tworzeniu klas bardzo ważny jest ich minimalizm a nie pakowanie całej masy funkcjonalności (bardzo często nie korespondujących z założeniem klasy) bo "potem mogą się przydać". To takie uprzedzenie przed głupimi postami właśnie w powyższym stylu (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
ixpack
post
Post #7





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

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


Ja Panowie może i nie mam tyle doświadczenia co Wy i chciałem się zapytać jak interpretujecie poniższy cytat:
"A Trait is intended to reduce some limitations of single inheritance by enabling a developer to reuse sets of methods freely in several independent classes living in different class hierarchies."
- interpretacja to nie tłumaczenie...

IMO mogą się przydać w mniejszych i większych aplikacjach. Gdy masz swoje biblioteki klas, lub kogoś klasy i chciałbyś użyć po części z wcześniejszych kodów - używasz traits i masz "jakby nową klasę" z funkcjami kilku wcześniej napisanych. Taki pakiet funkcji wyciągniętych ze starszego kodu.
Skomplikowałem to :/.
Czasem szybciej coś zbudować mając wszystko w jednym miejscu, które Tobie pasuje. Fakt można zrobić wtedy kombajn do wszystkiego i niczego, ale np. (ja tak myślę i prosiłbym o nakierowanie - bez wulgaryzmów hehe o ile błędnie myślę):
Mam wiele klas, w nich wiele metod. Buduję nową aplikację i potrzebuje po jednej metodzie pasującej do mojej przyszłej aplikacji z każdej klasy - używam traits, aby mieć wszystko w jednym miejscu i później już z górki. Trochę to takie na siłę i pewnie nie będę tego używał - podobnie jak systemów szablonu.

Mi marzy się framework, który można po swojemu ustawić. Tzn. Jakaś baza softu + klasy, funkcje pisane przez wszystkich innych i mnie. Mały framework, ale wariat.
Te traits'y mogłyby takiemu frameworkowi pomóc. Np. wyobraźcie sobie wiele wiele wiele klas w chmurze, z chmury te kawałki klas sobie doklejasz do swojego serwisu poprzez panel administracyjny -> zagrożenie olbrzymie, ale w teorii fajnie by to funkcjonowało. Ale wiadomo teoria z praktyką ma nie za dużo wspólnego i IMO traitsy będą, nie każdy tego będzie używał, ale czy to tak wielce zmienia cały PHP żeby od niego odchodzić?

Ten post edytował ixpack 25.10.2011, 12:57:12
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(cojack @ 25.10.2011, 13:08:49 ) *
Straszne rzeczy się będą działy w php...

Już się dzieją straszne rzeczy w php-cu nawet pomimo możliwości jaki oferuje. Ale to nie wynika koniecznie z języka ale naturalnego schematu "Wpadnięcia w sidła sukcesu". To tak samo jak z internetem i trollami.
Powód edycji: [wookieb]:
Go to the top of the page
+Quote Post
cojack
post
Post #9





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Nie dali wielodziedziczenia bo można byłoby burdel robić, to dają traitsy by robić jeszcze większy. Nie no dla mnie osom.
Go to the top of the page
+Quote Post
scanner
post
Post #10





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Cytat(wookieb @ 25.10.2011, 13:51:57 ) *
Wymienię parę elementów, które tylko skorzystają na traitsach.(...) Zastanówcie się zanim zaczniecie wieszać psy nad rzeczami, które po prostu nie rozumiecie. (...)

Mogę Cię cytować?
Go to the top of the page
+Quote Post
wookieb
post
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(scanner @ 25.10.2011, 14:17:04 ) *
Mogę Cię cytować?

Ale o co chodzi?
Go to the top of the page
+Quote Post
hwao
post
Post #12


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Pomysł połączenia interfejsu + traits (w jedno) to dopiero chory pomysł - interfejs powinien pozostać interfejsem, inaczej stal by się klasą.

Cytat("cojack")
Wiecie co, jak wejdą te Traitsy w php a to już nie długo, to jak najszybciej będę chciał się przebranżowić z php na inny język, najbliżej mi do c++ albo javy.

Przecież w Javie masz multidziedziczenie którego 'ulepszoną wersją' i rozwiązująca wiele problemów as własnie traits.
Ponadto:
"Traits class, a template class in the C++ programming language"
Więc proszę rozwiń jakoś swoją myśl.

A tak korzystając z traits możesz w klasie wskazać że korzystasz z konkretnego interfejsu (który jest już) i korzystając z triats zaimplementować go z głową.
Od jakiegoś czasu jest w PHP GoTo i jak była wprowadzana to ludzie też mówili że będzie masakra.
W gronie dobrych programistów Traits to świetne rozwiązanie w projektach, jeżeli myślisz ze czas zmienić język z tego powodu że ktoś będzie tego głupio używał, może powinieneś pomyśleć o zmianie ekipy?
Powód edycji: [hwao]:
Go to the top of the page
+Quote Post
scanner
post
Post #13





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Cytat(wookieb @ 25.10.2011, 14:20:33 ) *
Ale o co chodzi?

O to, że Twój post bardzo mi się spodobał i jełsi z kimś o traitsach będę dyskutował, to na pewno się na niego będę powoływał - obrazuje bowiem też moje zdanie na temat tego "ficzera"
Go to the top of the page
+Quote Post
wookieb
post
Post #14





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytuj cytuj (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
marcio
post
Post #15





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


poczytalem troche o tych traitsach i na pierwszy rzut oka to wydaja sie niepotrzebne jednak ten wpis http://blog.wsoczynski.pl/2011/03/22/jezyk...hp-pt-3-traits/ rozjasnil mi troche idee ciekawa ta roznica pomiedzy dziedziczeniem poziomym a pionowym
Go to the top of the page
+Quote Post
blooregard
post
Post #16


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Cytat(wookieb @ 25.10.2011, 14:39:06 ) *


Dodaj sobie do stopki: "@wookieb - cytowany przez najlepszych" (IMG:style_emoticons/default/biggrin.gif) (IMG:style_emoticons/default/biggrin.gif) (IMG:style_emoticons/default/biggrin.gif)


Go to the top of the page
+Quote Post
by_ikar
post
Post #17





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Nie no jak ktoś ma zamiar wszędzie, do każdej jednej klasy używać triatsa to będzie to przesada. Ale tak jak są podobne obiekty, które mają podobną funkcjonalność triats dla nich jest całkiem fajnym rozwiązaniem. No tak mamy dziedziczenie, klasy abstrakcyjne, problem w tym że nie da się więcej niż jednej klasy dziedziczyć. A ludzie co robią konkretne spaghetti to pewnie nawet nie będą wiedzieć o takiej funkcjonalności (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
nrm
post
Post #18





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


Boje się traitsów po phpcon... (IMG:style_emoticons/default/wink.gif) -> https://twitter.com/#!/supernrm/status/...483177193943041
Go to the top of the page
+Quote Post
marcio
post
Post #19





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


@normanos carpe diem

btw:
widze ze php idzie na dobra droge nawet type hinting wprowadzili nie jest zle

Ten post edytował marcio 25.10.2011, 14:05:26
Go to the top of the page
+Quote Post
blooregard
post
Post #20


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Cytat(marcio @ 25.10.2011, 15:03:54 ) *
@normanos carpe diem

btw:
widze ze php idzie na dobra droge nawet type hinting wprowadzili nie jest zle



Przydałby się ten type hinting do każdego typu danych, a nie tylko Object i Array (IMG:style_emoticons/default/wink.gif)
Ale to też podobno ma być.
Go to the top of the page
+Quote Post
marcio
post
Post #21





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


juz jest commit dla wszystkich typow ale to chyba jakas alpha czy cos na tym blogu co podalem link wyzej.

edit:
http://blog.wsoczynski.pl/2010/05/21/typowane-funkcje-w-php/

Ten post edytował marcio 25.10.2011, 16:00:51
Go to the top of the page
+Quote Post
cojack
post
Post #22





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Cytat(hwao @ 25.10.2011, 14:22:27 ) *
Pomysł połączenia interfejsu + traits (w jedno) to dopiero chory pomysł - interfejs powinien pozostać interfejsem, inaczej stal by się klasą.


Przecież w Javie masz multidziedziczenie którego 'ulepszoną wersją' i rozwiązująca wiele problemów as własnie traits.
Ponadto:
"Traits class, a template class in the C++ programming language"
Więc proszę rozwiń jakoś swoją myśl.

A tak korzystając z traits możesz w klasie wskazać że korzystasz z konkretnego interfejsu (który jest już) i korzystając z triats zaimplementować go z głową.
Od jakiegoś czasu jest w PHP GoTo i jak była wprowadzana to ludzie też mówili że będzie masakra.
W gronie dobrych programistów Traits to świetne rozwiązanie w projektach, jeżeli myślisz ze czas zmienić język z tego powodu że ktoś będzie tego głupio używał, może powinieneś pomyśleć o zmianie ekipy?


Panie Hwao Ty mi tu nie myl typów generycznych z traitsami, ja Cię bardzo proszę.

@edit aa i w Javie nie ma wielodziedziczenia.

Ten post edytował cojack 25.10.2011, 15:24:53
Go to the top of the page
+Quote Post
Crozin
post
Post #23





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@cojak: W jaki niby sposób Traitsy miałby niszczyć polimorfizm czy inne cechy kodu? Przecież to nic innego jak rozbicie kodu klasy na kilka plików / bloków. Ostatecznie o ile dobrze się orientuję obiekt utworzony na podstawie klasy korzystającej z traitstów będzie zachowywał się dokładnie tak samo jak ten utworzony na podstawie klasy gdzie zamiast use Abc będzie przekopiowany kod traitsa(u?) Abc. No może w Reflection API pojawi się kilka nowych metod pozwalających taką zmianę wychwycić.

Nie mniej jednak sam mocno wątpię w to, by ten bajer cokolwiek zmienił. Po prostu w normalnym kodzie, zbyt rzadko zdarza się by w różnych klasach powtarzał się dokładnie ten sam fragment implementacji czegoś. Co więcej, gdy już taki fragment się znajdzie trzeba się będzie mocno zastanowić czy jego wydzielenie ma po prostu sens. W końcu w miarę normalny kod "wykorzystuje" zasadę DRY, a traits'y potrzebują takich potworków by mieć w ogóle co zastępować.

@wookieb: Gdyby traitsy wybierało się w momencie tworzenia obiektu to by była dopiero tragedia. Koniec, końców PHP stara się implementować klasyczny, oparty na klasach, statyczny model obiektowy. Cała reszta języka jest do takiego modelu przystosowana oraz programiści są do takiego modelu przyzwyczajeni (chociaż w sumie patrząc po ilości __get'ów i __set'ów tutaj na forum mam co do tego spore wątpliwości). W Scali, którą się chyba inspirowałeś pisząc to, też nie wygląda to tak z tego co się orientuję.

Ten post edytował Crozin 25.10.2011, 17:24:49
Go to the top of the page
+Quote Post
Speedy
post
Post #24





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

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


Traitsy, to nie jest wcale taki głupi pomysł. Można je potraktować chociażby jako pewien ekwiwalent dla wzorca dekorator. Można dzięki temu skorzystać z zalet wielodziedziczenia znanego z C++ bez konieczności wprowadzania go. Samo wielodziedziczenie nie jest najlepszym pomysłem, ale traitsy, jak sama nazwa wskazuje, dodają nowe cechy do istniejących klas. W niektórych sytuacjach może to być przydatne. Dotychczas, aby skorzystać z takich możliwości trzeba było albo tworzyć złożoną strukturę klas, które po sobie dziedziczą, albo zagnieżdżać obiekty w klasach. Dodatkowo, możemy też zmieniać widoczność metod w klasach. Nikt nikomu nie każe korzystać z traitsów, ale dodają one nową funkcjonalność do PHP i moim zdaniem jest to fajna sprawa.
Go to the top of the page
+Quote Post
Crozin
post
Post #25





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@Speedy: Tak na moje oko, w większości przypadków o jakich piszesz w powyższym poście doszłoby do złamania jednej z fundamentalnych zasad OOP - jeden obiekt, jedno zadanie. A akurat złamanie jej, w przeciwieństwie do wielu innych "zasad OOP", z definicji prowadzi do beznadziejnego kodu.
Go to the top of the page
+Quote Post
lukasz_test
post
Post #26





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 25.10.2011

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


Cytat(hwao @ 25.10.2011, 14:22:27 ) *
Pomysł połączenia interfejsu + traits (w jedno) to dopiero chory pomysł - interfejs powinien pozostać interfejsem, inaczej stal by się klasą.


Przecież w Javie masz multidziedziczenie którego 'ulepszoną wersją' i rozwiązująca wiele problemów as własnie traits.
Ponadto:
"Traits class, a template class in the C++ programming language"
Więc proszę rozwiń jakoś swoją myśl.

A tak korzystając z traits możesz w klasie wskazać że korzystasz z konkretnego interfejsu (który jest już) i korzystając z triats zaimplementować go z głową.
Od jakiegoś czasu jest w PHP GoTo i jak była wprowadzana to ludzie też mówili że będzie masakra.
W gronie dobrych programistów Traits to świetne rozwiązanie w projektach, jeżeli myślisz ze czas zmienić język z tego powodu że ktoś będzie tego głupio używał, może powinieneś pomyśleć o zmianie ekipy?


Dla mnie traitsy to właśnie wielodziedziczenie czego brakuje w php a jest w innych językach.
Go to the top of the page
+Quote Post
Crozin
post
Post #27





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@lukasz_test: Traitsy to nie wielodziedziczenie - i całe szczęście.
Go to the top of the page
+Quote Post
marcio
post
Post #28





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Cytat(Crozin @ 25.10.2011, 19:43:17 ) *
@lukasz_test: Traitsy to nie wielodziedziczenie - i całe szczęście.

Ale w pewnym sensie moze lepiej odwalac ta role niz interfejsy ktore jak do tej pory w php byly uznawane za "ulomne" wielodzdziczenie.

A dwa mogloby sie to przydac przy robieniu wyspecjalozowanych klas do jakis czynnosci ktore na podstawie danego traits'u zahowywalyby sie w pewny sposob.Lub moglyby pomoc przy tworzeniu filtrow jesli mozna jakos dynamicznie ladowac traitsy...
Go to the top of the page
+Quote Post
Crozin
post
Post #29





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Interfejsy nigdy nie miały służyć za wielodziedziczenie (implementacji). Zostały stworzone właśnie w celu pozbycia się wielodziedziczenia.

Ad. "A dwa": Też niespecjalnie się do tego nadają. Można to, o ile Cię dobrze zrozumiałem, z pełnym powodzeniem zrealizować przy pomocy "normalnego" kodu. Jeżeli chcesz drążyć temat pokaż jakiś pseudokod ilustrujący Twoje założenie.
Go to the top of the page
+Quote Post
marcio
post
Post #30





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Skoro sa to cechy to wedlug mnie jako filtr bbcode te traitsy lepiej sie zdaja niz jaka kolwiek klasa czy interfejs...poprostu dodamy odpowiednia ceche do obiektu/metody...
  1. <?php
  2.  
  3. trait BbCodeParse
  4. {
  5. public function parse($object)
  6. {
  7. return '<code>'.$object.'</code>';
  8. }
  9. }
  10.  
  11. class Comments
  12. {
  13. //tutaj np wstrzykiwanie nazwy traits'u dynamicznie za pomoca jakies konfiracji czegokolwiek
  14. use BBCodeParse { parse as protected; }
  15.  
  16. public function getComment()
  17. {
  18. //bla bla pobieramy i takie tam
  19. return $this -> parse($string)
  20. }
  21. }
  22.  
  23. ?>

Byc moze zle to interpretuje nie potrafie tak tego teraz pokazac na kodzie ale z samej idei czym sa traits'y ja to tak odbieram.
Owszem mozna to zrobic za pomoca zwyklej klasy jak juz wspomniales ale to wedlug mnie byloby bardziej trafne...

Cytat
Interfejsy nigdy nie miały służyć za wielodziedziczenie (implementacji). Zostały stworzone właśnie w celu pozbycia się wielodziedziczenia.

Nie powiedzialem ze mialy do tego sluzyc lecz tylko symulowac w pewnym sensie ich dzialanie czyli dajac nam mozliwosc wymuszania na pewych klasach uzywania pewnego "intergejsow" metod.
Go to the top of the page
+Quote Post
Crozin
post
Post #31





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@marcio: Dependency Injection - domyślam się, że wiesz co to jest. Mam jeszcze wymieniać dlaczego jest znacznie lepsze od tego co podałeś?
Go to the top of the page
+Quote Post
marcio
post
Post #32





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Wiem co to jest DI

Wiesz jak masz chwile czasu podaj argumenty dlaczego jest lepsze...nie twierdze ze jest zle ale jako ze nie implementowalem nigdy traits'ow nie wiem jakie niosa korzysci i wady...a z samego pseudo kodu duzo wyniesc nie potrafie (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Crozin
post
Post #33





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Coś takiego jak parser BBCode to rozbudowana struktura wielu obiektów - nie wiem skąd w ogóle pomysł by takie coś realizować trailsami.
2. Różnica niemal taka sama jak przy korzystaniu z Singletona - tworzenie "z dupy" zależności, globalnych odwołań do innych zasobów, brak możliwości wygodnego testowania, ponownego używania kodu itp. itd.

Go to the top of the page
+Quote Post
wookieb
post
Post #34





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(Crozin @ 25.10.2011, 18:19:19 ) *
W Scali, którą się chyba inspirowałeś pisząc to, też nie wygląda to tak z tego co się orientuję.

A właśnie wygląda to tak.
http://www.artima.com/scalazine/articles/s...it_pattern.html
Go to the top of the page
+Quote Post
marcio
post
Post #35





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Cytat
1. Coś takiego jak parser BBCode to rozbudowana struktura wielu obiektów - nie wiem skąd w ogóle pomysł by takie coś realizować trailsami.

Nie wydaje mi sie zeby tego typu argument byl trafny co z tego ze ma wiele obiektow?
Go to the top of the page
+Quote Post
cojack
post
Post #36





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Cytat(Crozin @ 25.10.2011, 18:19:19 ) *
@cojak: W jaki niby sposób Traitsy miałby niszczyć polimorfizm czy inne cechy kodu? Przecież to nic innego jak rozbicie kodu klasy na kilka plików / bloków. Ostatecznie o ile dobrze się orientuję obiekt utworzony na podstawie klasy korzystającej z traitstów będzie zachowywał się dokładnie tak samo jak ten utworzony na podstawie klasy gdzie zamiast use Abc będzie przekopiowany kod traitsa(u?) Abc. No może w Reflection API pojawi się kilka nowych metod pozwalających taką zmianę wychwycić.


Kurde, dochodzę do wniosku że fora to nie są dobre miejsca na prowadzenie takich dyskusji, bo mnie się nie chce opisywać tego wszystkiego ;/ Sorry Crozin, ale na prawdę dużo mam przeciwko traitsom a nie opiszę tego tutaj. Dla mnie to jest anty OOP.

Pomyśl sobie że masz strategię, przekazujesz sobie obiekt i wywołujesz metodę której nie ma nawet interfejs! To będzie dopiero...
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #37





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Przecież musisz zadeklarować że dany obiekt używa danego traits, więc należy to do interfejsu tego obiektu. Obecnie więcej szkody przynoszą metod magiczne, zwłaszcza __call(). To dopiero gmatwa interfejs. Traits w zamyśle ma magię wyeliminować.
Kolejna sprawa, podnoszona już tutaj, nikt nie zmusza do korzystania z tego. Na poziomie opracowywania standardu kodowania w firmie/grupie można traitsy wyeliminować.
Jeśli chodzi o to, że ludzie zaczną "na pałę" tego używać i zrobi się syf, to bym się nie martwił, bo to ich kod i ich problem.
Go to the top of the page
+Quote Post
Crozin
post
Post #38





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@cojack: Zakładasz wątek w charakterze "OMFG Traitsy nadchodzą(IMG:style_emoticons/default/exclamation.gif) ! Będzie syf i burdel!!!!" po czym na prośbę o podanie konkretów dlaczego tak uważasz piszesz, że Ci się nie chce, a dyskusje z nami są bez sensu. Czego Ty oczekiwałeś po tym wątku?

Cytat
Pomyśl sobie że masz strategię, przekazujesz sobie obiekt i wywołujesz metodę której nie ma nawet interfejs! To będzie dopiero...
Ty chyba nie rozumiesz czym traitsy mają być w założeniu.
  1. interface SomethingAwareInterface {
  2. public function setSomething(Someting $something);
  3. }
  4.  
  5. interface CommandInterface {
  6. public function execute();
  7. }
  8.  
  9. trait SomethingAwareTrait {
  10. private $something;
  11.  
  12. public function setSomething(Someting $something) {
  13. $this->something = $something;
  14. }
  15. }
  16.  
  17. class MyAbcClass implements SomethingAwareInterface, CommandInterface {
  18. use SomethingAwareTrait;
  19.  
  20. public function execute() {
  21. ...
  22. }
  23. }
  24.  
  25. class MyDefClass implements SomethingAwareInterface, CommandInterface {
  26. private $something;
  27.  
  28. public function setSomething(Someting $something) {
  29. $this->something = $something;
  30. }
  31.  
  32. public function execute() {
  33. ...
  34. }
  35. }
  36.  
  37. // ------------------
  38.  
  39. public function run(CommandInterface $command) {
  40. if ($command instanceof SomethingAwareInterface) {
  41. $command->setSomething($this->something);
  42. }
  43.  
  44. $command->execute();
  45. }
Klasy MyAbcClass i MyDefClass są "tak samo OOP". No chyba, że powiesz dlaczego niby nie.

PS. Tak jakbyś nie zauważył, również nie jestem zwolennikiem traitstów. W powyższym przykładzie ich użycie naprawdę niczego nie daje.
Go to the top of the page
+Quote Post
cojack
post
Post #39





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


  1. class MyAbcClass implements SomethingAwareInterface, CommandInterface {
  2. use SomethingAwareTrait;
  3.  
  4. public function execute() {
  5. ...
  6. }
  7. }


to ścierwo zadziała? to mnie dobiłeś (IMG:style_emoticons/default/sleep.gif)

Ten post edytował cojack 26.10.2011, 10:24:33
Go to the top of the page
+Quote Post
marcio
post
Post #40





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Nie powiela sie kodu...ale w takim razie to moznaby klase abtrakcyjna uzyc..wedlug mnie ich uzycie wyjdzie w praniu jak wyjdzie php 5.4 z traitsami i ludzie zanczna ich uzywac i o nich pisac.

Cytat
Jeśli chodzi o to, że ludzie zaczną "na pałę" tego używać i zrobi się syf, to bym się nie martwił, bo to ich kod i ich problem.

I tak bedzie ich uzywalo 5% koderow z czego 4% miejmy nadzieje ze uzyje je z glowa a nie na chama jak juz wspominaliscie

btw:
@cojack ale jestes uparty...zawsze jestes przeciw wszystkim i wszystkiemu (IMG:style_emoticons/default/wink.gif) ciekawe...

Ten post edytował marcio 26.10.2011, 10:26:29
Go to the top of the page
+Quote Post
nospor
post
Post #41





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
to ścierwo zadziała

@cojack zmień ton wypowiedzi, albo możliwość wypowiadania zostanie ci zabrana.
Na dodatek zakładasz wątek o czymś, a gdy ludzie zaczynają przedstawiać kontraargumenty to wyjeżdzasz z dziecinnym tekstem:
Cytat
Kurde, dochodzę do wniosku że fora to nie są dobre miejsca na prowadzenie takich dyskusji, bo mnie się nie chce opisywać tego wszystkiego

NIe chcesz dyskutować to nie dyskutuj. Nikt ci nie każe. Idź napisz arta na blogu i zastrzeż ze nie zaakceptujesz komentarzy, które z Tobą się nie zgadzają i po sprawie. Oszczędzisz nam i sobie nerwów.
Go to the top of the page
+Quote Post
cojack
post
Post #42





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


Cytat(marcio @ 26.10.2011, 11:24:58 ) *
btw:
@cojack ale jestes uparty...zawsze jestes przeciw wszystkim i wszystkiemu (IMG:style_emoticons/default/wink.gif) ciekawe...


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.
Go to the top of the page
+Quote Post
Crozin
post
Post #43





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@cojack: Możesz podać jakikolwiek konkret? Co (w tym moim śmiesznym przykładzie) w klasie MyAbcClass jest anttywzorcem, antyoop czy po prostu złe względem klasy MyDefClass? Pomijając, że ta ostatnia jest wygoniejsza w prawdziwym użyciu. Jakbyś jeszcze to w dwóch - trzech zdaniach uzasadnił to już w ogóle by bajka była.

Ten post edytował Crozin 26.10.2011, 10:36:41
Go to the top of the page
+Quote Post
cojack
post
Post #44





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


To że klasa MyDefClass nie posiada fizycznie metody setSomething a implementuje interfejs który wymusza jej posiadanie.
Go to the top of the page
+Quote Post
wookieb
post
Post #45





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Posiada. Dzięki Traitsom. A tak naprawdę to crozin podał zły przykład.

Ale powtarzam i powtarzałem. To nie psuje oop. Da się taką samą funkcjonalność zrealizować bez traitsów tylko w mniej wydajny sposób, więc jak się zastanowisz to NIC nie jest zachwiane.
Go to the top of the page
+Quote Post
cojack
post
Post #46





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


DI enginowy?
Go to the top of the page
+Quote Post
wookieb
post
Post #47





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




To nie ma kompletnie NIC wspólnego z DI.
Go to the top of the page
+Quote Post
cojack
post
Post #48





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


A to ciekawe.
Go to the top of the page
+Quote Post
Crozin
post
Post #49





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
To że klasa MyDefClass nie posiada fizycznie metody setSomething a implementuje interfejs który wymusza jej posiadanie.
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.

Cytat
A tak naprawdę to crozin podał zły przykład.
Co jest w nim złego?
Go to the top of the page
+Quote Post
cojack
post
Post #50





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.


No i to można załatwić komponentowo. Nie podoba mnie się ten sposób.
Go to the top of the page
+Quote Post
marcio
post
Post #51





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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!

Ten post edytował marcio 26.10.2011, 12:35:06
Go to the top of the page
+Quote Post
wookieb
post
Post #52





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Niepotrzebny jest interfejs dla metody, która implementuje traits. Jest to kompletnie nadmiarowe.
Go to the top of the page
+Quote Post
Theqos
post
Post #53





Grupa: Zarejestrowani
Postów: 49
Pomógł: 8
Dołączył: 5.12.2008

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


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.
Go to the top of the page
+Quote Post
marcio
post
Post #54





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


@wookieb hmm czyli traits sam w sobie dziala jak interfejs dodajac go do klasy wiadomo ze ta bedzie implementowala metoda ktora potrzebujemy dobrze rozumiem?
Go to the top of the page
+Quote Post
wookieb
post
Post #55





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  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ę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Crozin
post
Post #56





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@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ć.
Go to the top of the page
+Quote Post
wookieb
post
Post #57





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
Crozin
post
Post #58





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #59





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
Crozin
post
Post #60





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@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.
Go to the top of the page
+Quote Post
wookieb
post
Post #61





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie zauważyłęm. Przepraszam (IMG:style_emoticons/default/sad.gif)
Kajam się (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
wiewiorek
post
Post #62





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

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


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. }


(IMG:style_emoticons/default/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. }


(IMG:style_emoticons/default/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....

Ten post edytował wiewiorek 26.10.2011, 18:55:32
Go to the top of the page
+Quote Post
marcio
post
Post #63





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post

4 Stron V   1 2 3 > » 
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: 1.10.2025 - 12:37