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
- " Method Cascades in Dart ", Gilad Bracha, 17 februari 2012
- Milestone 1 Language Changes , " Cascades ", Bob Nyström, juli 2012 (uppdaterad mars 2013)