Kaskadowanie metody
W programowaniu obiektowym kaskadowanie metod jest składnią , która umożliwia wywołanie wielu metod na tym samym obiekcie. Jest to szczególnie stosowane w płynnych interfejsach .
Na przykład w Dart kaskada:
a .. b () .. c ();
jest równoważne z indywidualnymi wywołaniami:
za . b (); za . c ();
Kaskadowanie metod jest znacznie mniej powszechne niż łączenie łańcuchowe metod — występuje tylko w kilku językach obiektowych, podczas gdy łączenie łańcuchowe jest bardzo powszechne. Formę kaskadowania można zaimplementować za pomocą łączenia łańcuchowego, ale ogranicza to interfejs; zobacz porównanie z łączeniem metod poniżej.
Aplikacja
Kaskadowanie to cukier składniowy , który eliminuje potrzebę wielokrotnego wymieniania obiektu. Jest to szczególnie wykorzystywane w płynnych interfejsach , które zawierają wiele wywołań metod w jednym obiekcie.
Jest to szczególnie przydatne, jeśli obiekt jest wartością długiego wyrażenia, ponieważ eliminuje potrzebę wielokrotnego wyświetlania wyrażenia lub używania zmiennej tymczasowej. Na przykład, zamiast wielokrotnego wymieniania wyrażenia:
za . b (). c (); za . b (). re ();
lub używając zmiennej tymczasowej:
n = za . b (); rz . c (); rz . re ();
kaskadowanie pozwala na jednorazowe zapisanie wyrażenia i wielokrotne użycie:
za . b ().. c () .. d ();
Porównanie z łańcuchem metod
Biorąc pod uwagę wywołanie metody ab()
, po wykonaniu wywołania, metoda kaskadowa ocenia to wyrażenie do lewego obiektu a
(z jego nową wartością, jeśli jest zmutowana), podczas gdy metoda łańcuchowa ocenia to wyrażenie do prawego obiektu.
- Łańcuch
Następujący łańcuch (w C++):
za . b (). c ();
jest równoważne prostej postaci:
b = za . b (); b . c ();
- Kaskadowe
Następująca kaskada (w Dart):
a .. b () .. c ();
jest równoważne prostej postaci:
za . b (); za . c ();
Kaskadę można zaimplementować w postaci łańcuchów, zwracając metody na obiekt docelowy (receiver, this
, self
). Wymaga to jednak, aby metoda była już zaimplementowana w ten sposób — lub oryginalny obiekt był owinięty w inny obiekt, który to robi — i aby metoda nie zwracała jakiejś innej, potencjalnie użytecznej wartości (lub nic, jeśli byłoby to bardziej odpowiednie, jak w ustawiacze). W płynnych interfejsach często oznacza to, że setery zwracają to zamiast niczego.
Języki
Pascala
W obrębie instrukcji składowej instrukcji with składniki (pola) zmiennej rekordowej określone klauzulą with mogą być oznaczane tylko przez ich identyfikator pola, tj. bez poprzedzania ich oznaczeniem całej zmiennej rekordowej. Klauzula with skutecznie otwiera zakres zawierający identyfikatory pól określonej zmiennej rekordu, dzięki czemu identyfikatory pól mogą występować jako identyfikatory zmiennych.
z datą zrób jeśli miesiąc = 12 to rozpocznij miesiąc := 1 ; rok := rok + 1 koniec else miesiąc := miesiąc + 1 { odpowiada } jeśli data . miesiąc = 12 , a następnie data rozpoczęcia . miesiąc := 1 ; data . rok := data .
rok + 1 koniec inaczej data . miesiąc := data . miesiąc + 1
Pogawędka
Zarówno łańcuchy metod, jak i kaskady zostały wprowadzone w Smalltalk ; większość późniejszych języków zorientowanych obiektowo zaimplementowała łańcuchy, ale niewiele z nich zaimplementowało kaskady. W Smalltalk operator średnika może być używany do wysyłania różnych wiadomości do tego samego obiektu:
własny listPane kolor nadrzędny : kolor czarny ; wzrost: 17 ; szerokość: 11
Porównaj z osobnymi wyciągami, zakończonymi kropką, również używając zmiennej jako skrótu:
| rodzic | rodzic := własny listPane rodzic . kolor macierzysty : Kolor czarny . wzrost rodzica : 17 . szerokość rodzica : 11 .
Jedna subtelność polega na tym, że wartość wywołania metody („wiadomości”) w kaskadzie jest nadal zwykłą wartością wiadomości, a nie odbiorcy. Jest to problem, gdy chcesz uzyskać wartość odbiornika, na przykład podczas budowania wartości złożonej. Można to obejść, używając specjalnej self
, która po prostu zwraca odbiornik:
Obiekt >> siebie ^ siebie
Na przykład metoda „dodaj obiekt do kolekcji” ( Collection>>add: anObject
) zwraca obiekt, który został dodany, a nie kolekcję. Tak więc, aby użyć tego w kaskadzie w instrukcji przypisania, kaskada musi kończyć się na you
, w przeciwnym razie wartością będzie tylko ostatni dodany element, a nie sama kolekcja:
all := OrderedCollection nowy dodaj: 5 ; dodać: 7 ; siebie .
Visual Basic
Visual Basic używa instrukcji With
, aby umożliwić dowolną liczbę wywołań metod lub dostępów do właściwości tego samego obiektu:
Z ExpressionThatReturnsAnObject . JakaśFunkcja ( 42 ) . Właściwość = wartość Zakończ na
With..End With
w języku Visual Basic można zagnieżdżać:
Z ExpressionThatReturnsAnObject . JakaśFunkcja ( 42 ) . Właściwość = wartość Z . Podobiekt . Podwłaściwość = inna wartość . Inna metoda ( 42 ) Koniec z Koniec z
Strzałka
Wśród nowszych języków Dart implementuje kaskady, używając podwójnej kropki …
„kaskadowej operacji wywołania metody”. W przeciwieństwie do Smalltalk, w Dart wartością wywołania metody kaskadowej jest odbiornik (obiekt bazowy), a nie wartością wywołania metody (niekaskadowej), a zatem nie ma potrzeby stosowania siebie
. Dart używa właściwości , a zatem zamiast używać składni metody dla metod pobierających i ustawiających ( foo.getBar(); foo.setBar(b);
), używa składni wartości pola/przypisania ( foo.bar; foo.bar = b;
) , a kaskady działają z przypisaniami:
a .. string = 'Witaj, świecie!' .. gotowe = prawda ;
jest równa:
za . string = 'Witaj, świecie!' ; za . zrobione = prawda ;
- Beck, Kent (1997). Wzorce najlepszych praktyk Smalltalk . Sala Prentice'a. ISBN 978-0134769042 .
Linki zewnętrzne
- Strzałka
- „ Metoda kaskad w rzutce ”, Gilad Bracha, 17 lutego 2012 r
- Milestone 1 Language Changes , „ Cascades ”, Bob Nystrom, lipiec 2012 r. (aktualizacja: marzec 2013 r.)