Категорія: MachII
Современные фреймворки для качественной разработки на Adobe Coldfusion
(Доклад на встрече .NET User Group Sevastopol 29 июля 2011г., офис компании Softserve, Севастополь)

Фреймворк - это кусок кода, который используется повторно для создания проектов на его основе. Это своеобразны шаблон проектов. Фреймворк призван ограничивать фантазию разработчика, ставить определенные рамки, но взамен фреймворк предлагает хорошие, проверенные архитектурные решения. Следуя вдоль линий, намеченных фреймворком, разработчик в результате получит предсказуемый результат и качественный "робастный" код.
Прежде чем рассказать о фреймворках для Coldfusion, напомним, что представляет из себя этот продукт. Adobe Coldfusion - это сервер приложений, написанный по спецификации JEE, и реализующий язык Coldfusion Markup Language (CFML). CFML - интерпретируемый язык, с помощью которого можно создать веб-сайты любой сложности. Кроме веб-сайтов для Интернета, с помощью Coldfusion легко создавать сайты для корпоративных сетей (Интранетов), благодаря хорошей интеграции с корпоративными серверами, работе с разными форматами данных и протоколов.
Coldfusion появился в 1995 году и обрел популярность во времена "бума дот-комов". В то время сайты делались вебмастерами на HTML, без привлечения скриптовых языков, а единственной опцией было использование Perl. Последний нельзя считать легким для изучения и применения вебмастером - человеком с преимущественно дизайнерским набором навыков. Ответом на это было сделать простой теговый язык наподобие HTML, для быстрого освоения и разработки сайтов. После краха доткомов, Coldfusion несколько растерял популярность на волне популярности ASP и PHP, но выжил благодаря хорошей адаптации в корпоративной среде и в государственном аппарате США. Сейчас происходит второе рождение Coldfusion, и ему есть что предложить миру.
Скорость и легкость разработки на CFML имеет свои обратные стороны. Зачастую, код писался слишком быстро, чтобы выйти на рынок быстрее конкурентов. Качество было забыто, и зачастую код писался непрофессиональными программистами, что не могло отразиться на качестве. Отсутствие общей архитектуры проекта и организации кода, привело к появлению "спагетти"-кода (длинные куски кода, связанные с другими кусками в неразрешимые клубки), в котором сложно разбираться, исправлять ошибки и расширять функциональность. Выделим основные проблемы неструктурированного кода:
- отсутствие общей для проекта структуры кода
- низкая связность кода (low cohesion) - бизнес-логика "размазана" по разным участкам кода в проекте
- высокая связанность кода (tight coupling) - модули кода могут выполнять действия только в связке с другими модулями или внешними данными)
Соответственно, и решение этих проблем лежит в:
- архитектуре - применении паттерна MVC
- повышении связности кода (high cohesion) - организации модулей, каждый из которых реализует одну, заранее хорошо определенную бизнес-функцию
- понижении связанности кода (loose coupling) - делать модули как можно менее зависимыми друг от друга, передавая параметры или обмениваясь сообщениями
Хороший фреймворк призван решить эти три проблемы. Будучи написан опытными людьми, фреймворк предложит решения и направит разработчика по правильному пути. При этом фреймворк должен без изменения подходить вашему проекту, а его код быть легким и оптимизированным. Выбирая фреймворк из нескольких, обратите внимание насколько он хорошо поддерживается, есть-ли у него сторонники, насколько хороша документация.
Опишу несколько популярных фреймворков. Как правило, фреймворки используют такой паттерн для URL:
index.cfm?action=module.procedure
Единая точка входа в приложение - index.cfm, и некоторый "переключатель" - переменная action, в которой задается модуль и действие внутри этого модуля.
Fusebox
Один из ранних фреймворков. В версии 3 использовал CFML для описания модулей, в версии 4 это нужно делать через XML. В 5 версии появилась возможность отказаться от XML в пользу использования CFC. В настоящий момент фреймворк не поддерживается, хотя core-файлы стабильны и пригодны для работы с любым проектом.
Mach-II
Первый объектно-ориентированный фреймворк, представлен с появлением поддержки CFC в Coldfusion MX (2003). С помощью XML-файла фремворк описывает события (events), компоненты CFC, реагирующие на эти события, и views - CFM-файлы, отвечающие за внешний вид. Фреймворк развивается, на нем реализованы многие корпоративные приложения.
Coldspring
http://www.coldspringframework.org/
При работе с многими CFC-компонентами может встать вопрос об их упорядоченном использовании. Например, когда нужно инстанцировать зависимые объекты или синглтоны. Чтобы не следить за зависимостями вручную, фреймворк Coldspring может делать это автоматически. Для этого используется XML-конфигурация используемых объектов (beans), а для вызова конкретного объекта можно использовать лишь запрос к фабрике объектов Coldspring.
TransferORM
Object-Relation Mapping - технология работы с данными в БД с помощью объектного подхода. Один экземпляр (объект) сопоставляется (mapped) одной строке в таблице БД. Это позволяет получать доступ (считывать), добавлять, изменять и удалять записи из БД, не прибегая к написанию SQL-кода. В конечном итоге это экономит время на рутинных операциях. TransferORM - это ORM-фреймворк для Coldfusion 7 и выше. Существующие таблицы БД (и их связи) описываются XML-файлом, по которому в последствии генерируются объекты. Каждый объект содержит поля, соответствующие полям таблицы в БД, а также геттеры-сеттеры для доступа к этим полям. TransferORM поддерживает возврат списков сущностей, поиск по фильтру, поиск по запросу (используется язык TQL - Transfer Query Language).
FW/1 (Framework One)
Новый фремворк, построенный по принципу Convention over Configuration, при котором описание структуры ложится на файловую систему. Фреймворк реализован всего одним CFC файлом, от которого нужно унаследовать Application.cfc нового проекта. Фреймворк реализует паттерн MVC таким образом. Контроллером модуля является один CFC, находящийся в папке /controllers, в этом контроллере определены методы данного модуля. Для доступа к внешним данным можно использовать службу, которая также реализуется через CFC в папке /services. После выполнения метода контроллера, данные собранные в контроллере и службе, через переменную rc передаются дальше, во view, который лежит в соответсвенно папке views/module/procedure.cfm. Для облегчения дизайнерского труда используются шаблоны, которые лежат в папке /layouts и могут иметь три уровня вложенности. Вот иллюстрация, как происходит вызов и сборка конечной страницы:

