Каскадирование методов

редактировать

В объектно-ориентированном программировании, метод каскадный является синтаксис, который позволяет использовать несколько способов, чтобы назвать на тот же самом объекте. Это особенно применимо в свободных интерфейсах.

Например, в Dart каскад:

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

эквивалентно отдельным звонкам:

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

Каскадирование методов встречается гораздо реже, чем объединение методов в цепочки - оно встречается только в нескольких объектно-ориентированных языках, в то время как цепочка очень распространена. Форма каскадирования может быть реализована с использованием цепочки, но это ограничивает интерфейс; см. сравнение с цепочкой методов ниже.

Содержание
  • 1 Приложение
  • 2 Сравнение с цепочкой методов
  • 3 языка
    • 3.1 Паскаль
    • 3.2 Smalltalk
    • 3.3 Visual Basic
    • 3.4 Дротик
  • 4 ссылки
  • 5 Внешние ссылки
заявка

Каскадирование - это синтаксический сахар, который избавляет от необходимости повторно перечислять объект. Это особенно часто используется в свободных интерфейсах, которые содержат множество вызовов методов для одного объекта.

Это особенно полезно, если объект является значением длинного выражения, так как избавляет от необходимости многократно перечислять выражение или использовать временную переменную. Например, вместо повторного перечисления выражения:

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

или используя временную переменную:

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

каскадирование позволяет записывать выражение один раз и использовать повторно:

a.b()..c()..d();
Сравнение с цепочкой методов
Дополнительная информация: Цепочка методов

При вызове метода a.b()после выполнения вызова метод каскадирования оценивает это выражение для левого объекта a(с его новым значением, если оно изменено), а цепочка методов оценивает это выражение для правого объекта.

Цепочка

Следующая цепочка (в C ++):

a.b().c();

эквивалентно простой форме:

b = a.b(); b.c();
Каскадный

Следующий каскад (в Dart):

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

эквивалентно простой форме:

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

Каскадный может быть реализовано с точкой зрения цепочки, имея методы возвращают целевой объект (приемник, this , self). Однако для этого требуется, чтобы метод уже был реализован таким образом - или исходный объект был заключен в другой объект, который делает это - и чтобы метод не возвращал какое-либо другое потенциально полезное значение (или ничего, если это было бы более подходящим, как в сеттеры). В свободных интерфейсах это часто означает, что сеттеры возвращают это вместо ничего.

Языки

Паскаль

В операторе компонента оператора with компоненты (поля) переменной записи, указанные в предложении with, могут быть обозначены только их идентификатором поля, то есть без предшествующего им обозначения всей переменной записи. Предложение with фактически открывает область, содержащую идентификаторы полей указанной переменной записи, так что идентификаторы полей могут встречаться как идентификаторы переменных.

 with date do if month = 12 then begin month:= 1; year:= year + 1 end else month:= month + 1 { is equivalent to } if date.month = 12 then begin date.month:= 1; date.year:= date.year + 1 end else date.month:= date.month + 1

Болтовня

И цепочки методов, и каскады были введены в Smalltalk ; большинство последующих объектно-ориентированных языков реализовали цепочки, но немногие реализовали каскады. В Smalltalk оператор точки с запятой может использоваться для отправки разных сообщений одному и тому же объекту:

self listPane parent color: Color black; height: 17; width: 11

Сравните с отдельными операторами, оканчивающимися точкой, также используя переменную для сокращения:

|parent| parent:= self listPane parent. parent color: Color black. parent height: 17. parent width: 11.

Одна тонкость заключается в том, что значение вызова метода («сообщение») в каскаде по-прежнему является обычным значением сообщения, а не получателем. Это проблема, когда вам нужно значение получателя, например, при построении сложного значения. Это можно обойти, используя специальный yourselfметод, который просто возвращает получателя:

Objectgt;gt;yourself ^self

Например, метод «добавить объект в коллекцию» ( Collectiongt;gt;add: anObject) возвращает добавленный объект, а не коллекцию. Таким образом, чтобы использовать это в каскаде в операторе присваивания, каскад должен заканчиваться yourself, иначе значение будет просто последним добавленным элементом, а не самой коллекцией:

all:= OrderedCollection new add: 5; add: 7; yourself.

Visual Basic

Visual Basic использует этот Withоператор, чтобы разрешить произвольное количество вызовов методов или доступа к свойствам одного и того же объекта:

With ExpressionThatReturnsAnObject.SomeFunction(42).Property = value End With

With..End With блоки в Visual Basic могут быть вложенными:

With ExpressionThatReturnsAnObject.SomeFunction(42).Property = value With.SubObject.SubProperty = otherValue.AnotherMethod(42) End With End With

Дротик

Среди новых языков Dart реализует каскады, используя двойную точку ..«каскадная операция вызова метода». В отличие от Smalltalk, в Dart значением вызова каскадного метода является получатель (базовый объект), а не значение вызова (некаскадного) метода, и, следовательно, в этом нет необходимости yourself. Dart использует свойства, и поэтому вместо синтаксиса методов для геттеров и сеттеров ( foo.getBar(); foo.setBar(b);) он использует синтаксис значения поля / назначения ( foo.bar; foo.bar = b;), а каскады работают с назначениями:

a..string = 'Hello world!'..done = true;

эквивалентно:

a.string = 'Hello world!'; a.done = true;
Ссылки
внешние ссылки
Дротик
Последняя правка сделана 2024-01-02 08:39:35
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте