![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 163 Pomógł: 10 Dołączył: 9.11.2007 Skąd: Goleniów Ostrzeżenie: (0%) ![]() ![]() |
Witam
Moje pytanie do czego służy takie wywoływanie metody ?, kiedy się to stosuje może jakiś przykład klasy w której mamy takie zastosowanie bo nie mogę pojąc dlaczego metody są wywoływane w taki sposób czyli "$oop->funkcja()->funkcja()" Pozdrawiam -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Praktycznie w każdej klasie ma to zastosowanie. Ładnie to wygląda w kodzie i nie trzeba za każdym razem przepisywać referencji do obiektu.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 4 069 Pomógł: 497 Dołączył: 11.05.2007 Skąd: Warszawa ![]() |
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Moje pytanie do czego służy takie wywoływanie metody ? Takie czyli jakie? Przecież to najnormalniejsze w świecie wywołanie metody na obiekcie i następnie wywołanie kolejnej na zwróconym obiekcie.Cytat bo nie mogę pojąc dlaczego metody są wywoływane w taki sposób czyli "$oop->funkcja()->funkcja()" Kod a = 1 + 2 + 3; To jest ta sama sytuacja - wyrażenia można łączyć.VS a = 1; a += 2; a += 3; Jeżeli natomiast metody jednego obiektu mają być "łączone" wtedy mamy do czynienia z tak zwanym fluent interface |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 163 Pomógł: 10 Dołączył: 9.11.2007 Skąd: Goleniów Ostrzeżenie: (0%) ![]() ![]() |
Wielkie dzięki zrozumiałem o co chodzi, temat do zamknięcia.
Pozdrawiam -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 130 Pomógł: 11 Dołączył: 7.04.2003 Ostrzeżenie: (10%) ![]() ![]() |
Chyba warto by jeszcze dodać, że kodowanie w tym stylu CZĘSTO, nie jest dobrym rozwiązaniem. Można nawet powiedzieć że najczęściej będzie no oznaką słabego stylu kodowania.
Na tego typu Kod:
Anglosasi mają ukuty termin "train carsh". Wrak pociągu. Na chłopski rozum: z reguły warto sprawdzić czy metoda, która miała zwrócić obiekt faktycznie go zwróciła. Zwłaszcza jeżeli zwaracane obiekty zależą od aktualnego stanu bazy. Ponadto tego typu kod łamie podstawową zasade OOP o enkapsulacji obiektów. Staramy się Powiedzieć obiektowi co ma robić a nie wyciągać z niego bebechy a potem wyciągać bebechy z jego bebechów... Z drugiej strony jeżeli uznamy że nie działamy na obiektach a na strukurach danych to w pewnych specyficznych sytuacjach powyższe rozwiązanie jest to do przyjęcia. Np. Język DQL w ORM doctrine... Ten post edytował smentek 8.09.2010, 19:43:58 -------------------- .:SMENTEK:.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Czy ty wiesz do czego służy method chaining oraz wiesz co to wyjątki? Czy wyczytałeś na jakimś blogu i bez zastanowienia powtarzasz?
-------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 130 Pomógł: 11 Dołączył: 7.04.2003 Ostrzeżenie: (10%) ![]() ![]() |
Czy ty wiesz do czego służy method chaining oraz wiesz co to wyjątki? Czy wyczytałeś na jakimś blogu i bez zastanowienia powtarzasz? Czytałem na Twoim ![]() -------------------- .:SMENTEK:.
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Cytat Ponadto tego typu kod łamie podstawową zasade OOP o enkapsulacji obiektów. Staramy się Powiedzieć obiektowi co ma robić a nie wyciągać z niego bebechy a potem wyciągać bebechy z jego bebechów... Gdzie ty tu widzisz złamanie zasadę enkapsulacji? Ja osobiście nigdzie. Żeby było więcej niż dwa zdania dopowiem, że świat dotyka problem braku pszczół spowodowany dziwnym zjawiskiem uciekania wspomnianych osobników z uli. -------------------- |
|
|
![]()
Post
#10
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
~wookieb są dwa aspekty takiego kodowania. Jeśli stosujemy typowe fluent interface to jest OK.
Jednym słowem kolejne wywołania na (tym samym) obiekcie tej samej klasy są w porządku. Natomiast jeśli każda wywołanie jest na obiekcie innej klasy: $obiektKlasyA()->$obiektKlasyB()->$obiektKlasyC(); to już źle. I raczej powinno się tego unikać. |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Natomiast jeśli każda wywołanie jest na obiekcie innej klasy: $obiektKlasyA()->$obiektKlasyB()->$obiektKlasyC(); to już źle. I raczej powinno się tego unikać. Czyli rozumiem, że takie wywołanie jest złe?
Oczywiście istota problemu zaczyna się od getElement. Jeżeli tak to dlaczego? -------------------- |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
smentek wyczytał to nie z blogu, a najprawdopodobniej z książki Czysty kod
![]() ![]() -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Natomiast jeśli każda wywołanie jest na obiekcie innej klasy: $obiektKlasyA()->$obiektKlasyB()->$obiektKlasyC(); to już źle. I raczej powinno się tego unikać. Tak dla jasności, chodzi o przykładowo coś takiego:Przykład trochę lipny, ale mamy tu do czynienia z trzema typami jakiś tam obiektów (plus tablica). W sumie przy jakiś dłuższych tasiemcach drugi zapis mógłby być nieco zbyt skomplikowany, jednak z reguły kończą się one na dwóch, trzech, maks. czterech metodach. Czy poza ewentualną czytelnością zapisu jakieś inne ale są? Bo nieco mnie zaintrygowałeś. EDIT: Ojej... na przyszłość muszę odświeżać temat przed dodaniem odpowiedzi, a nie po 10 minutach odpisywać ![]() Ten post edytował Crozin 8.09.2010, 21:41:23 |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 130 Pomógł: 11 Dołączył: 7.04.2003 Ostrzeżenie: (10%) ![]() ![]() |
To prawda -=Peter=- w "Czysty Kod" był o tym rozdział.
![]() I prawdą jest to co piszę, że tego typu zapis niewłaściwie stosowany często kończy się kraksą. Dzięki za odzew. -------------------- .:SMENTEK:.
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Crozin - tutaj raczej chodzi o:
Chodzi o to, że w pierwszym przypadku odkrywamy implementację klasy PlainTextFile, to że obiekt tej klasy składa się z obiektów Line. Inny bardziej jaskrawy przykład:
ukrywamy to, że korzystamy z front controllera aby zrobić przekierowanie. Np. w testach jednostkowych łatwiej nam w razie potrzeby przesłonić jedną metodę aby zrobić jakąś zaślepkę, niż przesłaniać dwie metody. Poza tym taki kod jest bardziej odporny na zmiany, bo co jeśli metoda redirect z kontrolera (zwróconego przez getController) zostanie przeniesiona gdzieś indziej? Czekają nas zmiany w wielu miejscach, zamiast w jednym, gdyż klasy są mocno zależne od siebie. -------------------- |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Hmm... tworzenie takich metod proxy jest jak najbardziej OK w przypadku takich właśnie pierdół jak "redirect". Jednak w nieco bardziej skomplikowanych przypadkach (ot chociażby już ten daremny przykład z plikiem/liniami/słowami) to już raczej średni pomysł:
1. Obiekt "nadrzędny" (tu PlainTextFile) nagle musiałby zawierać dziesiątki metod proxy 2. Obiekt ten utraciłby swoje znaczenie - nagle (z punktu widzenia interfejsu) stałby się jakimś potworkiem od wielu rzeczy 3. Koniec końców i tak pewnie wystąpiłaby metoda getLines() Nie zgodziłbym się też tak do końca z tym odkrywaniem implementacji. To nie jest wyciąganie bebechów, tylko raczej wyciągnięcie udostępnianych danych (w tym przykładzie obiekty typu File pełniły niejako role kolekcji z dodatkowymi informacjami dot. tej kolekcji). Zgodzę się za to z tym, że takie ukrywanie "pół-bebechów" przynosi pewne korzyści - jednak ma to swoją cenę. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.08.2025 - 23:03 |