Файл: Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.12.2023
Просмотров: 727
Скачиваний: 11
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
598 Глоссарий
Результирующий (в Scala), возвращаемый (в Java) тип (result type). Резуль
тирующий/возвращаемый тип метода — тип значения, которое воз
вращается в результате вызова этого метода.
Рекурсия (recursive). Функция, которая вызывает саму себя, называется
рекурсивной. Если этот вызов происходит только в последнем выра
жении функции, то она является хвостовой рекурсией.
Самостоятельный объект (standalone object). Объектодиночка без класса
компаньона.
Свободная переменная (free variable). Переменная называется свободной, если используется в выражении, но не объявлена внутри него. Например, в выражении функционального литерала
(x:
Int)
=>
(x,
y)
использу
ются обе переменные, x
и y
, но только y
является свободной, так как не определена внутри этого выражения.
Связанная переменная (bound variable). Переменная, которая определена и используется внутри выражения, является его связанной переменной.
Например, в выражении функционального литерала
(x:
Int)
=>
(x,
y)
используются две переменные, x
и y
, но только x
является связанной, поскольку определена в выражении как
Int и выступает единственным аргументом функции, описанной этим выражением.
Селектор (selector). Значение, с которым сопоставляются образцы в выраже
нии match
. Например, в s
match
{
case
_
=>
}
селектором выступает s
Сериализация (serialization). Объект можно сериализовать в поток байтов, который затем может быть сохранен в файлы или передан по сети.
Позже поток байтов можно будет десериализовать, даже находясь на другом компьютере, и получить объект, который идентичен сериали
зованному оригиналу.
Сигнатура (signature). Сокращенный вариант понятия «сигнатура типа».
Сигнатура типа (type signature). Сигнатура типа метода определяет его имя, а также количество, порядок и типы его параметров (если тако
вые имеются) и возвращаемый тип. Сигнатура типа класса, трейта или объектасинглтона определяет его имя, сигнатуры типов всех его членов и конструкторов, а также отношения наследования и приме
шивания, которые в нем объявлены.
Синтетический класс (synthetic class). Не пишется вручную программистом, а генерируется автоматически компилятором.
Скрипт (script). Файл с высокоуровневыми определениями и выражениями, который можно запускать непосредственно с помощью команды scala
,
Глоссарий 599
без предварительной компиляции. Скрипт должен заканчиваться вы
ражением, а не определением.
Слабоструктурированные данные (semistructured data). Данные XML яв
ляются слабоструктурированными. Они структурированы лучше, чем плоский двоичный или текстовый файл, но при этом уступают полно
ценным структурам данных в языках программирования.
Собственный тип (self type). Собственный тип трейта — это предполагаемый тип this
, получателя, который будет использоваться внутри трейта.
Любой конкретный класс, который примешивается в трейт, должен иметь тип, соответствующий собственному типу трейта. Чаще всего собственные типы используются для разбиения крупных классов на несколько трейтов (см. главу 7).
Создание экземпляра (instantiate). Создать экземпляр класса означает создать на основе класса новый объект. Эта операция происходит только во время выполнения.
Среда выполнения (runtime). Виртуальная машина Java (Java Virtual Machine,
JVM), в которой выполняется программа на языке Scala. Среда вы-
полнения включает в себя как виртуальную машину, соответствующую спецификации JVM, так и библиотеки Java API вместе со стандартны
ми библиотеками Scala API. Словосочетание «во время выполнения»
(run time) означает, что программа выполняется. Существует также время компиляции.
Ссылаться (refers). Переменная в выполняемой программе на языке Scala всегда ссылается на какойто объект. Даже если этой переменной присвоить null
, на концептуальном уровне она будет ссылаться на объект
Null
. Во время выполнения объект может быть реализован в виде объекта Java или значения примитивного типа, но Scala позво
ляет программистам рассуждать о выполнении своего кода на более высоком уровне абстракции. См. также Ссылка.
Ссылка (reference). Абстракция для указателя в Java, которая однозначно идентифицирует объект, размещенный в куче JVM. Переменные ссылочных типов хранят ссылки на объекты, поскольку ссылочные типы (экземпляры
AnyRef
) реализованы в виде объектов Java, нахо
дящихся в куче JVM. Для сравнения: переменные с типом значения могут хранить ссылку (на типобертку), а могут и нет (когда объект представлен примитивным значением). В целом переменные в Scala
ссылаются на объекты. Термин «ссылаться» более абстрактный, чем
«хранить ссылку». Если переменная типа scala.Int в настоящий момент представлена в виде примитивного значения int из Java,
600 Глоссарий то все равно ссылается на объект
Int
, хотя никаких ссылок при этом не используется.
Ссылочная прозрачность (referential transparency). Свойство функций, которые не зависят от временного контекста и не имеют побочных эффектов. Если взять конкретные входные данные, то вызов ссылоч
но прозрачной функции можно заменить ее результатом, не меняя семантику программы.
Ссылочный тип (reference type). Подкласс
AnyRef
. Во время выполнения экземпляры ссылочных типов всегда находятся в куче JVM.
Статический тип (static type). См. Тип.
Суперкласс (superclass). Суперклассом класса являются его прямой супер
класс, прямой суперкласс прямого суперкласса и так далее вплоть до
Any
Супертип (supertype). Тип является супертипом по отношению ко всем своим подтипам.
Супертрейт (supertrait). Супертрейты класса или трейта (если таковые имеются) включают все трейты, напрямую примешанные в класс или трейт или любые его суперклассы, а также супертрейты этих трейтов.
Тип (type). У всех переменных и выражений в программе на языке Scala есть
тип, известный во время компиляции. Он ограничивает значения, на которые может ссылаться переменная и которые может возвращать выражение во время выполнения. Тип переменной или выражения можно также называть статическим типом, если необходимо под
черкнуть его отличие от типа времени выполнения. Иными словами, понятие «тип» само по себе является статическим. Тип отличается от класса, поскольку параметризованный класс может формировать много разных типов. Например,
List
— это класс, а не тип.
List[T]
— тип со свободным параметром типа.
List[Int]
и
List[String]
— это тоже типы (их называют образующими типами, поскольку у них нет свободных параметров типов). У типа может быть класс или трейт.
Например, классом типа
List[Int]
является
List
, а трейтом типа
Set[String]
—
Set
Тип времени выполнения (runtime type). Тип объекта во время выполнения.
Для сравнения: статическим называют тип выражения во время компиляции. Большинство типов времени выполнения представляют собой типы классов без параметров типов. Например, тип времени выполнения "Hi"
является строкой, а
(x:
Int)
=>
x
+
1
—
Function1
Глоссарий 601
Для проверки типов времени выполнения можно использовать isIn- stanceOf
Тип значения (value type). Любой подкласс
AnyVal
, такой как
Int
,
Double или
Unit
. Этот термин имеет смысл на уровне исходного кода Scala.
Во время выполнения экземпляры типов значений, соответствующие примитивным типам Java, могут быть реализованы в виде значе
ний примитивных типов или экземпляров типовоберток, таких как java.lang.Integer
. На протяжении существования экземпляра типа значения среда выполнения может превращать его из примитивного типа в типобертку и обратно (то есть упаковывать и распаковывать).
Тип, зависящий от пути (pathdependent type). Тип наподобие swiss.cow.Food
, где swiss.cow
— это путь, составляющий ссылку на объект. Смысл типа зависит от пути, по которому вы к нему обращае
тесь. Например, swiss.cow.Food и fish.Food
— это разные типы.
Трейт (trait). Определяется с помощью ключевого слова trait и представ
ляет собой нечто похожее на абстрактный класс, который не может принимать никаких значений. Его можно «примешивать» в классы или другие трейты с помощью процедуры под названием «композиция
примесей». Трейт, примешанный в класс или другой трейт, называют
примесью. Трейт может быть параметризован с использованием одного или нескольких типов; в этом случае формируется новый тип. Напри
мер,
Set
— трейт, который принимает один параметр типа, в то время как
Set[Int]
— это тип. Можно сказать, что
Set является трейтом типа
Set[Int]
Уточняющий тип (refinement type). Тип, который формируется за счет присваивания значений членам базового типа внутри его фигурных скобок. Эти члены уточняют типы, присутствующие в базовом типе.
Например, тип «животное, которое ест траву» можно выразить как
Animal
{
type
SuitableFood
=
Grass
}
Фильтр (filter). Инструкция if в выражении for
, за которой идет булево выражение. В for(i
<-
1
to
10;
if i
%
2
==
0)
фильтром выступает if i
%
2
==
0
. Значение справа от if
— это выражение фильтра.
Функциональное значение (function value). Функциональный объект, ко
торый можно вызывать, как любую другую функцию. Класс функ
ционального значения расширяет один из трейтов
FunctionN
(на
пример,
Function0
,
Function1
) из пакета scala и обычно выражается в исходном коде с помощью синтаксиса функциональных литералов.
Функцио нальное значение вызывается, когда срабатывает его метод
1 ... 56 57 58 59 60 61 62 63 64
602 Глоссарий apply
. Функциональное значение, захватывающее свободные пере
менные, является замыканием.
Функциональный литерал (function literal). Функция без имени в исходном коде Scala, описанная с помощью синтаксиса функциональных лите
ралов. Например,
(x:
Int,
y:
Int)
=>
x
+
y
Функциональный стиль (functional style). В этом стилепрограммирования акцент делается на функциях и вычислении результатов, а порядок выполнения операций играет второстепенную роль. Характерные черты этого стиля — передача функциональных значений в методы с циклами, неизменяемые данные и методы без побочных эффектов.
Эта парадигма доминирует в таких языках, как Haskell и Erlang, кон
трастируя с императивным стилем.
Функция (function). Функцию можно вызвать со списком аргументов для по
лучения какоголибо результата. У функции есть список параметров, тело и возвращаемый тип. Функции, являющиеся членами класса, трейта или объектасигнлтона, называются методами. Функции, опре
деленные внутри других функций, называются локальными. Функ
ции, возвращающие тип
Unit
, называются процедурами. Анонимные функции в исходном коде называются функциональными литералами.
Во время выполнения для функционального литерала создается объ
ект, называемый функциональным значением.
Функция без параметров (parameterless function). Функция, которая не при
нимает параметров и определяется без использования пустых скобок.
При вызове таких функций можно не указывать скобки. Это соответ
ствует принципу единообразного доступа, что позволяет поменять def на val
, не модифицируя клиентский код.
Функция первого класса (firstclass function). Scala поддерживает функции
первого класса. Это значит, вы можете выразить функцию в виде функ-
ционального литерала (как, например, в
(x:
Int)
=>
x
+
1
) или объекта, который называют функциональным значением.
Характеристика for (for comprehension). Альтернативное название выра
жения for
Хвостовая рекурсия (tail recursive). Возникает, когда функция вызывает саму себя только в своей последней операции.
Целевая типизация (target typing). Разновидность выведения типов, кото
рая учитывает, какой тип ожидается в итоге. Например, в nums.fil- ter((x)
=>
x
>
0)
компилятор Scala определяет, что x
— это тип эле
. Функциональное значение, захватывающее свободные пере
менные, является замыканием.
Функциональный литерал (function literal). Функция без имени в исходном коде Scala, описанная с помощью синтаксиса функциональных лите
ралов. Например,
(x:
Int,
y:
Int)
=>
x
+
y
Функциональный стиль (functional style). В этом стилепрограммирования акцент делается на функциях и вычислении результатов, а порядок выполнения операций играет второстепенную роль. Характерные черты этого стиля — передача функциональных значений в методы с циклами, неизменяемые данные и методы без побочных эффектов.
Эта парадигма доминирует в таких языках, как Haskell и Erlang, кон
трастируя с императивным стилем.
Функция (function). Функцию можно вызвать со списком аргументов для по
лучения какоголибо результата. У функции есть список параметров, тело и возвращаемый тип. Функции, являющиеся членами класса, трейта или объектасигнлтона, называются методами. Функции, опре
деленные внутри других функций, называются локальными. Функ
ции, возвращающие тип
Unit
, называются процедурами. Анонимные функции в исходном коде называются функциональными литералами.
Во время выполнения для функционального литерала создается объ
ект, называемый функциональным значением.
Функция без параметров (parameterless function). Функция, которая не при
нимает параметров и определяется без использования пустых скобок.
При вызове таких функций можно не указывать скобки. Это соответ
ствует принципу единообразного доступа, что позволяет поменять def на val
, не модифицируя клиентский код.
Функция первого класса (firstclass function). Scala поддерживает функции
первого класса. Это значит, вы можете выразить функцию в виде функ-
ционального литерала (как, например, в
(x:
Int)
=>
x
+
1
) или объекта, который называют функциональным значением.
Характеристика for (for comprehension). Альтернативное название выра
жения for
Хвостовая рекурсия (tail recursive). Возникает, когда функция вызывает саму себя только в своей последней операции.
Целевая типизация (target typing). Разновидность выведения типов, кото
рая учитывает, какой тип ожидается в итоге. Например, в nums.fil- ter((x)
=>
x
>
0)
компилятор Scala определяет, что x
— это тип эле
Глоссарий 603
ментов nums
, поскольку метод filter вызывает функцию для каждого элемента nums
Частично примененная функция (partially applied function). Функция, кото
рая используется в выражении с неполным списком своих аргументов.
Например, если функция f
имеет тип
Int
=>
Int
=>
Int
, то f
и f(1)
будут частично примененными функциями.
Член (member). Любой именованный элемент шаблона класса, трейта или объектасинглтона. Чтобы обратиться к члену, нужно указать имя его владельца, точку и затем его простое имя. Например, поля и методы верхнего уровня, определенные в классе, являются членами этого класса. Трейт, определенный внутри класса, является его членом. Тип, определенный в классе с помощью ключевого слова type
, является членом этого класса. Класс является членом пакета, в котором он определен. Тогда как локальную переменную или функцию нельзя считать членом окружающего ее блока.
Шаблон (template). Тело класса, трейта или объектаодиночки. Определяет сигнатуру типа, поведение и начальное состояние класса, трейта или объекта.
Экземпляр (instance). Экземпляр класса — объект, понятие, которое суще
ствует только во время выполнения программы.
Библиография
[Abe96] Abelson, Harold and Gerald Jay Sussman. Structure and Interpretation of Computer Programs. The MIT Press, second edition, 1996.
[Aho86] Aho, Alfred V., Ravi Sethi, and Jeffrey D. Ullman. Compilers: Principles,
Techniques, and Tools. AddisonWesley Longman Publishing Co., Inc.,
Boston, MA, USA, 1986. ISBN 0201100886.
[Bay72] Bayer, Rudolf. “Symmetric binary BTrees: Data structure and mainte
nance algorithms.” Acta Informatica, 1 (4): 290–306, 1972.
[Blo08] Bloch, Joshua. Effective Java Second Edition. AddisonWesley, 2008.
[DeR75] DeRemer, Frank and Hans Kron. “Programminginthe large versus pro
gramminginthesmall.” In Proceedings of the international conference on Reliable software, pages 114–121. ACM, New York, NY, USA, 1975. doi:http://doi.acm.org/10.1145/800027.808431.
[Dij70] Dijkstra, Edsger W. “Notes on Structured Programming.”, April 1970.
Circulated privately. Available at http://www.cs.utexas.edu/users/
EWD/ewd02xx/EWD249.PDF as EWD249 (accessed June 6, 2008).
[Eck98] Eckel, Bruce. Thinking in Java. Prentice Hall, 1998.
[Emi07] Emir, Burak, Martin Odersky, and John Williams. “Matching Objects
With Patterns.” In Proc. ECOOP, Springer LNCS, pages 273–295. July
2007.
[Eva03] Evans, Eric. DomainDriven Design: Tackling Complexity in the Heart of Software. AddisonWesley Professional, 2003.
[Fow04] Fowler, Martin. “Inversion of Control Containers and the Dependency
Injection pattern.” January 2004. Available on the web at http://mar
tinfowler.com/articles/injection.html (accesssed August 6, 2008).
[Gam95] Gamma, Erich, Richard Helm, Ralph Johnson, and John Vlissides. De
sign Patterns: Elements of Reusable ObjectOriented Software. Addi
sonWesley, 1995.
[Goe06] Goetz, Brian, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Homes,
and Doug Lea. Java Concurrency in Practice. Addison Wesley, 2006.