Вы находитесь на странице: 1из 47

СОДЕРЖАНИЕ

Введение.......................................................................................................................2
1. Общая часть.............................................................................................................3
1.1. Постановка задачи........................................................................................3
1.1.1. Название задачи.................................................................................3
1.1.2. Технико-математическое описание задачи.....................................3
1.1.3. Требования к программе...................................................................9
1.1.4. Требования к составу и параметрам технических средств...........9
1.2. Описание языка программирования.........................................................11
1.2.1. Выбор языка программирования...................................................11
1.2.2. Элементы языка программирования.............................................27
Заключение.................................................................................................................46

Изм Лист № докум. Подп. Дата


Разраб. Хомяков Лит. Лист Листов
Пров. Шипиев Разработка системы олимпиадного 1 46
тестирования на языке
. программирования Ruby ФГОУ ДПО МЭТТ ГАИ
Утв. Щербаков
ВВЕДЕНИЕ
Разработка системы олимпиадного тестирования на языке
программирования Ruby на основании приказа ФГОУ ДПО МЭТТ ГАИ № 41-С
от 02.04.2007.

Полное название программы: Система олимпиадного тестирования на


языке программирования Ruby.

Краткое название программы: Система тестирования, rSPOJ.

Лист

Изм Лист № докум. Подп. Дата


1. ОБЩАЯ ЧАСТЬ

1.1. Постановка задачи

1.1.1. Название задачи

Разработка системы олимпиадного тестирования на языке


программирования Ruby.

1.1.2. Технико-математическое описание задачи

Система олимпиадного тестирования должна быть реализована в


соответствии с клиент-серверной технологией, основанием которой является
механизм Ruby on Rails. Необходимо обеспечить трехуровневую архитектуру
MVC. Для хранения данных предполагается использование СУБД. Бизнес
логика должна быть реализована на языке программирования Ruby, а ее связь с
хранилищем данных осуществлена посредством ORM. Презентационная часть
должна представлять собой HTML страницы с применением CSS и Javascript.
Так же будут использоваться технологии:

– RSS;

– AJAX.

1.1.2.1. HTTP

HTTP (от англ. HyperText Transfer Protocol — «протокол передачи


гипертекста») — сетевой протокол прикладного уровня для передачи файлов. В
стеке TCP/IP для HTTP зарезервированы порты 80 и 8080 транспортных
протоколов TCP и UDP (на практике используется только первый).

Основным назначением HTTP является передача веб-страниц (текстовых


файлов с разметкой HTML), хотя с помощью него с успехом передаются и
другие файлы, как связанные с веб-страницами (изображения и приложения),
так и не связанные с ними.
Лист

Изм Лист № докум. Подп. Дата


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

1.1.2.2. Ruby on Rails

Ruby on Rails — объектно-ориентированный программный каркас для


создания веб-приложений, написанный на языке программирования Ruby. Ruby
on Rails предоставляет каркас модель-представление-контроллер (Model-View-
Controller) для веб-приложений, а также обеспечивает их интеграцию с веб-
сервером и сервером базы данных.

Ruby on Rails является открытым программным обеспечением и


распространяется под лицензией MIT.

1.1.2.2.1. Принципы

Ruby on Rails определяет следующие принципы разработки приложений:

– Приложения не должны определять собственную архитектуру,


поскольку они используют готовый каркас модель-представление-
контроллер;

– Язык Ruby позволяет использовать легко читаемую нотацию для


определения семантики приложений (таких как отношения между
таблицами в базе данных);

– Ruby on Rails предоставляет механизмы повторного использования,


позволяющие минимизировать дублирование кода в приложениях (принцип
Don’t Repeat Yourself);

– По умолчанию используются соглашения по конфигурации, типичные


для большинства приложений (принцип Convention over configuration).
Явная спецификация конфигурации требуется только в нестандартных
случаях.

Лист

Изм Лист № докум. Подп. Дата


Архитектура

Основными компонентами приложений Ruby on Rails являются модель


(model), представление (view) и контроллер (controller).

Модель предоставляет остальным компонентам приложения объектно-


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

Благодаря возможностям динамической типизации в языке Ruby


разработчику достаточно наследовать свой класс модели от базового класса
ActiveRecord::Base. Ruby on Rails автоматически связывает классы модели с
таблицами в базе данных и создает атрибуты объектов для соответствующих
полей таблицы.

Представление создает пользовательский интерфейс для отображения


полученных от контроллера данных. Представление также передает запросы
пользователя на манипуляцию данными в контроллер (как правило,
представление не изменяет непосредственно модель).

В Ruby on Rails представление описывается при помощи шаблонов


RHTML. Они представляют собой файлы HTML с дополнительными
включениями фрагментов кода Ruby (Embedded Ruby или ERb). Вывод,
сгенерированный встроенным кодом Ruby, включается в текст шаблона, после
чего получившаяся страница HTML возвращается пользователю.
Представления могут использовать фрагменты других представлений и, в свою
очередь, быть включенными в шаблон (layout) более высокого уровня.

Контроллер — основной компонент, отвечающий за взаимодействие с


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

Контроллером в Ruby on Rails является класс, наследованный от

Лист

Изм Лист № докум. Подп. Дата


ActionController::Base. Открытые методы контроллера являются так
называемыми действиями (actions). Action часто соответствует отдельному
представлению. Например, по запросу пользователя admin/list будет вызван
метод list класса AdminController и затем использовано представление list.rhtml.

1.1.2.2.2. Интеграция

Ruby on Rails может работать с Apache, Lighttpd или любым другим веб-
сервером, поддерживающим FastCGI. Для разработки и отладки часто
используется встроенный в Ruby веб-сервер WEBrick или Mongrel.

В качестве сервера базы данных поддерживаются MySQL, Firebird,


PostgreSQL, IBM DB2, Oracle и Microsoft SQL Server. Также поддерживается
встраиваемая база данных SQLite.

1.1.2.3. MVC

Model View Controller (MVC) — архитектура программного обеспечения,


в которой модель данных приложения, пользовательский интерфейс и
управляющая логика разделены на три отдельных компонента, так, что
модификация одного из компонентов оказывает минимальное воздействие на
другие компоненты.

Шаблон MVC позволяет разделить данные, представление и обработку


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

– модель (model). Модель предоставляет данные (обычно для View), а


также реагирует на запросы (обычно от контролера), изменяя свое
состояние;

– представление (view). Отвечает за отображение информации


(пользовательский интерфейс);

– контролер (controller). Интерпретирует данные, введенные


пользователем, и информирует модель и представление о необходимости
соответствующей реакции.
Лист

Изм Лист № докум. Подп. Дата


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

1.1.2.4. ORM

ORM — (англ. Object-relational mapping) технология в программировании,


которая связывает базы данных с концепциями объектно-ориентированных
языков программирования, создавая (как результат) «виртуальную объектную
базу данных».

С точки зрения программиста, система должна выглядеть как постоянное


хранилище объектов. Он может просто создавать объекты и работать с ними
как обычно, а они автоматически будут сохраняться в реляционной базе
данных.

На практике все не так просто и очевидно. Все системы ORM обычно


