Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
14
Добавлен:
28.03.2016
Размер:
574.45 Кб
Скачать

11

02070743.00569-01 81 01

Рис. 2.1. Загальна схема побудови Web-застосування

Будучи безкоштовним і практично першим простим і новаторським в своєму напрямі, він по праву набув швидкого поширення серед Web-

програмістів. PHP надає розробникам велику кількість найрізноманітніших функцій, які потрапили до мови із розширень, що створюються різними групами програмістів. В результаті синтаксис мови не погоджений. Багато задач, наприклад розбиття рядка на масив або підрядки, вирішуються неймовірною кількістю всіляких наборів функцій. Все це пов'язано з сильним впливом Perl, в якому неортогональність є частиною концепції. Проте PHP

замислювалася як промислова і ортогональна мова, і альтернативні набори функцій для вирішення одних і тих же завдань сильно заважають створювати код в єдиному стилі. На жаль, проблема швидше за все не буде вирішена з міркувань зворотної сумісності. До інших складнощів слід віднести:

Відсутність зворотної сумісності між версіями мови.

Відсутність підтримки Unicode в ядрі мови.

Відсутність багатопоточності.

31

12

02070743.00569-01 81 01

Мовою програмування, позбавленою цих недоліків є відносно нова мова

Ruby [6-9].

2.5. Мова програмування Ruby

Ruby – це скриптова мова програмування, що інтерпретується, для швидкого і простого об'єктно-орієнтованого програмування. Вона включає різні засоби для обробки текстових файлів і вирішення завдань адміністрування.

Мова Ruby розширювана, портовна, вільно-поширювана.

Характеристики Ruby [8] і переваги в порівнянні з іншими подібними мовами програмування (зокрема PHP):

Простий синтаксис, частково запозичений з таких мов, як Ada і Eiffel.

Підтримка виключень.

Перевизначення операторів.

Чиста, повністю об'єктно-орієнтована мова. Всі дані є об'єктами, без виключень.

Можливість додавати методи до об'єкту або до класу під час виконання так, що при необхідності, два екземпляри одного класу можуть відрізнятися один від одного.

Підтримується лише єдине спадкування. Але існує поняття модуля, як колекції методів, які можна імпортувати в клас. Існує думка, що такий спосіб – красивіший, ніж множинне спадкування, яке складніше і рідше використовується.

Анонімні функції і замикання (closures).

Можливо структурувати код в блоки { ... } або do ... end, які можна передавати методам як аргумент.

Збирання сміття.

Можливість написання розширень на C, з використанням спеціального

API, в якому підтримується збірка сміття. Є підтримка генератора C-

розширений для скриптових мов SWIG.

32

13

02070743.00569-01 81 01

Підтримується два типи цілих чисел: малі Fixnum і великі Bignum. При цьому програмістові не потрібно турбуватися про те, якого типа використовувати, перетворення відбувається автоматично.

Не потрібне оголошення змінних. Зона видимості змінної описується в її імені за допомогою наступної угоди: var – локальна змінна @var – змінна екземпляра класу $var – глобальна змінна.

Незалежна від платформи підтримка багатопоточності.

Зупинимось детальніше на деяких використаних вище поняттях.

Скриптовими зазвичай називають мови, що володіють більшістю з наступних характеристик: мова спроектована для вживання в конкретної наочної області або може бути легко модифікований для цього, володіє спрощеним синтаксисом, не компільований, інтерпретатор може працювати в режимі діалогу, простота програмування в збиток продуктивності, динамічна типізація [9].

Анонімна функція – це функція, яка може не мати імені. Звичайно це проста функція, використовувана в програмі єдиний раз. Анонімну функцію можна створювати безпосередньо на етапі виконання програми і передавати як аргумент [9].

Часто анонімні функції застосовують як callback-процедур.

Замикання (closure) – це функція, яка звертається до вільних змінних у власному контексті. Замикання – це об'єднання коду функції і її власної зони видимості змінних на момент створення[9].

Замикання можуть застосовуватися, наприклад, розробниками програмних бібліотек, аби дозволити користувачеві бібліотеки розширювати її,

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

33

14

02070743.00569-01 81 01

Згідно [10], мова Ruby є однією з кращих перших мов програмування, що

вивчається студентами. І ось чому:

1.Швидкий цикл розробки (редагування – запуск – редагування).

