Method Cascading
   HOME

TheInfoList



OR:

In
object-oriented programming Object-oriented programming (OOP) is a programming paradigm based on the concept of '' objects''. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and impl ...
, method cascading is
syntax In linguistics, syntax ( ) is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure (constituenc ...
which allows multiple methods to be called on the same object. This is particularly applied in
fluent interface In software engineering, a fluent interface is an object-oriented API whose design relies extensively on method chaining. Its goal is to increase code legibility by creating a domain-specific language (DSL). The term was coined in 2005 by Eric ...
s. For example, in Dart, the cascade: a..b() ..c(); is equivalent to the individual calls: a.b(); a.c(); Method cascading is much less common than
method chaining Method chaining is a common syntax for invoking multiple method calls in object-oriented programming languages. Each method returns an object, allowing the calls to be chained together in a single statement without requiring variables to store th ...
– it is found only in a handful of object-oriented languages, while chaining is very common. A form of cascading can be implemented using chaining, but this restricts the interface; see comparison with method chaining, below.


Application

Cascading is
syntactic sugar In computer science, syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express. It makes the language "sweeter" for human use: things can be expressed more clearly, more concisely, or in an ...
that eliminates the need to list the object repeatedly. This is particularly used in
fluent interface In software engineering, a fluent interface is an object-oriented API whose design relies extensively on method chaining. Its goal is to increase code legibility by creating a domain-specific language (DSL). The term was coined in 2005 by Eric ...
s, which feature many method calls on a single object. This is particularly useful if the object is the value of a lengthy expression, as it eliminates the need to either list the expression repeatedly or use a temporary variable. For example, instead of either listing an expression repeatedly: a.b().c(); a.b().d(); or using a temporary variable: n = a.b(); n.c(); n.d(); cascading allows the expression to be written once and used repeatedly: a.b()..c() ..d();


Comparison with method chaining

Given a method call a.b(), after executing the call, method cascading evaluates this expression to the ''left'' object a (with its new value, if mutated), while
method chaining Method chaining is a common syntax for invoking multiple method calls in object-oriented programming languages. Each method returns an object, allowing the calls to be chained together in a single statement without requiring variables to store th ...
evaluates this expression to the ''right'' object. ;Chaining The following chain (in C++): a.b().c(); is equivalent to the simple form: b = a.b(); b.c(); ;Cascading The following cascade (in Dart): a..b() ..c(); is equivalent to the simple form: a.b(); a.c(); Cascading can be implemented in terms of chaining by having the methods return the target object (receiver, this, self). However, this requires that the method be implemented this way already – or the original object be wrapped in another object that does this – and that the method not return some other, potentially useful value (or nothing if that would be more appropriate, as in setters). In fluent interfaces this often means that setters return ''this'' instead of nothing.


Languages


Pascal

Within the component statement of the with statement, the components (fields) of the record variable specified by the with clause can be denoted by their field identifier only, i.e. without preceding them with the denotation of the entire record variable. The with clause effectively opens the scope containing the field identifiers of the specified record variable, so that the field identifiers may occur as variable identifiers. with date do if month = 12 then begin month := 1; year := year + 1 end else month := month + 1 if date.month = 12 then begin date.month := 1; date.year := date.year + 1 end else date.month := date.month + 1


Smalltalk

Method chains and cascades were both introduced in
Smalltalk Smalltalk is a purely object oriented programming language (OOP) that was originally created in the 1970s for educational use, specifically for constructionist learning, but later found use in business. It was created at Xerox PARC by Learni ...
; most subsequent object-oriented languages have implemented chains, but few have implemented cascades. In Smalltalk the semicolon operator can be used to send different messages to the same object: self listPane parent color: Color black; height: 17; width: 11 Compare with separate statements, terminated with a period, also using a variable for abbreviation: , parent, parent := self listPane parent. parent color: Color black. parent height: 17. parent width: 11. One subtlety is that the value of a method call ("message") in a cascade is still the ordinary value of the message, ''not'' the receiver. This is a problem when you do want the value of the receiver, for example when building up a complex value. This can be worked around by using the special yourself method that simply returns the receiver: Object>>yourself ^self For example, the "add an object to a collection" method (Collection>>add: anObject) returns the object that was added, not the collection. Thus to use this in a cascade in an assignment statement, the cascade must end with yourself, otherwise the value will just be the last element added, not the collection itself: all := OrderedCollection new add: 5; add: 7; yourself.


Visual Basic

Visual Basic Visual Basic is a name for a family of programming languages from Microsoft. It may refer to: * Visual Basic (.NET), the current version of Visual Basic launched in 2002 which runs on .NET * Visual Basic (classic), the original Visual Basic suppo ...
uses th
With statement
to enable an arbitrary number of method calls or property accesses on the same object: With ExpressionThatReturnsAnObject .SomeFunction(42) .Property = value End With With..End With blocks in Visual Basic can be nested: With ExpressionThatReturnsAnObject .SomeFunction(42) .Property = value With .SubObject .SubProperty = otherValue .AnotherMethod(42) End With End With


Dart

Among newer languages, Dart implements cascades, using a double-dot .. "cascaded method invocation operation". Unlike Smalltalk, in Dart the value of a cascaded method invocation is the receiver (base object), not the value of the (uncascaded) method invocation, and thus there is no need for yourself. Dart uses
properties Property is the ownership of land, resources, improvements or other tangible objects, or intellectual property. Property may also refer to: Philosophy and science * Property (philosophy), in philosophy and logic, an abstraction characterizing an ...
, and thus rather than using method syntax for getters and setters (foo.getBar(); foo.setBar(b);), it uses field value/assignment syntax (foo.bar; foo.bar = b;), and cascades work with assignments: a..string = 'Hello world!' ..done = true; is equivalent to: a.string = 'Hello world!'; a.done = true;


Lisps

The builtin doto macro can be used in
Clojure Clojure (, like ''closure'') is a dynamic programming language, dynamic and functional programming, functional dialect (computing), dialect of the programming language Lisp (programming language), Lisp on the Java (software platform), Java platfo ...
to call multiple methods on the same object without binding it to a variable, which is mostly useful to operate on mutable objects from the host language. (doto (java.util.ArrayList.) (.add 1) (.add 3) (println)) ;not limited to methods ;;; expands to code equivalent to (let (java.util.ArrayList.) (.add l 1) (.add l 3) (println l) l) ; the form evaluates to the first input Similar macros are available or can be easily defined in various other lisps like
Common Lisp Common Lisp (CL) is a dialect of the Lisp programming language, published in American National Standards Institute (ANSI) standard document ''ANSI INCITS 226-1994 (S2018)'' (formerly ''X3.226-1994 (R1999)''). The Common Lisp HyperSpec, a hyperli ...
.


References

* {{refend


External links

;Dart *
Method Cascades in Dart
, Gilad Bracha, February 17, 2012 *
Milestone 1 Language Changes
''
Cascades
, Bob Nystrom, July 2012 (updated March 2013) Cascading