проявляют себя в том или ином виде, уменьшая в некотором роде возможность
игнорирования базы данных. Более того, слой транзакций может быть
медленным и неэффективным (особенно в терминах сгенерированного SQL).
Все это может привести к тому, что программы будут работать медленнее и
использовать больше памяти, чем программы, написанные «вручную».

Но ORM позволяет избавить программиста от написания большого


количества, часто однообразного и подверженного ошибкам, кода, тем самым
значительно повышая производительность. Кроме того, большинство
современных реализаций ORM позволяют программисту, при необходимости,
самому жестко задать код SQL запросов который будет использоваться при тех
или иных действиях (сохранение в базу данных, загрузка, поиск и т.д) с
постоянным объектом.

Лист

Изм Лист № докум. Подп. Дата


1.1.2.5. AJAX

AJAX (от англ. Asynchronous JavaScript and XML — «асинхронный


JavaScript и XML») — это подход к построению интерактивных
пользовательских интерфейсов веб-приложений. При использовании AJAX веб-
страница не перезагружается полностью в ответ на каждое действие
пользователя. Вместо этого с веб-сервера догружаются только нужные
пользователю данные. AJAX — один из компонентов концепции DHTML.

AJAX базируется на двух основных принципах :

– использование DHTML для динамического изменения содержания


страницы;

– использование технологии динамического обращения к серверу «на


лету», без перезагрузки всей страницы полностью.

Часто сервер передаёт не готовый HTML-код, а только данные; а HTML-


элементы создаются исходя из этих данных, с использованием методов
модификации DOM. При этом в качестве формата передачи данных обычно
используются XML или JSON.

1.1.2.5.1. Модель AJAX

1) Пользователь заходит на веб-страницу и нажимает на какой-нибудь


её элемент.

2) Скрипт (на языке JavaScript) определяет, какая информация


необходима для обновления страницы.

3) Браузер отправляет соответствующий запрос на сервер.

4) Сервер возвращает только ту часть документа, на которую пришел


запрос.

5) Скрипт вносит изменения с учётом полученной информации (без


полной перезагрузки страницы).

Лист

Изм Лист № докум. Подп. Дата


1.1.2.6. RSS

RSS — семейство XML-форматов, предназначенных для описания лент


новостей, анонсов статей, изменений в блогах и т. п. Информация из различных
источников, представленная в формате RSS, может быть собрана, обработана и
представлена пользователю в удобном для него виде специальными
программами-агрегаторами.

В разных версиях аббревиатура RSS имела разные расшифровки:

– Rich Site Summary (RSS 0.9x) — обогащённая сводка сайта;

– RDF Site Summary (RSS 0.9 и 1.0) — сводка сайта с применением


инфраструктуры описания ресурсов;

– Really Simple Syndication (RSS 2.x) — очень простое приобретение


информации.

Обычно с помощью RSS 2.0 даётся краткое описание новой информации,


появившейся на сайте, и ссылка на её полную версию. Интернет-ресурс в
формате RSS называется RSS-каналом или RSS-лентой или RSS-фидом.

Многие современные браузеры и почтовые клиенты умеют работать с


RSS-лентами. Кроме того, существуют специализированные приложения (RSS-
агрегаторы), собирающие и обрабатывающие информацию RSS-каналов.

1.1.3. Требования к программе

Система тестирования должна обеспечить:

– единую пользовательскую систему с разделением прав доступа;

– управление турнирами;

– процесс автоматического тестирования;

– составление отчетности по турнирам;

– возможность различного вида оповещения участников посредством


RSS;

Лист

Изм Лист № докум. Подп. Дата


– возможность расширения функциональных возможностей системы;

– использование лицензионно-чистых компонентов.

1.1.4. Требования к составу и параметрам технических средств

Требования к параметрам программно-технических средств для


серверной части:

– процессор с производительностью не ниже Intel Pentium II;

– операционная система семейства Unix ( рекомендуется ), MacOS или


Windows;

– оперативное запоминающее устройство не менее 128 Мб;

– наличие свободного пространства на накопителе жестких магнитных


дисков не менее 200Мб;

– настроенный сетевой интерфейс;

– установленный и настроенный интерпретатор Ruby версии не ниже


1.8.4;

– установленный и настроенный framework Ruby on Rails версии не


ниже 1.2.2;

– установленная и настроенная СУБД ( PostgreSQL, MySQL, SQLite,


Oracle, DB2, FireBird, FrontBase, SQLServer, SyBase ).

Требования к параметрам программно-технических средств для


клиентской части:

– процессор с производительностью не ниже Intel Pentium II;

– операционная система семейства MacOS, Unix или Windows;

– оперативное запоминающее устройство не менее 128Мб;

– видеокарта;

– клавиатура;

Лист

Изм Лист № докум. Подп. Дата


– монитор;

– настроенный сетевой интерфейс;

– наличие веб-обозревателя ( рекомендуется Firefox версии не ниже


1.5 ).

1.2. Описание языка программирования

1.2.1. Выбор языка программирования

Среди всего множества языков программирования для реализации


системы выбор стоял между такими языками как Perl, Python, PHP и Ruby. Все
они имеют следующие общие характеристики:

— чаще всего используются для разработки клиент-серверных


приложений, которые базируются на протоколе HTTP (далее веб-
приложения);

— поддерживаются практически всеми веб-серверами;

— имеют обширные библиотеки и инструментарии для разработки


веб-приложений;

— обладают, в той или иной степени, объектно-ориентированными


возможностями;

— являются динамическими языками программирования


интерпретируемого типа, что позволяет выполнять множество операций,
которые не доступны статическим языкам программирования
компилируемого типа. Например, динамического расширение класса или
выполнение произвольного программного кода при помощи
функции/метода eval;

— существуют реализации для всех популярных операционных


систем: Windows, Unix, MacOS, BeOS и др.

— используют более облегченный синтаксис, который позволяет

Лист

Изм Лист № докум. Подп. Дата


писать более компактный код.

Такие языки программирования, как: Си, Си++, Си#, Паскаль, BASIC,


Delphi, Java и другие Си-подобные, даже не рассматривались в виду низкой
продуктивности разработки веб-приложений.

1.2.1.1. Язык программирования Perl

Perl (Перл) — язык программирования. Создатель Ларри Уолл (Larry


Wall). Само слово Perl — аббревиатура, которая расшифровывается как
Practical Extraction and Report Language (практический язык извлечений и
отчётов, отчего сначала язык назывался PEARL, но затем буква «A»
«потерялась»). Существует также ряд других вариантов. Согласно самому
красивому из них, название perl произошло от слова pearl (жемчужина).
Талисманом языка Perl является верблюд — не слишком красивое, но очень
выносливое животное, способное выполнять тяжёлую работу.

Основной особенностью языка считаются его богатые возможности для


работы с текстом, реализованные при помощи регулярных выражений.

Perl также знаменит огромной коллекцией дополнительных модулей


CPAN, находящейся по адресу http://www.cpan.org(англ.)

Интересен текст на Perl, печатающий простые числа:

perl -wle '(1 x $_) !~ /^(11+)\1+$/ && print while ++ $_'

Еще один также впечатляющий своей краткостью пример, имеющий к


тому же практическую пользу. Печатаются только уникальные строки файла
file.