2.Використання інтерпретатора.

3.Початкова об'єктна орієнтованість.

4.Змінні, що не типізуються (не вимагають оголошення).

5.Використання і результат в різних операційних системах принципово

не відрізняються.

Всі вищезгадані властивості дозволяють студентам сконцентрувати свою увагу на загальних принципах програмування.

2.6. Конкретизація задачі

Розглянувши певні технології створення Web-застосувань, ми можемо сказати, що такі технології, як HTML, CGI відходять у минуле, бо вони не відповідають загальним вимогам на сучасному етапі розвитку Інтернет-

технологій.

Ми можемо прийти до висновку, що на даний момент серед умовно безкоштовних найбільш розповсюдженими залишаються дві технології: PHP та нова технологія Ruby. І за зазначених в попередньому розділі причин в даній роботі пропонується використовувати саме нову технологію Ruby.

За мету ставиться створення Web-застосування – багаторівневої системи відстежування помилок (системи такого типу використовуються, зокрема, при розробці і тестуванні програмного забезпечення) за допомогою технології

Ruby.

2.6.1. Ruby для Web-застосувань

Ruby – універсальна мова, але її аж ніяк не можна вважати виключно

«мовою Web», не дивлячись на це, одне з найбільш типових її вживань – створення застосувань (та і взагалі інструментів в широкому сенсі) для Web.

34

15

02070743.00569-01 81 01

Існує безліч способів розробляти застосування для Web на Ruby – від порівняно невеликих і низькорівневих бібліотек до каркасів, які диктують стиль кодування і мислення. Одною з перспективнх, на цей час технологій в рамках

Ruby – є Ruby on Rails

2.6.1.2. Ruby on Rails

CGI, як досить примітивна і застаріла технологія не може претендувати на першість в сучасному світі Web-програмування. Для методологій RAD і Agile

необхідні прудкість і як можна велика автоматизація рутинної частини розробки. У зв'язку з цими вимогами для багатьох шаблонів розробки ПО стали з'являтися варіанти «каркасів» застосувань – технологій створення web-

застосувань.

У співтоваристві користувачів Ruby одним з широко найвідоміших каркасів для Web є Ruby on Rails (або просто Rails). Його автор Девід Хайнемайер Хансон (David Heinemeier Hansson) [18].

У каркасі Rails широко використовуються динамічні властивості Ruby. У

нього також є власна філософія, направлена на швидку розробку Web-

застосувань [7].

2.6.1.3. Принципи і техніка

Каркас Rails побудований на основі патерну Модель-вигляд-контролер

(Model-View-Controller – MVC). Кожне застосування природно розбивається на моделі (що моделюють наочну область), вигляди (за допомогою яких інформація представляється користувачеві і організовується можливість взаємодії) і контролери (що грають роль арбітрів між моделями і виглядами).

Уоснову поведінки Rails як каркаса покладені певні принципи. Один з них

«принцип мінімізації коду»: не пишіть код для пов'язання одного з іншим,

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

35

16

02070743.00569-01 81 01

без конфігурації (і наблизитися до ідеального середовища з нульовою конфігурацією).

Рис. 2.2. Архітектура шаблону MVC для Rails

Rails прекрасно справляється з автоматизацією не дуже складних завдань.

Якщо це має сенс, він сам генерує код, позбавляючи програміста від необхідності писати його вручну [12].

Web-застосування часто зберігають дані в базі, і Rails забезпечує безшовну інтеграцію з базою даних. В Web-каркасах спостерігається тенденція проявляти схильність до якогось конкретного об'єктно-реляційного відображення (objectrelational mapper, ORM), і Rails – не виключення. Стандартним для Rails є

відображення ActiveRecord. На його основі будуються призначені для користувача моделі даних і зв'язуються з контролерами (рис. 2.3).

36

17

02070743.00569-01 81 01

Рис. 2.3. Зв'язок управління web-застосування (контроллера) і БД (моделі)

Бази даних описуються у файлі config/database.уaml – одному з небагатьох необхідних конфігураційних файлів (звичайно ж, у форматі YAML). У ньому перераховано три різні бази даних: для розробки, для тестування і для промислової експлуатації. На перший погляд, це перебір, але насправді така схема виявляється дуже зручною.

