Metod kaskad

I objektorienterad programmering är metodkaskadsyntax som gör att flera metoder kan anropas på samma objekt . Detta tillämpas särskilt i flytande gränssnitt .

Till exempel, i Dart , kaskaden:


  a  ..  b  ()  ..  c  (); 

motsvarar de enskilda samtalen:


 a  .  b  ();  a  .  c  (); 

Metodkaskadkoppling är mycket mindre vanligt än metodkedjning – det finns bara i en handfull objektorienterade språk, medan kedja är mycket vanligt. En form av kaskadkoppling kan implementeras med hjälp av kedja, men detta begränsar gränssnittet; se jämförelse med metodkedja nedan.

Ansökan

Cascading är syntaktisk socker som eliminerar behovet av att lista objektet upprepade gånger. Detta används särskilt i flytande gränssnitt , som har många metodanrop på ett enda objekt.

Detta är särskilt användbart om objektet är värdet av ett långt uttryck, eftersom det eliminerar behovet av att antingen lista uttrycket upprepade gånger eller använda en temporär variabel. Till exempel, istället för att antingen lista ett uttryck upprepade gånger:


 a  .  b  ().  c  ();  a  .  b  ().  d  (); 

eller använda en temporär variabel:

  

 n  =  a  .  b  ();  n  .  c  ();  n  .  d  (); 

kaskad gör att uttrycket kan skrivas en gång och användas upprepade gånger:


      a  .  b  ()..  c  ()  ..  d  (); 

Jämförelse med metodkedja

Givet ett metodanrop ab() , efter exekvering av anropet, utvärderar metodkaskad detta uttryck till vänster objekt a (med dess nya värde, om muterat), medan metodkedja utvärderar detta uttryck till det högra objektet.

Kedja

Följande kedja (i C++):

 a  .  b  ().  c  (); 

motsvarar den enkla formen:

  
 b  =  a  .  b  ();  b  .  c  (); 
Cascading

Följande kaskad (i Dart):


  a  ..  b  ()  ..  c  (); 

motsvarar den enkla formen:


 a  .  b  ();  a  .  c  (); 

Kaskadkoppling kan implementeras i termer av kedja genom att metoderna returnerar målobjektet (mottagare, detta , själv ). Detta kräver dock att metoden redan implementeras på detta sätt – eller att det ursprungliga objektet lindas in i ett annat objekt som gör detta – och att metoden inte returnerar något annat, potentiellt användbart värde (eller ingenting om det skulle vara mer lämpligt, som i sättare). I flytande gränssnitt innebär detta ofta att setters returnerar detta istället för ingenting.

språk

Pascal

Inom komponentsatsen för with-satsen kan komponenterna (fälten) av postvariabeln som specificeras av with- satsen endast betecknas med deras fältidentifierare, dvs utan att föregå dem med beteckningen för hela postvariabeln. With-satsen öppnar effektivt räckvidden som innehåller fältidentifierare för den angivna postvariabeln, så att fältidentifierare kan förekomma som variabelidentifierare.

      
        
                 
         



        
                 
          med  datum  gör  om  månad  =  12  sedan  börjar  månad  :=  1  ;  år  :=  år  +  1  slut  annan  månad  :=  månad  +  1  { motsvarar }  om  datum  .  månad  =  12  sedan  startdatum  .  _  månad  :=  1  ;  datum  .  år  :=  datum  .  år  +  1  annat  slutdatum  .  _  månad  :=  datum  .  månad  +  1 

Småprat

Metodkedjor och kaskader introducerades båda i Smalltalk ; de flesta efterföljande objektorienterade språk har implementerat kedjor, men få har implementerat kaskader. I Smalltalk kan semikolonoperatorn användas för att skicka olika meddelanden till samma objekt:

  
    
   
    self  listPane  parent  color:  Color  black  ;  höjd:  17  ;  bredd:  11 

Jämför med separata påståenden, avslutade med en punkt, även med en variabel som förkortning:


    
   
  
   |  förälder  |  parent  :=  self  listPane  parent  .  föräldrafärg  :  Färg  svart  .  förälders  längd:  17  .  föräldrabredd  :  11  . 

En subtilitet är att värdet av ett metodanrop ("meddelande") i en kaskad fortfarande är meddelandets vanliga värde, inte mottagaren. Detta är ett problem när man vill ha värdet på mottagaren, till exempel när man bygger upp ett komplext värde. Detta kan lösas genom att använda den speciella självmetoden som helt enkelt returnerar mottagaren:


   Objekt  >>  dig själv  ^  själv 

Till exempel, metoden "lägg till ett objekt i en samling" ( Collection>>add: anObject ) returnerar objektet som lades till, inte samlingen. För att använda detta i en kaskad i ett uppdragsförklaring måste kaskaden sluta med dig själv , annars blir värdet bara det sista elementet som läggs till, inte själva samlingen:

   
   
   
   alla  :=  OrderedCollection  ny  tillägg:  5  ;  lägg till:  7  ;  dig själv  . 

Visual Basic

Visual Basic använder With -satsen för att aktivera ett godtyckligt antal metodanrop eller egenskapsåtkomster på samma objekt:

 
  
    
  Med  ExpressionThatReturnsAnObject  .  SomeFunction  (  42  )  .  Egenskap  =  värde  Sluta  med 

With..End With -block i Visual Basic kan kapslas:

 
  
    
   
      
    
   
  Med  ExpressionThatReturnsAnObject  .  SomeFunction  (  42  )  .  Egenskap  =  värde  Med  .  SubObject  .  SubProperty  =  annatVärde  .  AnotherMethod  (  42  )  Sluta  Med  Sluta  Med 

Pil

Bland nyare språk implementerar Dart kaskader, med hjälp av en dubbelpunkts .. " cascaded method invocation operation". Till skillnad från Smalltalk, i Dart är värdet av en kaskadad metodanrop mottagaren (basobjektet), inte värdet av (okaskadad) metodanropet, och därför finns det inget behov för dig själv . Dart använder egenskaper , och istället för att använda metodsyntax för getters och sättare ( foo.getBar(); foo.setBar(b); ), använder den fältvärde/tilldelningssyntax ( foo.bar; foo.bar = b; ) , och kaskader arbetar med uppdrag:

  
    a  ..  string  =  'Hej världen!'  ..  gjort  =  sant  ; 

är ekvivalent med:

  
   a  .  string  =  'Hej världen!'  ;  a  .  gjort  =  sant  ; 
  •   Beck, Kent (1997). Smalltalk bästa praxismönster . Prentice Hall. ISBN 978-0134769042 .

externa länkar

Pil