perl -ne '$s{$_}++ || print' file

Перл унаследовал много свойств от языков Си, shell script, awk.

Сегодня основной для разработчиков является пятая версия языка Perl


однако (на некоторых веб-серверах) продолжают использоваться программы
(скрипты), написанные на предыдущей — четвёртой — версии (из-за частичной
Лист

Изм Лист № докум. Подп. Дата


обратной несовместимости). Фактически стандарт языка определяется
реализацией интерпретатора.

С 2000 года идет разработка новой (шестой) версии языка. В отличие от


предыдущих версий, разработчики планируют создать четко определенный
стандарт языка. В настоящее время существуют экспериментальные
компиляторы Perl 6, но продолжается дальнейшая дискуссия о новых правилах.
На русском языке информация о новой версии языка доступна на сайте [1].

Perl — далеко не единственный язык, дающий богатые возможности в


обработке текста. Языки программирования Icon и Snobol предоставляют
возможность использовать более полно метод программирования
«сопоставления с образцом», частным случаем которого и являются регулярные
выражения.

Существует также полноценный shell, использующий в качестве основы


язык Perl. Называется он psh и даёт возможность смешивать команды обычного
шелла и самого Perl’а.

1.2.1.1.1. Типы данных

Три типа данных: скаляр, список и хеш-таблица. Переменные разных


типов отличаются знаком, который стоит перед именем переменной.

$foo # a scalar

@foo # a list

%foo # a hash

Скалярные переменные используются для хранения одиночных значений.


Они могут содержать числа, строки и ссылки на другие объекты. Перед именем
скалярной переменной необходимо ставить знак доллара '$'. Тип скалярной
переменной не фиксирован (в отличие от, например, языка Си) и определяется
динамически в зависимости от контекста. Например,

$x = 10; # число

Лист

Изм Лист № докум. Подп. Дата


$y = $x + 1; # используем $x как число...

$z = $x . 'string'; # ... а теперь - как строку

Список является аналогом массива в других языках программирования.


Список может содержать некоторое количество скаляров. Каждый элемент
списка имеет свой индекс, с помощью которого к нему можно получить доступ.
Нумерация элементов начинается с нуля, то есть первый элемент списка имеет
индекс 0. Перед именем переменной-списка необходимо ставить знак '@'.
Многомерные массивы можно смоделировать, помещая в список ссылки на
другие списки.

@array = (1,2,3,4); # записали в список @array четыре элемента

print $array[2]; # напечатать третий элемент

Хеш-таблица позволяет ассоциировать строку-ключ со скаляром-


значением. Перед именем переменной-списка необходимо ставить знак
процента '%'.

%hash = (

'cat' => 'kitten',

'dog' => 'puppy',

'cow' => 'calf'

);

print $hash{'cat'};

1.2.1.1.2. Регулярные выражения

В Perl встроена мощная поддержка регулярных выражений. Благодаря


этому Perl очень эффективен для обработки текстов. Бо́льшая часть работы с
регулярными выражениями производится при помощи оператора =~.

Лист

Изм Лист № докум. Подп. Дата


1.2.1.2. Язык программирования Python

Python (пито́н, па́йтон) — интерпретируемый объектно-ориентированный


язык программирования высокого уровня с динамической типизацией,
автоматическим управлением памятью и удобными высокоуровневыми
структурами данных, такими как словари (хэш-таблицы), списки, кортежи.
Поддерживает классы, модули (которые могут быть объединены в пакеты),
обработку исключений, а также многопоточные вычисления. Питон обладает
простым и выразительным синтаксисом. Язык поддерживает несколько
парадигм программирования: структурное, объектно-ориентированное,
функциональное и аспектно-ориентированное.

Интерпретатор Питона существует для большинства распространённых


платформ. Он распространяется свободно под очень либеральной лицензией,
позволяющей использовать его без ограничений в коммерческих приложениях.
Текущая версия 2.5 вышла 19 сентября 2006 года.

1.2.1.2.1. Философия

Вольный перевод Дзэна Питона (автор Тим Пейтерс):

1) Красивое лучше уродливого.

2) Явное лучше неявного.

3) Простое лучше сложного.

4) Сложное лучше усложнённого.

5) Последовательное лучше вложенного.

6) Разрежённое лучше, чем плотное.

7) Удобочитаемость существенна.

8) Частные случаи не настолько существенны, чтобы нарушать


правила.

9) Однако практичность важнее регулярности.

Лист

Изм Лист № докум. Подп. Дата


10) Ошибки никогда не должны умалчиваться.

11) Если явно не указано умалчивать.

12) В случае неоднозначности сопротивляйтесь искушению угадать.

13) Должен существовать один — и, желательно, только один —


очевидный способ.

14) Хотя он может быть с первого взгляда неочевиден, если ты не


голландец (намёк на Гвидо ван Россума).

15) Сейчас лучше, чем никогда.

16) Но никогда часто бывает лучше, чем прямо сейчас.

17) Если реализацию идеи тяжело объяснить, она плоха.

18) Если реализацию идеи легко объяснить, она может быть хороша.

19) Пространства имён — великолепная идея, их должно быть много!

Английский (оригинальный) вариант «Дзэна Питона» выдаётся


интерпретатором Питона по команде import this (работает один раз).

1.2.1.2.2. История

Питон создал в начале 1990-х сотрудник голландского института CWI


Гвидо ван Россум (Guido van Rossum). Для распределенной ОС Amoeba
требовался расширяемый сценарный язык, и Гвидо начал писать Питон на
досуге, заимствовав некоторые наработки для языка АВС (Гвидо участвовал в
разработке этого языка, ориентированного на обучение программированию).
Затем язык начал свободно распространяться через Интернет и понравился
другим программистам. С самого начала Питон проектировался как объектно-
ориентированный язык. Питон также позаимствовал многие черты таких
языков, как Си, Си++, Modula-3 и Icon, и отдельные черты функционального
программирования из Лиспа.

Название языка произошло вовсе не от вида пресмыкающихся. Автор

Лист

Изм Лист № докум. Подп. Дата


назвал язык в честь популярного британского комедийного сериала 70-х годов
«Воздушный цирк Монти Пайтона». Впрочем, всё равно название языка чаще
ассоциируют именно со змеёй, нежели с фильмом — пиктограммы файлов в
KDE или в Windows и даже эмблема на сайте python.org изображают змеиные
головы.

Наличие дружелюбного, отзывчивого сообщества пользователей


считается наряду с дизайнерской интуицией Гвидо одним из фактором успеха
Питона. Развитие языка происходит согласно четко регламентированному
процессу создания, обсуждения, отбора и реализации документов PEP (Python
Enhancement Proposal) — предложений по развитию Питона.

Начата работа над Python 3000 — версией языка, в которой будут


устранены многие недостатки в дизайне с максимально возможным
сохранением совместимости со старыми версиями Питона.

1.2.1.2.3. Портируемость

Питон портируем и работает почти на всех известных платформах — от


КПК до мейнфреймов. Существуют порты под Windows, все варианты UNIX
(включая Linux), Plan 9 , Mac OS и Mac OS X, Palm OS, OS/2, Amiga, AS/400 и
даже OS/390 и Symbian.

При этом, в отличие от многих портируемых систем, на каждой


платформе Питон поддерживает все характерные для данной платформы
технологии (например, Microsoft COM/DCOM). Более того, существует
специальная версия Питона для виртуальной машины Java — Jython, что
позволяет интерпретатору выполняться на любой системе, поддерживающей
Java, при этом классы Java могут непосредственно использоваться из Питона и
даже быть написанными на Питоне. Не так давно началась разработка системы,
предназначенной для более полной интеграции с платформой .NET — Iron
Python.

Лист

Изм Лист № докум. Подп. Дата


1.2.1.2.4. Типы и структуры данных

Python поддерживает динамическую типизацию, то есть, тип переменной


определяется только во время исполнения. Поэтому вместо «присваивания
значения переменной» лучше говорить о «связывании значения с некоторым
именем». В Питоне имеются встроенные типы: булевский, строки, Unicode-
строки, целые числа произвольной точности, числа с плавающей запятой,
комплексные числа и некоторые другие. Из коллекций Питон поддерживает
кортежи (tuples), списки, словари (ассоциативные массивы) и, начиная с версии
2.4, множества. Все значения в Питоне являются объектами, в том числе
функции, методы, модули, классы.

Добавить новый тип можно либо написав класс (class), либо определив
новый тип в модуле расширения (например, написанном на языке C). Система
классов поддерживает наследование (одиночное и множественное) и
метапрограммирование. Любой тип входит в иерархию классов, и при
необходимости возможно наследование даже от большинства встроенных
типов.

Все объекты делятся на изменяемые и неизменяемые. Например, строки


являются неизменяемыми, поэтому для них не предусмотрено операций,
изменяющих строку. Списки являются изменяемыми, например, метод .sort()
сортирует список «на месте». Кортеж в Питоне является, по сути,
неизменяемым списком.

1.2.1.2.5. Синтаксис и семантика

Язык обладает чётким и последовательным синтаксисом, продуманной


модульностью и масштабируемостью, благодаря чему исходный код
написанных на Питоне программ легко читаем.

1.2.1.2.6. Имена

Имя (идентификатор) может начинаться с латинской буквы любого

Лист

Изм Лист № докум. Подп. Дата


регистра или подчеркивания, после чего в имени можно использовать и цифры.
В качестве имени нельзя использовать ключевые слова (их список можно
узнать по import keyword; print keyword.kwlist) и нежелательно переопределять
встроенные имена. Имена, начинающиеся на подчеркивание, имеют
специальное значение.

В каждой точке программы интерпретатор имеет доступ к трем


пространствам имён: локальному, глобальному и встроенному (пространство
имён — это отображение имён в объекты).

Области видимости имён могут быть вложенными друг в друга (внутри


определяемой функции видны имена из окружающего блока кода). На практике
с областями видимости и связыванием имен связано несколько правил
«хорошего тона», о которых можно подробнее узнать из документации.

1.2.1.2.7. Объектно-ориентированное программирование

Основная статья: Объектно-ориентированное программирование на


Питоне

Дизайн языка Питон построен вокруг объектно-ориентированной модели


программирования. Реализация ООП в Питоне является элегантной, мощной и
хорошо продуманной, но вместе с тем достаточно специфической по
сравнению с другими объектно-ориентированными языками. Поддерживается:

1) Наследование, в том числе множественное.

2) Полиморфизм (все функции виртуальные).

3) Инкапсуляция (два уровня - общедоступные и скрытые методы и


поля).

4) Специальные методы, управляющие жизненным циклом объекта:


конструкторы, деструкторы, распределители памяти.

5) Перегрузка операторов (всех, кроме '.','=' и символьных


логических).

Лист

Изм Лист № докум. Подп. Дата


6) Свойства (имитация поля с помощью функций).

7) Управление доступа к полям (эмуляция полей и методов,


частичный доступ,и т.п.).

8) Методы для управления наиболее распространенными операциями


(истинностное значение, len(), глубокое копирование, сериализация,
итерация по объекту, ...).

9) Метапрограммирование (управление созданием классов, триггеры


на создание классов, и др.).

10) Полная интроспекция.

11) Классовые и статические методы, классовые поля.

12) Классы вложенные в функции и классы.

1.2.1.2.8. Функциональное программирование

Python поддерживает парадигму функционального программирования, в


частности:

— функция является объектом;

— функции высших порядков;

— рекурсия;

— развитая обработка списков (списковые выражения, операции над


последовательностями, итераторы);

— аналог замыканий;

— частичное применение функции;

— возможность реализации других средств на самом языке (например,


карринг).

1.2.1.3. Язык программирования PHP

PHP (произносится пи-эйч-пи́, пэ-аш-пэ́) - скриптовый язык


Лист

Изм Лист № докум. Подп. Дата


программирования, созданный для генерации HTML-страниц на веб-сервере и
работы с базами данных. Ныне поддерживается подавляющим большинством
хостинг-провайдеров. Входит в LAMP - «стандартный» набор для создания
вебсайтов.

В области программирования для Сети PHP - один из популярнейших


скриптовых языков (наряду с JSP и языками, используемыми в ASP) благодаря
своей простоте, скорости выполнения, богатой функциональности и
распространению исходных кодов на основе лицензии PHP. PHP особенен
наличием ядра и подключаемых модулей, «расширений»: для работы с базами
данных, сокетами, динамической графикой, криптографическими
библиотеками, документами формата PDF и т. п. Любой желающий может
разработать своё собственное расширение и подключить его. Существуют
сотни расширений, однако в стандартную поставку входит лишь несколько
десятков хорошо зарекомендовавших себя. Интерпретатор PHP подключается к
веб-серверу либо через модуль, созданный специально для этого сервера
(например, для Apache или IIS), либо в качестве CGI-приложения.

Кроме этого, он может использоваться для решения административных


задач в операционных системах UNIX, Linux, Windows и Mac OS X. Однако в
таком качестве он не получил распространение, отдавая пальму первенства Perl,
Python и VBScript.

Синтаксис языка подобен тому языка Си. Некоторые элементы, такие как
ассоциативные массивы и цикл foreach, заимствованы из Perl.

Ныне PHP используется сотнями тысяч разработчиков. Несколько


миллионов сайтов сообщают о работе с PHP, что составляет более пятой доли
доменов Интернета.

Группа разработчиков PHP состоит из множества людей, добровольно


работающих над ядром и расширениями PHP, и смежными проектами, такими,
как PEAR или документация языка.

Название PHP - рекурсивная аббревиатура, означающая «PHP: Hypertext


Лист

Изм Лист № докум. Подп. Дата


Preprocessor» (ранее акроним расшифровывался как «Personal Home Page»).
Изначально PHP создавался в качестве надстройки над Perl для облегчения
разработки веб-страниц.

1.2.1.3.1. PHP/FI

В 1994 году датский программист (ныне живущий в Канаде) Расмус


Лердорф (Rasmus Lerdorf) написал набор скриптов на Perl для вывода и учёта
посетителей его онлайн-резюме, обрабатывающий шаблоны HTML-
документов. Лердорф назвал набор Personal Homepages Tools (Инструменты
для личных страниц). Вскоре функциональности и быстроты набора Perl-
скриптов перестало хватать, и Лердорф написал на языке C интерпретатор
шаблонов PHP/FI (англ. Personal Home Page / Forms Interpreter - «Личная
домашняя страница / Интерпретатор форм». PHP/FI включал базовую
функциональность сегодняшнего PHP: оформление переменных в стиле Perl
($имя_переменной для вывода значения), автоматическую обработку форм и
встраиваемость в HTML-текст. Собственно синтаксис языка был похож на Perl,
только проще и ограниченнее.

В 1997 году после длительного бета-тестирования вышла вторая версия


обработчика, написанного на C - PHP/FI 2.0. Её использовали около 1% всех
интернет-доменов мира.

1.2.1.3.2. PHP 3

PHP 3.0 была первой версией, напоминающей PHP, каким мы знаем его
сегодня. В 1997 году Энди Гутманс (Andi Gutmans) и Зев Сураски (Zeev
Suraski), два разработчика из израильского института технологий (Technion),
переписали код с нуля: разработчики сочли PHP/FI 2.0 непригодным для
разработки приложения электронной коммерции, над которым они работали
для проекта Университета расположенного в Хайфе, Израиль. Для совместной
работы над PHP 3.0 с помощью базы разработчиков PHP/FI 2.0 Энди, Расмус и
Зев решили объединиться и объявить PHP 3.0 официальным преемником
Лист

Изм Лист № докум. Подп. Дата


PHP/FI, разработка же PHP/FI была практически полностью прекращена.

Одной из сильнейших сторон PHP 3.0 была возможность расширения


ядра. Впоследствии интерфейс написания расширений привлёк к PHP
множество сторонних разработчиков, работающих над своими модулями, что
дало PHP возможность работать с огромным количеством баз данных,
протоколов, поддерживать большое число API. Фактически, это и был главный
ключ к успеху, но стоит добавить, что немаловажным шагом оказалась
разработка нового, намного более мощного и полного синтаксиса с поддержкой
ООП.

Абсолютно новый язык программирования получил новое имя.


Разработчики отказались от дополнения о персональном использовании,
которое имелось в аббревиатуре PHP/FI. Язык был назван просто PHP -
аббревиатура, содержащая рекурсивный акроним (англ. PHP: Hypertext
Preprocessor - «PHP: Препроцессор Гипертекста»).

К концу 1998 года PHP использовался десятками тысяч пользователей.


Сотни тысяч веб-сайтов сообщали о том, что они работают с использованием
этого языка. В то время PHP 3.0 был установлен приблизительно на 10 % веб-
серверов Интернета.

PHP 3.0 был официально выпущен в июне 1998 года после 9 месяцев
публичного тестирования.

1.2.1.3.3. PHP 4

К зиме 1998 года, практически сразу после официального выхода PHP 3.0,
Энди Гутманс и Зев Сураски начали переработку ядра PHP. В задачи входило
увеличение производительности сложных приложений и улучшение
модульности базиса кода PHP. Расширения дали PHP 3.0 возможность успешно
работать с набором баз данных и поддерживать большое количество различных
API и протоколов, но PHP 3.0 не имел качественной поддержки модулей и
приложения работали неэффективно.

Лист

Изм Лист № докум. Подп. Дата


Новый движок, названный 'Zend Engine' (от имён создателей, Зева и Энди,
также основателей Zend Technologies), успешно справлялся с поставленными
задачами и впервые был представлен в середине 1999 года. PHP 4.0,
основанный на этом движке и принёсший с собой набор дополнительных
функций, официально вышел в мае 2000 года, почти через два года после
выхода своего предшественника PHP 3.0. В дополнение к улучшению
производительности, PHP 4.0 имел ещё несколько ключевых нововведений,
таких как поддержка сессий, буферизация вывода, более безопасные способы
обработки вводимой пользователем информации и несколько новых языковых
конструкций.

На данный момент наиболее популярна именно эта версия языка.

1.2.1.3.4. PHP 5

Пятая версия PHP была выпущена разработчиками 13 июля 2004 года.


Изменения включают обновление ядра Zend, что существенно увеличило
эффективность интерпретатора. Введена поддержка языка разметки XML.
Полностью переработаны функции ООП, которые стали во многом схожи с
моделью, используемой в Java. В частности, введён деструктор, открытые,
закрытые и защищённые члены и методы, окончательные члены и методы,
интерфейсы и клонирование объектов. Нововведения, однако, были сделаны с
расчётом сохранить наибольшую совместимость с кодом на предыдущих
версиях языка.

1.2.1.3.5. PHP 6

В шестой версии PHP планируется множество нововедений, так,


например, из ядра будут исключены POSIX-регулярные выражения, «длинные»
суперглобальные массивы, будет уделено внимание поддержке Юникода.

1.2.1.4. Язык программирования Ruby

Руби (англ. Ruby) - интерпретируемый язык высокого уровня для


Лист

Изм Лист № докум. Подп. Дата


быстрого и удобного объектно-ориентированного программирования. Язык
обладает независимой от операционной системы реализацией
многопоточности, строгой динамической типизацией, «сборщиком мусора» и
многими другими возможностями. Ruby близок по особенностям синтаксиса к
языкам Перл и Эйфель, по объектно-ориентированному подходу к Smalltalk.
Также некоторые черты языка взяты из Python, Лисп, Dylan и CLU.

Кроссплатформенная реализация интерпретатора языка является


полностью свободной, распространяется с открытыми исходными текстами,
возможностью копирования и модификации.

1.2.1.4.1. История создания и развития

Создатель Ruby Юкихиро Мацумото (Matz) интересовался языками


программирования, ещё будучи студентом, но идея о разработке нового языка
появилась позже. Ruby начал разрабатываться 24 февраля 1993 года и вышел в
свет в 1995 году. Название связано с языком Перл, многие особенности
синтаксиса и семантики из которого заимствовано в Ruby: англ. pearl -
жемчужина, англ. ruby - рубин.

Целью разработки было создание «настоящего объектно-


ориентированного», лёгкого в разработке, интерпретируемого языка
программирования. Из письма автора:

Я знал Перл, но он мне не нравился - был в нём некий привкус


игрушечного языка… В то время я знал Python. Но он мне не нравился, так как
я не считал его настоящим объектно-ориентированным языком. Его OO
свойства казались надстройкой над языком… Я пытался найти такой язык, но
его не было. Тогда я решил его создать.

В Японии Ruby стал популярным с момента появления первой


общедоступной версии в 1995 году, однако наличие документации только на
японском языке сдерживало его дальнейшее распространение. Лишь в 1997
году появилось описание Ruby на английском языке, а в 1998 году открылся

Лист

Изм Лист № докум. Подп. Дата


форум «ruby-talk». Это положило начало росту известности языка в остальном
мире. Издано несколько книг на английском и немецком языках, хотя на
русский язык ни одна из них пока не переведена. Сейчас Ruby входит в
большинство дистрибутивов ОС Linux, доступен пользователям других
операционных систем.

1.2.1.4.2. Философия

Мацумото, фанат объектно-ориентированного программирования, мечтал


о языке, более мощном, чем Перл, и более объектно-ориентированным, чем
Python. Основное назначение Ruby - создание простых и в то же время
понятных программ, где важна не скорость, а понятность и простота написания.

Язык следует принципу «наименьшей неожиданности» - программа


должна вести себя так, как ожидает программист. Однако, в контексте Ruby это
означает наименьшее удивление не при знакомстве с языком, а при его
основательном изучении. Сам Мацумото утверждает, что целью разработки
была минимизация неожиданностей при программировании для него, но после
распространения языка он с удивлением узнал, что мышление программистов
похоже, и для многих их принцип «наименьшей неожиданности» совпал с его
принципом.

Ruby также унаследовал идеологию языка программирования Перл в


части предоставления программисту возможностей достижения одного и того
же результата несколькими различными способами. Люди различны, и им для
свободы необходима возможность выбирать. «Я предпочитаю обеспечить
много путей, если это возможно, но поощрять или вести пользователей, чтобы
выбрать лучший путь, если это возможно».

Одной из основных целей разработки было освобождение программистов


от рутинной работы, которую компьютер может выполнять быстрее и
качественнее. Особое внимание, в частности, уделялось будничным рутинным
занятиям (обработка текстов, администрирование), и для них язык настроен

Лист

Изм Лист № докум. Подп. Дата


особенно хорошо.

В противовес машинно-ориентированным языкам, работающим быстрее,


целью этой разработки был язык наиболее близкий к человеку. Любая работа с
компьютером выполняется людьми и для людей, и необходимо заботиться в
первую очередь о затрачиваемых усилиях людей. Язык позволяет максимально
быстро и просто для человека выполнить задачу, хотя, возможно, это и
потребует дополнительного времени работы компьютера.

1.2.1.4.3. Семантика

Ruby - полностью объектно-ориентированный язык. В нём все данные


являются объектами, в отличие от многих других языков, где существуют
примитивные типы. Каждая функция - метод. Переменные - не сами объекты, а
ссылки на них. Ruby не поддерживает множественное наследование, но вместо
него есть мощный механизм примесей. Все классы (напрямую или через другие
классы) выведены из класса Object, следовательно, любой объект может
использовать определенные в нем методы (например, class, to_s, nil?).
Процедурный стиль также поддерживается, но все глобальные процедуры
неявно являются закрытыми методами класса Object.

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


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

1.2.2. Элементы языка программирования

При создании системы тестирования был использован язык


программирования Ruby. Данный выбор обусловлен достоинствами и
преимуществами этого языка программирования над другими языками
Лист

Изм Лист № докум. Подп. Дата


(динамичность, «все - объект», лаконичность синтаксиса, поддержка элементов
функционального программирования и так далее).

1.2.2.1. Основные положения языка

— Комментарий начинается с символа "решетка" ( # ) и действует до


конца строки (EOL).

— Программа на Ruby состоит из последовательности выражений.

— Выражения могут разделяться символом "точка с запятой" ( ; ) или


символом конца строки (EOL), кроме случая незаконченного выражения
(например "+" в конце строки).

— Обратный слеш (\) в конце строки позволяет явно указать, что


выражение незаконченно и окончания следует искать в последующих
строках.

1.2.2.2. Зарезервированные слова

alias and BEGIN begin brea case class def defin


k ed
do else elsif END end ensur false for if
e
in modul next nil not or redo rescue retry
e
return self super then true undef unles until when
s
while yield

1.2.2.3. Типы данных

Базовыми типами являются: числа, строки, диапазоны, регулярные


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

Лист

Изм Лист № докум. Подп. Дата


1.2.2.4. Числа

Существуют следующие формы задания чисел: 123, 1_234, 123.45, 1.2e-3,


0xffff (шестнадцатеричное), 0b01011 (двоичное), 0377 (восьмеричное).

Помимо перечисленных, существуют другие (неявные) формы задания


чисел:

— ?a ASCII код символа "a";

— ?C-a Код сочетания Ctrl+a;

— ?M-a Код сочетания Alt+a;

— ?M-C-a Код сочетания Ctrl+Alt+a;

— :symbol Целое значение, соответствующее идентификаторам,


переменным и операторам.

1.2.2.5. Строки

Существуют следующие формы задания строк:

— 'без возможности вставки (interpolation)';

— "#{interpolation}, #{$interpolation}, #{@interpolation} и управл.


последоват.\n";

— %q! без возможности вставки (interpolation)!;

— %!Есть вставки и управляющие последовательности!;

— %Q(Есть вставки и управляющие последовательности);

— `echo выполнение команды ОС со вставками и управляющими


последовательностями`;

— %x/echo выполнение команды ОС со вставками и управляющими


последовательностями/.

1.2.2.6. Управляющие последовательности

Используются следующие управляющие последовательности: \t


Лист

Изм Лист № докум. Подп. Дата


(табулящия), \n (переход на новую строку), \r (возврат каретки), \f (подача
страницы), \b (удаление последнего символа), \a (звонок), \e (клавиша
Отмена), \s (пробел), \nnn (восьмеричное число) , \nn (шестнадцатеричное
число), \сx (Ctrl+x), \C-x (Ctrl+x), \M-x (Alt+x), \M-\C-x (Ctrl+Alt+x)

1.2.2.7. Диапазоны

Используются следующие формы задания диапазонов:

— 1..10;

— 'a'..'z';

— (1..10) === 5 => true;

— (1..10) == 15 => false.

1.2.2.8. Регулярные выражения:

Используются следующие формы задания регулярных выражений:

— /обычное регулярное выражение/i;

— %r|альтернативная форма задания регулярных выражений|.

Задействованы следующие элементы регулярных выражений:

— . любой символ исключая перевод строки;

— [ ] любой символ из указанных;

— [^ ] любой символ, кроме указанных;

— * 0 или более повторений предыдущего регулярного выражения;

— *? 0 или более повторений предыдущего регулярного выражения


(скупой);

— + 1 или более повторений предыдущего регулярного выражения;

— +? 1 или более повторений предыдущего регулярного выражения


(скупой);

Лист

Изм Лист № докум. Подп. Дата


— ? 0 или 1 повторений предыдущего регулярного выражения;

— | альтернатива;

— ( ) группировка регулярных выражений;

— ^ начало строки или текста;

— $ конец строки или текста;

— #{m,n} не меньше m и не больше n повторений предыдущего


регулярного выражения;

— #{m,n}? не меньше m и не больше n повторений предыдущего


регулярного выражения (жадный);

— \A начало строки;

— \b граница слова;

— \B не граница слова;

— \d цифра, т.е. [0-9];

— \D не цифра, т.е. [^0-9];

— \s пробельный (whitespace) символ, т.е. [ \t\n\r\f];

— \S не пробельный символ, т.е. [^ \t\n\r\f];

— \w символ, т.е. [0-9a-zA-Z_];

— \W не символ, т.е. [^0-9a-zA-Z_];

— \z конец текста;

— \Z конец текста или позиция перед завершающим переводом


строки;

— (?# ) комментарий;

— (?: ) группировка без сохранения;

— (?= ) позитивная опережающая проверка;

— (?! ) негативная опережающая проверка;


Лист

Изм Лист № докум. Подп. Дата


— (?ix-ix) включение/отключение режимов для оставшейся части
выражения;

— (?ix-ix: ) включение/отключение режимов для содержимого


скобок;

1.2.2.9. Массивы

Массивы могут быть заданы одним из следующих способов:

— [1, 2, 3]

— %w(foo bar baz)

Индексы в массивах могут быть отрицательными и отсчет тогда будет


вестись от конца массива (т.е. -1 означает "последний элемент").

1.2.2.10. Словари

Словари (они же ассоциативные массива, они же хеши) могут быть


заданы одним из следующих способов:

— { 1 => 2, 2 => 4, 3 => 6 };

— { key => value, ... }.

1.2.2.11. Файлы

Работа с файлами осуществляется при помощи следующих методов:

— File.join(p1,p2,p3, ... ,pN) => "p1/p2/.../pN" платформонезависимый


путь

— File.new(path,modestring="r") => file

— File.new(path,modenum[,permnum])> file/li>

— File.open(fileName,aModeString="r"){ |file| block } -> block_result

— File.open(fileName[,aModeNum [, aPermNum]]){ |file| block } ->


block_result

Лист

Изм Лист № докум. Подп. Дата


— IO.foreach(path,setstring=$/){ |line| block } -> block_result

— IO.readlines( path ) => array

— IO.read( path ) => string

1.2.2.12. Строка для задания режима чтения записи файла

— r чтение с начала файла (режим по умолчанию)

— r+ чтение-запись с начала файла

— w обнуление или создание файла для записи

— w+ обнуление или создание файла для чтения-записи

— a указатель устанавливается на конец файла или создается и


открывается на запись

— a+ указатель устанавливается на конец файла или создается и


открывается на чтение-запись

— b (только для DOS/Windows) двоичный режим чтения-записи


(используется совместно с другими режимами)

1.2.2.13. Переменные

— $global_variable глобальные переменные;

— @instance_variable переменные объекта;

— @@class_variable переменные класса;

— [OtherCLass::]CONSTANT константа

— local_variable локальная переменная.

1.2.2.14. Псевдопеременные

— selfвозвращает указатель на текущий объект;

— nil единственный объект класса NilClass (эквивалентен false) и


имеет смысл "пустоты";
Лист

Изм Лист № докум. Подп. Дата


— true единственный объект класса TrueClass и имеет смысл
"истины";

— false единственный объект класса FalseClass и имеет смысл


"ложи";

— __FILE__ имя обрабатываемого в текущий момент файла;

— __LINE__ текущий номер строки в обрабатываемом исходном


файле.

1.2.2.15. Предопределенные переменные

— $! последнее сообщение об ошибке;

— $@ местоположение ошибки (массив с трассировочным стеком);

— $& текст совпадения (регулярные выражения);

— $` текст перед совпадением (регулярные выражения);

— $' текст после совпадения (регулярные выражения);

— $+ текст, совпавший с последней закрытой парой круглых скобок


(регулярные выражения);

— $n n-тое подвыражение в последнем совпадении, то же самое, что и


$~[n]. (регулярные выражения);

— $~ последнее совпадение с регулярным выражением в виде массива


подвыражений;

— $= флаг зависимости от регистра символов;

— $/ разделитель во входных строках;

— $ разделитель в выходных строках;

— $, разделитель для print и Array#join;

— $; разделитель по умолчанию для String#split;

— $. номер последней строки, прочитанной интерпретатором;

Лист

Изм Лист № докум. Подп. Дата


— $< результат виртуальной конкатенации файлов, имена которых
переданы в командной строке;

— $> источник вывода по умолчанию для print, printf (по умолчанию


равен $stdout);

— $_ последняя строка, прочитанная gets или readline;

— $0 имя файла с которого началось выполнение;

— $* аргументы командной строки в виде массива (аналог args);

— $$ id процесса интерпретатора;

— $? статус завершения последнего дочернего процесса;

— $: массив путей для загрузки библиотек и модулей;

— $" массив с именами подключенных библиотек;

— $DEBUG если интерпретатор запущен с опцией -d, то равен true


(только для чтения);

— $FILENAMEтекущий обрабатываемый файл при использовании $<,


аналогично вызову $<.filename;

— $LOAD_PATH псевдоним для $:;

— $stderr текущий стандартный поток ошибок;

— $stdin текущий стандартный поток ввода;

— $stdout текущий поток вывода;

— $VERBOSE если интерпретатор запущен с опцией -v, то равен true


(только для чтения);

— $-0 псевдоним для $/;

— $-a если интерпретатор запущен с опцией -a, то равен true (только


для чтения);

— $-d псевдоним для $DEBUG;

Лист

Изм Лист № докум. Подп. Дата


— $-F псевдоним для $;;

— $-i удерживает расширения, по умолчанию nil;

— $-I псевдоним для $:;

— $-l если интерпретатор запущен с опцией -l, то равен true (только


для чтения);

— $-p если интерпретатор запущен с опцией -p, то равен true (только


для чтения);

— $-v псевдоним для $VERBOSE.

1.2.2.16. Предопределенные глобальные константы

— TRUE псевдоним для true;

— FALSE псевдоним для false;

— NIL псевдоним для nil;

— STDIN псевдоним для $stdin;

— STDOUT псевдоним для $stdout;

— STDERR псевдоним для $stderr;

— ENV словарь, который содержит переменные окружения;

— ARGF псевдоним для $<;

— ARGV псевдоним для $*;

— DATA указатель на область после __END__;

— VERSION строка с версией интерпретатора;

— RUBY_RELEASE_DATE строка с датой выпуска


интерпретатора;

— RUBY_PLATFORM идентификатор платформы.

Лист

Изм Лист № докум. Подп. Дата


1.2.2.17. Выражения

Элементом выражения могут быть базовые типы (см. выше), команда


shell, переменная, константа или вызов метода.

1.2.2.18. Операторы и приоритеты (в порядке убывания)

— ::;

— [];

— **;

— - (унарный), + (унарный), !, ~;

— *, /, %;

— +, -;

— <<, >>;

— &;

— |, ^;

— >, >=, <, <=;

— <=>, ==, ===, !=, =~, !~;

— &&;

— ||;

— .., ...;

— = (+=, -= ...);

— not;

— and, or.

Почти все представленные выше операторы являются методами (т.е. их


можно переопределить), кроме следующих: =, .. , ... , !, not, &&, and, ||, or, !=, !~.
В добавок ко всему, над составными операторами (т.е. += и др.) пользователь
не властен (т.е. зависит от метода +, в случае с +=).
Лист

Изм Лист № докум. Подп. Дата


1.2.2.19. Управляющие конструкции

Существуют следующие условные конструкции:

if логическое_выражение [then]

тело

elsif логическое_выражение [then]

тело

else

тело

end

unless логическое_выражение [then]

тело

else

body

end

выражение if логическое_выражение

выражение unless логическое_выражение

case выражение_для_проверки

when шаблон [, шаблон]... [then]

тело

when шаблон [, шаблон]... [then]

тело

Лист

Изм Лист № докум. Подп. Дата


[else

тело]

end

Существуют следующие циклические конструкции:

while логическое_выражение [do]

тело

end

until логическое_выражение [do]

тело

end

begin

тело

end while логическое_выражение

begin

тело

end until логическое_выражение

for счетчик[, счетчик]... in множество [do]

тело

end

Лист

Изм Лист № докум. Подп. Дата


множество.each do | счетчик[, счетчик]... |

тело

end

выражение while логическое_выражение

выражение until логическое_выражение

Существуют следующие директивы управления циклом:

— break завершает текущий цикл.

— redo начинает текущий цикл сначала.

— next переходит к следующей итерации текущего цикла.

— retry повторяет итерацию без проверки условия для тещего цикла.

1.2.2.20. Вызов метода

Почти все доступные вызовы метода являются опциональными и


следовательно синтаксис вызова не очень простой. Ниже представлено
несколько примеров:

— method

— obj.method

— Class::method

— method(arg1, arg2)

— method(arg1, key1 => val1, key2 => val2, aval1, aval2) #{ блок }

— method(arg1, *[arg2, arg3]) соответствует: method(arg1, arg2, arg3)

Лист

Изм Лист № докум. Подп. Дата


Описание использованных элементов:

— invocation := [receiver ('::' | '.')] name [ parameters ] [ block ]

— parameters := ( [param]* [, hashlist] [*array] [&aProc] )

— block := { blockbody } | do blockbody end

1.2.2.21. Создание класса

Имя класса всегда должно начинаться с большой латинской буквы.

class Identifier [< superclass ]

выражения..

end

# единичный класс (singleton), добавляет метод(ы) к экземпляру класса

class << obj

выражения..

end

1.2.2.22. Создание модуля

module Identifier

expr..

end

1.2.2.23. Создание метода

def method_name(arg_list, *list_expr, &block_expr)

выражения..

end

# единичный метод

def expr.identifier(arg_list, *list_expr, &block_expr)

Лист

Изм Лист № докум. Подп. Дата


выражения..

end

Следует учитывать несколько особенностей:

— все элементы из списка аргументов, включая скобки –


необязательные;

— аргументы могут иметь значения по умолчанию (name=expr);

— method_name может быть символьным оператором;

— объявление метода не может быть вложенным в другой метод;

— методы могут переопределять операторы: .., |, ^, &, <=>, ==, ===,


=~, >, >=, <, <=, +, -, *, /, %, **, <<, >>, ~, +@, -@, [], []= (2 аргумента).

1.2.2.24. Ограничение доступа

Существуют следующие модификаторы доступа:

— public - полностью доступно.

— protected - доступно только внутри класса и внутри


непосредственных потомков.

— private - доступно только внутри класса.

Ограничение на чтение-запись атрибутов (начинаются с @) производится


посредством наличия/отсутствия одноименных методов.

По умолчанию класс не дает доступа к атрибутам своих объектов


(начинаются с @).

Могут использоваться как для явного указания имен методов так и для
разделения класса на "области доступа".

class A

protected

def protected_method

Лист

Изм Лист № докум. Подп. Дата


# ничего

end

end

class B < A

public

def test_protected

myA = A.new

myA.protected_method

end

end

b = B.new.test_protected

1.2.2.25. Методы доступа

Класс Module содержит следующие вспомогательные методы:

— attr_reader атрибут[, атрибут]... - создает одноименный метод


чтения значения атрибута;

— attr_writer атрибут[, атрибут]... - создает одноименный метод


изменения значения атрибута (т.е. атрибут=);

— attr атрибут[, разрешение_на_запись] - эквивалентно "attr_reader


атрибут; attr_writer атрибут if разрешение_на_запись";

— attr_accessor атрибут[, атрибут]... - эквивалентно "attr атрибут,


TRUE" для каждого аргумента.

1.2.2.26. Псевдонимы

alias старое_название новое_название

Создает новое имя метода (новое_название) для старого

Лист

Изм Лист № докум. Подп. Дата


(старое_название). старое_название может быть любым существующим
методом или оператором, но не может быть локальной или внутренней
константой или именем класса

1.2.2.27. Блоки/замыкания

Блоками являются следующие конструкции:

— do ... end;

— { ... }.

Область видимости переменных объявленных внутри блока ограничена


блоком. Блок может получать аргументы при помощи ключевого слова yield
(при создании метода). Формы записи {} и do/end отличаются тем, что
конструкции do/end применяются преимущественно для циклов, а {} для всего
остального.

1.2.2.28. Лямбда-методы

Создаются одним из следующих способов:

— Kernel#proc;

— Proc#new;

— Вызов метода с аргументом &block.

1.2.2.29. Обработка исключений

begin

выражения..

[rescue [error_type [=> var],..]

выражения..]..

[else

выражения..]

Лист

Изм Лист № докум. Подп. Дата


[ensure

выражения..]

end

Следует обращать внимание на то, что аргументом по умолчанию для


rescue является StandardError, а не Exception.

1.2.2.30. Стандартная библиотека

Ruby поставляется с исчерпывающей библиотекой классов и модулей.


Некоторые из них встроенные, а некоторые поставляются в виде отдельных
файлов (в исходниках). При подключении библиотеки любого типа, разницы
вы не заметите.

1.2.2.31. Встроенные классы

Разработчику доступны следующие классы: Object, Hash, Symbol, IO, File,


Continuation, File::Stat, Data, NilClass, Exception, StandardError, LocalJumpError,
SystemStackError, ZeroDivisionError, RangeError, FloatDomainError,
SecurityError, ThreadError, IOError, EOFError, ArgumentError, IndexError,
RuntimeError, TypeError, SystemCallError, Errno::*, RegexpError, SignalException,
Interrupt, Fatal, NoMemoryError, ScriptError, LoadError, NameError, SyntaxError,
NotImplementedError, SystemExit, Array, Proc, String, Numeric, Float, Integer,
Bignum, Fixnum, Regexp, Thread, Module, Class, ThreadGroup, Method,
UnboundMethod, Struct, Struct::Tms, TrueClass, Time, Dir, Binding, Range,
MatchData, FalseClass.

1.2.2.32. Встроенные модули

Разработчику доступны следующие модули: Comparable, Enumerable,


Errno, FileTest, GC, Kernel, Marshal, Math, ObjectSpace, Precision, Process.

Лист

Изм Лист № докум. Подп. Дата


1.2.2.33. Поддержка сокетов

Поддержка сокетов обеспечивается следующими классами: BasicSocket,


IPSocket, TCPSocket, SOCKSSocket, TCPServer, UDPSocket, UNIXSocket,
Socket.

1.2.2.34. Поддержка Windows

Для разработчиков, использующих операционную систему Windows


существуют следующие классы: WIN32OLE, WIN32OLE_EVENT, Win32API.

Лист

Изм Лист № докум. Подп. Дата


ЗАКЛЮЧЕНИЕ
В результате прохождения преддипломной практики было точно
сформулировано задание для дипломного проектирования, установлены
требования к выполнению задания, а так же были определены и изучены такие
технологии как: Ruby on Rails, HTML/CSS, AJAX, RSS, на основе которых и
будет создаваться проект. Были освоены принципы создания клиент-серверного
приложения на основе трехуровневой архитектуры MVC. Обоснован выбор
языка программирования, необходимого для реализации системы.

Лист

Изм Лист № докум. Подп. Дата