Rails генерує порожні моделі і контролери. В ході редагування моделей ви визначаєте зв'язки між таблицями бази даних за допомогою таких методів, як has_many і belongs_to (і багато інших). Оскільки між моделями і таблицями є відповідність, то написаний вами код заразом визначає і зв'язки між самими моделями. Для контролю даних служать такі методи, як validates_presence_of (перевіряє, що дані присутні) і validates_uniqueness_of (перевіряє, що дані унікальні).

Рис. 2.4. Зв'язок управління web-застосування (контролера) і призначеним для користувача виглядом в браузері

В результаті створення застосування Rails командою вигляду rails appname

ви отримуєте каталог appname з такою структурою:

37

18

02070743.00569-01 81 01

арр

controllers helpers models views

config db doc lib log public script test vendor

Велика частина коду знаходиться в каталозі арр. Як бачите, сама його структура слідує патерну MVC. Схеми баз даних знаходяться в каталозі db.

Інкрементні файли міграції теж попадуть сюди. У Rails є концепція

«оббудовування» (scaffolding), яка дуже спрощує життя. Якщо ввести команду script /generate scaffold Product (Product – ім'я моделі), то для таблиці Products (звернете увагу на множину) згенерується функціональність «створити-

відновити-видалити».

Можна оббудуватися і не генеруючи жоден код – досить викликати усередині контролера Product метод scaffold:

class ProductController < ActiveRecord::Base

scaffold :product

end

Слід зазначити, що в Rails процедура створення структури ActiveRecord для конкретної БД визначається командою

Rake DB:Migrate

38

19

02070743.00569-01 81 01

а власне правила створення таблиць описуються в каталозі db/migrate у вигляді послідовності класів, що реалізовують «інтерфейс» ActiveRecord::Migration [12]. Правила ж доступу до даних за допомогою ActiveRecord описує власне сама модель.

На основі даного каркасу і особливостей шаблону MVC, розглянемо загальну архітектуру Web-застосувань на основі Rails:

3-уровневая архитектура

 

Клиент

Приложение

Структура БД (адаптер, схема)

 

 

 

 

 

 

 

 

 

Модель MVC

use

 

 

 

 

 

 

 

 

Вид

Контроллер

Модель (бизнес логика)

 

 

 

 

 

 

 

 

 

Route (точка

 

 

 

 

входа)

 

использует

 

 

 

 

 

HTTP

разбирает

 

 

 

 

 

 

Браузер

запрос

Controller:Action:Param

Использует/

ORM

вызывает

 

ответ

 

 

 

 

 

 

 

 

вызывает

 

 

Отрисовка

вида

Рис. 2.5. Загальна архітектура Web-застосування, заснованого на MVC

2.6.1.4. Базові розширення

Одне з достоїнств Rails – наявність широкого набору допоміжних методів,

визначених в модулі ActiveSupport::CoreExtensions. Вони нешкідливі і після додавання в основні класи стають доступні всьому застосуванню.

Деякі з цих методів мають відношення до роботи з датами і часом. Оскільки усередині системи час зберігається в секундах, то мають сенс методи minutes і hours:

39

20

02070743.00569-01 81 01 elapsed = 3.days + 4.hours + 17.minutes

later = Time.now + elapsed

Можна робити і такі речі:

time = 3.minutes.from_now #то ж, що Time.now + 3.minutes.

t2 = 5.days.from_now

Операції з часом представлені особливо повно. За допомогою методів midnight, next_month і beginning_of_week можна точно і коротко задавати моменти часу.

Один з найвідоміших трюків в цьому модулі – метод Symbol#to_proc. Він дозволяє передавати символ, що представляє ім'я методу, замість блоку.

Наприклад, наступні дві пропозиції еквівалентні:

arr = array.map { |x| x.upcase }

arr = array.map { &:upcase }

Окрім згаданих тут методів, є ще десятки інших. Одні займаються перетворенням різних одиниць виміру часу, інші – перекладом з YAML або

XML, треті, – перевіркою правопису і розставлянням розділових знаків в рядках і так далі [16].

2.6.1.5. Додаткові інструменти і бібліотеки

Неминучою була поява зовнішніх інструментів для роботи з Rails.

Наприклад, в редактор TextMate вбудована непогана підтримка (синтаксичне підсвічування, автоматичне дописування коду і так далі). Цей редактор,

напевно, є найпопулярнішим серед програмістів на Ruby на платформі OS X.

40