Язык программирования Scala
Курсовая работа, 21 Мая 2013, автор: пользователь скрыл имя
Описание работы
Язык Scala стал результатом исследований, направленных на разработку более хорошей языковой поддержки компонентного ПО. С помощью Scala я хотела бы проверить две гипотезы.
Содержание работы
Введение 3
История 5
Истоки дизайна 5
Ключевые аспекты языка 5
Объектно-ориентированный язык 7
Функциональный язык 7
Java-подобный язык 7
Классы 9
Операции 11
Переменные и свойства 15
Операции – это объекты 15
Методы и функциональные значения 16
Функции – это объекты 17
Последовательности 18
For Comprehensions 18
Абстракции 19
Функциональная абстракция 20
Вариантность (Variance). 21
Абстрактные члены 23
Семейный полиморфизм (family polymorphism) и self-типы. 24
Моделирование обобщенных (generic) типов с помощью абстрактных типов 24
Композиция 27
Повторное использование классов 27
Наследование. 28
Trait 31
Декомпозиция 32
Объектно-ориентированная декомпозиция 32
Модель данных 32
Автономные компоненты 32
Адаптация компонентов 33
Виды (views) 33
Границы видов 34
Заключение 35
Список литературы 36
Файлы: 1 файл
Курсовая работа СКАЛА.docx
— 62.42 Кб (Скачать файл)Это требование в Scala введено по причинам типобезопасности. Поскольку при составлении mixin-классов в другой класс копируются только различия, могло бы случиться так, что некоторые привнесенные члены ссылались бы на унаследованные члены, отсутствующие в новом контексте, порождая исключение “метод не найден”.
Неоднозначности. В Scala каждый класс наследуется только от одного суперкласса, и получает члены класса от нескольких других классов в процессе составления mixin-класса. Представьте, например, следующий подкласс класса Buffer, который вводит метод sameElements, а также внутренне используемый метод forall.class ComparableBuffer[T] extends Buffer[T]
{
def forall(p: T => Boolean) : Boolean =
{
val it = elements;
var res = true;
while (res && it.hasNext)
res=p(it.next);
res
}
def sameElements(b: IterableBuffer[T]) : Boolean =
forall(elem => b.exists(elem.equals));
}
Можно создать новый класс стека MyStack, который содержит функциональность, предоставляемую как IterableBuffer, так и ComparableBuffer, используя оба класса как mixin-ы.class MyStack[T] extends Stack[T]
with IterableBuffer[T]
with ComparableBuffer[T]; // Ошибка!
В Scala методы, определенные в
mixin-ах, либо представляют новые методы,
либо переопределяют соответствующие
методы суперкласса. Как показано в
предыдущем примере, может случиться
так, что два mixin-а определят один
и тот же метод. Классу MyStack неясно,
какой из методов forall использовать.
Такая неоднозначность
with IterableBuffer[T]
with ComparableBuffer[T]
{
override def forall(p: T => Boolean) =
super[IterableBuffer].forall(
}
Trait
Кроме неоднозначностей, есть еще одна серьезная проблема множественного наследования – дилемма бриллиантового наследования, возникающая, если класс является наследником двух классов, разделяющих один суперкласс. Без дальнейших ограничений эти суперклассы в данном сценарии будут унаследованы дважды. Это приведет к удвоению состояния, инкапсулированного в данных суперклассах, и выльется в серьезные проблемы с непротиворечивостью.
Чтобы избежать этого, Scala позволяет
подмешивать класс в другой класс,
только если он не использовался ранее
в этом другом классе как суперкласс
или mixin. К сожалению, это правило
накладывает сильные
Поскольку trait-ы не инкапсулируют состояния, двойное наследование от них в Scala разрешено. Таким образом, в иерархии суперклассов класса можно использовать один trait несколько раз.
Декомпозиция
Объектно-ориентированная декомпозиция
Программистам часто приходится
иметь дело со структурированными данными.
В объектно-ориентированном
Модель данных
Модель данных для XML в Scala – это неизменяемое представление упорядоченного неранжированного дерева. В таком дереве у каждого узла есть метка, последовательность дочерних узлов и ассоциативный список атрибутов и их значений. Все это описано в trait-е scala.xml.Node, который, кроме того, содержит эквиваленты XPath-операторов child и descendant-or-self, записываемые как \ и \\. Для элементов, текстовых узлов, комментариев, инструкций по обработке и ссылок на сущности существуют конкретные подклассы.
Автономные компоненты
Язык Scala как таковой не
предоставляет никаких
Адаптация компонентов
Каждая компонентная система
с мощными конструкциями
Виды (views)
Scala представляет новую
концепцию решения проблемы
Какие виды доступны для
вставки? Scala рассматривает в качестве
кандидатов все виды, к которым
имеется доступ из точки вставки
без префиксного выражения. Это
включает как виды, определенные локально
или в некоторой области
Локальность обеспечивается тем ограничением, что в качестве кандидатов рассматриваются только те виды, которые доступны без префикса. Клиенты могут приспосабливать под свои нужды набор доступных видов, выборочно импортируя объекты, определяющие виды.
Виды часто используются в библиотеке Scala, чтобы дать возможность Java-типам поддерживать trait-ы Scala. Примером может служить Scala-trait Ordered, определяющий набор операций сравнения. Виды на этот тип от всех базовых типов и класса String определены в модуле scala.Predef. Поскольку члены этого модуля неявно импортируются в каждую Scala-программу, эти виды всегда доступны. С точки зрения пользователя, это похоже на расширение Java-классов новыми trait-ами.
Границы видов
До сих пор методы видов должны были быть видимы статически в точке вставки. Виды становятся еще более полезными, если можно абстрагироваться от конкретного вставляемого метода.
MultiJava – это консервативное
расширение Java, которое добавляет
симметричную множественную
Заключение
Scala – это одновременно
и большой, и относительно
Scala – это также и
относительно маленький язык
в том смысле, что он построен
на скромном наборе весьма
общих концепций. Многие
Scala была выпущена для
общего пользования на
Список литературы
- Dean Wampler Alex Payne. Programming Scala: Scalability = Functional Programming
+ Objects,http://programming-
scala.labs.oreilly.com/. O’Reilly, 2009. - Derek Chen-Becker. Проект на Lift — <<Мелочь в Кармане>>. Проект,http://github.com/
tjweir/pocketchangeapp/tree/ master/PocketChange - Marius Danciu David Pollak, Derek Chen-Becker and Tyler Weir. Starting
with Lift. Веб-страница,http://old.
liftweb.net/docs/getting_ started/mod_master.html. - David Pollack et al. Getting Started With Lift. Веб-сайт, http://liftweb.net/
getting_started. - Debashish Ghosh. Designing Internal DSLs in Scala. Блог,http://debasishg.
blogspot.com/2008/05/ designing-internal-dsls-in- scala.html. - Tyler Weir Marius Danciu, Derek Chen-Becker. The Definitive Guide to Lift: A Scala-based Web Framework,http://www.amazon.
com/Definitive-Guide-Lift- Scala-based-Framework/dp/ 1430224215. Apress, 2007. - Gregory Meredith. Pro Scala: Monadic Design Patterns for the Web, http://www.amazon.com/
Pro-Scala-Monadic-Design- Patterns/dp/143022844X. Apress, 2010. - JP Moresmaugh. Java and higher order generics. Блог, http://jpmoresmau.
blogspot.com/2007/12/java-and- higher-order-generics.html. - Tony Morris. Проект scalaz. Проект в Google Code, http://code.google.com/
p/scalaz/. - David Pollack. Beginning Scala, http://www.amazon.com/
Beginning-Scala-David-Pollak/ dp/1430219890. Apress, 2009. - David Rupp. Java generics broken? we report, you
decide. Блог,http://davidrupp.
blogspot.com/2008/01/java- generics-broken-we-report-you. html. - Bill Venners. Scalatest. Проект, http://www.scalatest.
org/. - Bill Venners, Martin Odersky, and Lexi Spoon. Programming in Scala: A Comprehensive Step-by-step Guide,http://www.amazon.com/
Programming-Scala- Comprehensive-Step---step/dp/ 0981531601/. Artima, 2008. - Лекси Спун, Бил Веннерс, Мартин Одерски. Первые шаги в Scala. RSDN,http://www.rsdn.ru/
article/scala/scala.xml. - Мартин Одерски и другие. Обзор языка программирования Scala. RSDN,http://www.rsdn.ru/
article/philosophy/Scala.xml. - Антон Панасенко. Scala: Actors (part 2). Блог, http://blog.apanasenko.
me/2009/12/scala-actors-part- 2/. - Антон Панасенко. Scala: Functional Language (part 3). Блог, http://blog.apanasenko.
me/2009/12/scala-functional- language-part-3/. - Антон Панасенко. Scala: введение в мир FL JVM (part 1). Блог, http://blog.apanasenko.
me/2009/12/scala-fl-jvm-part- 1/.