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