Минимально необходимым файлом для создания приложения на FW/1 является /views/module/procedure.cfm. Остальные файлы, включая контроллеры, сервисы и лэйауты, необязательны. Framework One подкупает своей простотой использования и скоростью работы.
Заключение
Описанные фреймворки - не единственные, но популярные, которые я бы лично рекомендовал для любого проекта. Мой личный фаворит - FW/1 - за его легкость и простоту. Используя наработанные библиотеки классов (CFC) в проекте на базе FW/1, я обычно использую Coldspring для описания зависимостей между классами в библиотеке, а также TransferORM для упрощения рутинных операций. Для сложных запросов я не прибегаю к помощи TransferORM, чтобы не усложнять код; я пишу обычный SQL-код и хранимые процедуры. Применять тот или иной фреймворк нужно осмысленно, примеряя его возможности к потребностям конкретного проекта и конкретной команды.
Дополнительное чтение по теме:
http://www.aliaspooryorik.com/blog/index.cfm/e/posts.details/post/oo-and-fusebox-no-xml-141
http://www.adobe.com/devnet/coldfusion/articles/frameworks_intro.html
Новини CF-OpenSource v14
Оновлення продуктів та додатків
Model Glue 3.1 Release Candidate
New Official Release - Model-Glue 3.1
Вийшов новий випуск популярного фреймворку. Він містить чималу кількість виправлень та покращень, повний список яких можна переглянути за першим посиланням.
Марк Мендел робить короткий огляд планів щодо першого повноцінного релізу його системи для автоматизації документування.
Додаток, що замінює редактор на Markdown в Mango Blog.
Втілення підсвітки синтаксису з prettify.js для Mango.
Позиціонується як проект для управління процесом розробки з використанням Agile/Scrum методик. На момент написання публікації чомусь було відсутнє посилання до завантаження.
Назва говорить сама за себе.
Компонента для втілення можливостей API Intuit QuickBooks. Яких саме, пропонується дізнатися з документації.
Компонента для організації взаємодії з IMAP-шлюзом.
Компонента для організації взаємодії з SNMP-шлюзом.
Колись комерційний продукт для роботи з малюнками зроблено вільним, очевидно завдяки розповсюдженю CF8+, де ці можливості втілені на рівні мови.
Ситуація аналогічна попередньому записові.
cfCalais – A Coldfusion tag to easily create semantic data
Мітка для додавання семантичної розмітки для даних на сторінках сайту.
Mach-II Simplicity (1.8) Released
Випущено нову версію популярного фремворку.
Різні оновлення та повідомлення
Trying out the CFWheels framework
Звіт про експерименти початківця з CFWheels.
Front Controllers Should NOT Extend Application.cfc
Барні Бувер пропонує подискутувати щодо потреби наслідування Application.cfc на прикладі FW/1
Замітка розповідає про те, як можна вбудувати JavaLoader до проекту на Mach-II.
ColdFusion Query of Query tips and tricks
Ендрю Мерсер ділиться деякими знахідками та підказками з використання QoQ.
Cache Template in Request Setting Explained
Піт Фрейтаґ пояснює особливості цієї нової можливості CF9.
Новини CF-OpenSource v10
Оновлення продуктів та додатків на RIAForge
Новий MVC фреймворк.
Компонента, що за допомогою jTidy ковертує текст до валідного xHTML.
Двигунець для створення прототипів, що реалізує принципи scaffolding.
Компонента для безпосередньої взаємодії з SQLite базою без участі JDBC, реалізує стандартні операції, вміє зберігати набір CF даних безпосередньо в таблицю SQLite.
Додаток для експорту мета-даних компоненти до XML-файлу, що може бути імпортований до редактора UML.
Додаток для пошуку зайвих CFM-файлів в директоріях проекту. Навряд чи буде корисним у випадку використання фреймворків, бо базується на пошуку безпосередніх підключень (cfinclude) сторінок.
Втілення API рекомендаційного сервісу Yelp.
Втілення механізму ітератора для складних типів даних.
Втілення API сервісу хостингу онлайн-відео Brightcove.
Втілення складної структури даних: зв'язаний список.
Бібліотека для інтернаціоналізації додатків, потребує CF9.
Вельми корисна бібліотека, що дозволяє не зациклюватися на XML як форматі для обміну даними, але й підтримувати вже існуючі складні текстові формати (як EDI чи VCF4).
Бібліотека, що реалізує базові операції з малюнками.
Smartermail API wrapper + UI 1.0
Втілення API програмного комплексу Smartermail.
Кілька нових додатків для Mango
Розширення для вбудови пошуку блогу в пошукове вікно оглядача.
Додає вказаний віджет до сайту, щоб читачі могли швидко перекладати вміст за допомогою перекладача Google.
Додає блок зі швидкими посиланнями на популярні соціальні веб-сайти, наприклад Facebook чи Twitter.
Дозволяє надсилати листи з блогу (наприклад, сповіщення про коментарі) через SMTP, що вимагають TLS/SSL з'єднання.
Реалізує включення малюнків з Twitpics в бічну панель блогу.
Різні оновлення та повідомлення
Розробники фреймворку Model-Glue опублікували тренувальний курс для новачків.
Mach-II Simplicity (1.8) RC2 Released
Черговий крок до випуску нової версії Mach-II
Ще один популярний продукт готується до випуску нової версії. Це додаток для підсвітки синтаксису від Джейсона Делмора, що використовується зокрема в BlogCFC.
Кілька оновлень отримав і додаток, що втілює scaffolding для Fusebox.
Implicit Blocks in Fusebox 5.5.1
Патч для Fusebox, що дозволяє обійтись без зайвих true міток, коли в if-блоці немає false.
Оновлено бібліотеку для захисту додатків від SQL-ін'єкцій та XSS атак.
Новини CF-OpenSource v9
Оновлення продуктів та додатків
Qualified Address LiveAddress API 0.0.3
Особливо приємне оновлення, бо це мій перший досвід публікації вільного ПЗ на RIAForge. Сподіваюсь, комусь стане в нагоді ця невеличка бібліотека, що організовує взаємодію з сервісом Qualified Address для покращення та виправлення адрес.
Компонента для обробки асинхронних IPN-запитів, що надсилає Paypal в процесі обробки транзакцій. Більш детально на сайті розробника.
CF Builder DocShare Support 1.0
Втілення популярного додатку Eclipse для CFB.
Застосунок для пошуку та заміни тексту в базі даних, з можливістю відміни змін.
Stiletto - Silent server-side debugging 1.0.1
Застосунок, призначений для збереження даних про активність користувача, що призвела до помилок в роботі сайту, зокрема налагоджувальної інформації з прив'язкою за доменом та IP адресою користувача.
ColdFusion Social Network Alpha_0.1
Рання альфа втілення сайту для соціальної мережі.
Компонента для створення малюнків з типографією.
Regular Expression Find And Replace 0.1
Додаток CFB для пошуку з використанням регулярних виразів. Поки не активний.
Готується до випуску нова версія фреймворку, за посиленням опис нових можливостей.
Оновлення популярної бібліотеки для модульного тестування.
Луїс Маджано повідомив про запуск ресурсу для обміну застосунками та додатками, побудованими на ColdBox.
FlexPMDPDF - A ColdFusion PDF report generator for Flex PMD!
Як зрозуміло з назви, це генератор PDF звітів для Flex.
Різні новини та повідомлення
Mach-II Runs on Google App Engine with Open BlueDragon
Мет Вудвард повідомив про те, що нова версія фреймворку тепер може бути розгорнута на GAE.
Начало работы с MachII+Coldspring
Интересующийся разработчик знает, что для Coldfusion существует стопятьсот фреймворков (навскидку Fusebox, Mach II, Coldbox, FW/1), и в настоящее время без фреймворка начинать разрабатывать просто некошерно. На страницах нашего уютного бложека мы попробуем освещать популярные фреймворки. Для затравочки начну с описания Mach II, с самого начала работы с ней (ним ?).
Начало работы с Mach II взято из этой статьи (via) с небольшими изменениями. Все сводится к этому:
1. скачать и развернуть код собственно Mach II, Dashboard и Coldspring, добавить маппинги в CF Administrator:
- /coldspring
- /MachII
- /MachIIDashboard
Код этих трех я расположил вне корня веб-сервера и настроил маппинги, чтобы все проекты использовали одну версию фреймворка и чтобы Mach II не путался под ногами в корневой папке.
2. Код Skeleton развернуть в корень веб-сервера.
3. В файле /skeleton/config/mach-ii.xml подправить:
а) раскомментировать подключение Coldspring (mach-ii_coldspringProperty.xml) в разделе includes
б) добавить модуль с Dashboard
в) изменить свойство applicationRoot в разделе properties
г) открыть сайт в браузере и радоваться.
Упомянутый в статье баг CF 9 № 78588 починен и MachII полноценно работает под CF9 без всяких "но и если".
