Категорія: Fusebox

 

Современные фреймворки для качественной разработки на Adobe Coldfusion

(Доклад на встрече .NET User Group Sevastopol 29 июля 2011г., офис компании Softserve, Севастополь)

(Слайды в виде PDF-файла)

Фреймворк - это кусок кода, который используется повторно для создания проектов на его основе. Это своеобразны шаблон проектов. Фреймворк призван ограничивать фантазию разработчика, ставить определенные рамки, но взамен фреймворк предлагает хорошие, проверенные архитектурные решения. Следуя вдоль линий, намеченных фреймворком, разработчик в результате получит предсказуемый результат и качественный "робастный" код.

Прежде чем рассказать о фреймворках для 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

http://www.fusebox.org/

Один из ранних фреймворков. В версии 3 использовал CFML для описания модулей, в версии 4 это нужно делать через XML. В 5 версии появилась возможность отказаться от XML в пользу использования CFC. В настоящий момент фреймворк не поддерживается, хотя core-файлы стабильны и пригодны для работы с любым проектом.

Mach-II

http://www.mach-ii.com/

Первый объектно-ориентированный фреймворк, представлен с появлением поддержки CFC в Coldfusion MX (2003). С помощью XML-файла фремворк описывает события (events), компоненты CFC, реагирующие на эти события, и views - CFM-файлы, отвечающие за внешний вид. Фреймворк развивается, на нем реализованы многие корпоративные приложения.

Coldspring

http://www.coldspringframework.org/

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

TransferORM

http://transfer-orm.com/

Object-Relation Mapping - технология работы с данными в БД с помощью объектного подхода. Один экземпляр (объект) сопоставляется (mapped) одной строке в таблице БД. Это позволяет получать доступ (считывать), добавлять, изменять и удалять записи из БД, не прибегая к написанию SQL-кода. В конечном итоге это экономит время на рутинных операциях. TransferORM - это ORM-фреймворк для Coldfusion 7 и выше. Существующие таблицы БД (и их связи) описываются XML-файлом, по которому в последствии генерируются объекты. Каждый объект содержит поля, соответствующие полям таблицы в БД, а также геттеры-сеттеры для доступа к этим полям. TransferORM поддерживает возврат списков сущностей, поиск по фильтру, поиск по запросу (используется язык TQL - Transfer Query Language).

FW/1 (Framework One)

http://fw1.riaforge.org/

Новый фремворк, построенный по принципу 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

Автор: Родион Быков | Опубліковано: 29.07.2011 о 09:00 | Категорії: CFML - CFUG - Frameworks - Fusebox - FW/1 - MachII -

 

Новини CF-OpenSource v17

Цей випуск повністю присвячено новинкам з RIAForge.

tumblrCFC .2

Додаток для взаємодії з API популярної блоґо-платформи Tumblr.

Google Geocoder V3

Втілення великої кількості можливостей служби Google Geocode.

cfRecurly .2

Додаток для взаємодії з API Recurly.com, системи для організації регулярних платежів.

Lorem Ipsum Dummy Text Generator v1.0

Назва говорить сама за себе. Додаток для CF Builder.

ResourceManager 1.0.0 (Beta)

Бібліотека для локалізації додатків, створена за подобою аналогічного пакету для Flex.

OpenID4CF 0.2

Обгортка для Java-бібліотеки OpenID4Java.

Google Weather API

Втілення взаємодії з означеною службою.

Framefactory One 1.1

Цікавий проект, побудований на FW/1, що втілює фабрику для об’єктів різних типів.

FuseBox 5 no XML Snippets 1

Додаток для CF Builder для швидкого написання керівних конструкцій FB5NoXML.

OAuthConsumer 0.6

Бібліотека для базової взаємодії з сервісами на базі протоколу OAuth 1.0

ORMScanner Extension 1

Додаток для CF Builder, що може стати у нагоді при роботі з CF9 ORM.

Model-Glue security samples

Додаток на базі MG, презентований автором на конференції NCDevCon 2010.

CFC Hint Checker Extension 0.9

Додаток для CF Builder, що шукає визначення методів із загубленими hint-ами.

Making OO/MVC ColdFusion Simple 2.0

Ще один CFML-приклад, презентований автором на конференції (CFObjective 2010).

WSS4CF 0.1

Втілення стандарту WS-Security без використання Java-бібліотек.

AirxMail 0.5

Бібліотека для взаємодії з поштовими службами.

FarCry 6.0.2

Нова версія популярної відкритої CMS.

Zip/Email Extension 1

Додаток, що допомагає швидко спакувати (та надіслати поштою) код прямо з CF Builder.

 

Автор: Сергій Галашин | Опубліковано: 23.06.2010 о 10:55 | Категорії: OpenSource - ColdFusion Builder - RIAForge - Fusebox - FW/1 - Components -

 

Зміна платформи Mura CMS 5.2

Сьогодні з'явилося оновлення для популярної CMS, що включає ряд значних покращень, як в інтерфейсній частині, так і в коді.

Найбільш цікавим фактом є те, що розробники вирішили позбутися фреймворку Fusebox та поступово переходити на FW/1, за їх словами "задля кращої швидкодії". Почали вони це робити з панелі адміністратора.

Повний список оновлень можна дізнатися з повідомлення в блозі проекту: Mura CMS version 5.2 is live!

Автор: Сергій Галашин | Опубліковано: 04.02.2010 о 21:01 | Категорії: CMS - Fusebox - FW/1 - News - OpenSource -

 

Новини CF-OpenSource v10

Оновлення продуктів та додатків на RIAForge

 

cfRhino 0.3.4

Новий MVC фреймворк.

jTidy CFC 1.2

Компонента, що за допомогою jTidy ковертує текст до валідного xHTML.

cfturbine 1.2_BETA

Двигунець для створення прототипів, що реалізує принципи scaffolding.

SQLiteCFC 1.1a

Компонента для безпосередньої взаємодії з SQLite базою без участі JDBC, реалізує стандартні операції, вміє зберігати набір CF даних безпосередньо в таблицю SQLite.

CFC2UML 0.6

Додаток для експорту мета-даних компоненти до XML-файлу, що може бути імпортований до редактора UML.

Deadwood 1.0

Додаток для пошуку зайвих CFM-файлів в директоріях проекту. Навряд чи буде корисним у випадку використання фреймворків, бо базується на пошуку безпосередніх підключень (cfinclude) сторінок.

YelpCFC .1

Втілення API рекомендаційного сервісу Yelp.

Collection Iterator 1.0

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

cfBCove 1.0

Втілення API сервісу хостингу онлайн-відео Brightcove.

Linked List 2.1

Втілення складної структури даних: зв'язаний список.

i18n 1.0

Бібліотека для інтернаціоналізації додатків, потребує CF9.

Fixed File Reader 1.0

Вельми корисна бібліотека, що дозволяє не зациклюватися на XML як форматі для обміну даними, але й підтримувати вже існуючі складні текстові формати (як EDI чи VCF4).

easyImages 0.8

Бібліотека, що реалізує базові операції з малюнками.

Smartermail API wrapper + UI 1.0

Втілення API програмного комплексу Smartermail.

 

Кілька нових додатків для Mango

 

OpenSearch Plugin 1.0

Розширення для вбудови пошуку блогу в пошукове вікно оглядача.

Google Translation Widget

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

Social Links 1.0.1

Додає блок зі швидкими посиланнями на популярні соціальні веб-сайти, наприклад Facebook чи Twitter.

PowerMail 1.0

Дозволяє надсилати листи з блогу (наприклад, сповіщення про коментарі) через SMTP, що вимагають TLS/SSL з'єднання.

twitpics 1.0

Реалізує включення малюнків з Twitpics в бічну панель блогу.

 

Різні оновлення та повідомлення

 

Model-Glue Training Course

Розробники фреймворку Model-Glue опублікували тренувальний курс для новачків.

Mach-II Simplicity (1.8) RC2 Released

Черговий крок до випуску нової версії Mach-II

ColdFISH 3.0 Alpha Released

Ще один популярний продукт готується до випуску нової версії. Це додаток для підсвітки синтаксису від Джейсона Делмора, що використовується зокрема в BlogCFC.

Fusebox Scaffolder Alpha 3

Кілька оновлень отримав і додаток, що втілює scaffolding для Fusebox.

Implicit Blocks in Fusebox 5.5.1

Патч для Fusebox, що дозволяє обійтись без зайвих true міток, коли в if-блоці немає false.

Portcullis 2.0 released

Оновлено бібліотеку для захисту додатків від SQL-ін'єкцій та XSS атак.

 

Автор: Сергій Галашин | Опубліковано: 17.01.2010 о 13:19 | Категорії: ColdFusion 9 - Mango Blog - MachII - RIAForge - OpenSource - News - Fusebox - Frameworks -

 

Новини CF-OpenSource v8

Оновлення продуктів та додатків

 

Instant Code Review

Додаток для CF Builder, що дозволяє розробникам обмінюватися зразками коду безпосередньо з IDE.

Google Language Tools Extension 1.0

Додаток для CF Builder, що дозволяє перекладати частини коду на інші мови за допомогою перекладача Google.

Free Agent 0.1 beta

Позиціонується як систем для незалежної від фреймворків розробки на CFML, фактично створюючи додатковий шар абстракції, коли з іншими додатками взаємодіють лише контролери.

ColdFusion Support Chat 1.0

Проста реалізація чату служби підтримки.

Amazon S3 Explorer & ColdBox Plugin 1.0

Реалізація взаємодії з сервісами Amazon S3 засобами CF, базується на фреймворкові ColdBox.

CF Arduino 0.5

Додаток, що забезпечує взаємодію з програмно-апаратною платформою Arduino, використовує змішаний CF/Java код для взаємодії з сокетами.

Livestream CFC 1.0

Додаток на ранній стадії розробки, що планує реалізацію взаємодії з API Livestream, сервісу для публікації потокового аудіо та відео.

WhoIs CFC 1.1

Реалізація whois на чистому CFML, позиціонується як заміна раніше популярного CFX_Whois.

POP CFC 1.1

Реалізація взаємодії з поштовим сервером на CFML. Поки в ранній стадії розробки (незважаючи на вказаний номер версії).

 

Різні новини та повідомлення

 

Mach-II Simplicity (1.8) is now GPLv3 with Classpath Exception. Woot!

Нова версія фреймворку буде розповсюджуватися під новою ліцензією.

New CodexWiki tracker and repository

Розробники повідомляють, що роботу поновлено та розповідають про деякі оновлення, зокрема про переїзд коду на хостинг Assembla та появу рахунку в Twitter.

New ColdBox repository homes and tools

Аналогічні попередньому записові події відбулися й з усим фреймворком ColdBox.

ColdBox 3.0.0 Beta 3 Revision Updates

Водночас готується реліз нової версії ColdBox, бета вже версію можна завантажити.

Galleon ColdFusion Forums 2.2.9

Реймонд Кемден повідомив про вихід оновленої версії форуму.

Fusebox XML Flowchart Generator

Незважаючи на погані новини зі стану розробників Fusebox, життя спільноти продовжується. Barney Boisvert повідомив про випуск генератора блок-схем для файлів конфігурації Fusebox (підтримується тільки XML синтаксис).

Автор: Сергій Галашин | Опубліковано: 21.11.2009 о 15:31 | Категорії: ColdFusion Builder - OpenSource - Fusebox - RIAForge - Coldbox - News -

 

FuseNG -- ненароджене дитя

Незважаючи на певний оптимізм, проявлений спільнотою кілька місяців тому з приводу спроби переродження Fusebox, породжений заявою головного розробника останнього Адама Хаскеля про початок роботи над FuseNG, мріям не було суджено здійснитися. Суть подій була в тому, що компанія Teratech гальмувала розвиток Fusebox, через що фреймворк поступово відставав від розвитку подій в галузі, тому Адам зробив спробу витворити гілку проекту, повністю підтримувану спільнотою, аби надати проектові другий шанс.

На жаль, виявилися правими скептики, що не вірили в успіх цієї ініціативи.

Як повідомив Адам в своєму блозі, він не має наснаги підтримувати фреймворв, котрим сам не користується.

Фактично це означає поступове вмирання Fusebox, точніше продовження цього без особливих шансів на воскресіння.

Шкода, він досі є моїм першим та улюбленим фреймворком.

 

Автор: Сергій Галашин | Опубліковано: 12.11.2009 о 23:02 | Категорії: Community - Blogs - Subjective - Fusebox -

 

Підхід до розгортання сайту на базі Fusebox 5

В нетрях обговорення груп Railo виявив пару повідомлень, інформацію з котрих варто зберегти на майбутнє. В них наводиться спосіб оновлень живого сайту на базі Fusebox 5.

Основною проблемою, що треба вирішити, це генерація parsed файлів при одночасному доступі кількох (багатьох) користувачів. Це є відомим недоліком FB, котрий поки що не було остаточно виправлено. Суть його в тому, що при конкурентному доступі FB може записати "криві" файли (наприклад, недописані, коли <cfif> не закривається), через які весь додаток перестає працювати, видаючи незрозумілі й кожного разу різні помилки CFML синтаксису.

 

Тут є дві речі, що варто пам'ятати.

 

1. Необхідно завжди вмикати production mode на живому сайті. Незважаючи на очевидність кроку, це вельми розповсюджена помилка. Бо в development режимах FB генерує ті чи інші файли, що значно підвищує вірогідність виникнення помилок. Не кажучи вже про те, що сповільнює роботу сайту.

 

2. Варто тримати три робочі копії проекту.

Перша -- повноцінна розробницька версія, з відповідним development режимом, типово локально у розробника.

Друга -- живий сайт, з production режимом та всіма відповідними налаштуваннями.

І нарешті третя копія, призначення тільки для розгортання (deployment). Вона розміщується окремо від основного сайту (на тому самому сервері) та призначена для безпечного генерування parsed файлів (для великих проектів може займати кілька хвилин), котрі потім гуртом копіюються прямо на живо. Цю операцію варто повторювати при кожному оновленні, принаймні коли змінюються файли, що знаходяться під контролем Fusebox'у.

У випадку зміни ланцюжків (circuits) може потребуватися запустити основний сайт з fusebox.load, щоб він їх "підхопив".

 

На щастя, цей процес цілком можна автоматизувати, наприклад за допомогою Ant.

 

Примітка для користувачів Railo: deployment та production копії варто тримати ізольованими в різних веб-контекстах, хоча саме ядро Fusebox може бути те саме, достатньо використати мапінги (mapping) для контекстів.

 

 

Автор: Сергій Галашин | Опубліковано: 06.10.2009 о 06:23 | Категорії: Fusebox - Gotchas - Railo -

 

Зміни в документації Fusebox

Як повідомив сьогодні Адам Хаскель (Adam Haskell), документація та баґтркекінг фреймворку більше не вестимуться в Trac. Цікаво, що заміною стали пропрієтарні системи від Atlassian: Confluence Wiki та Jira. Штука в тому, що вони надані під "free Atlassian open source license for Fusebox", тобто безкоштовно. Зрозуміло, Atlassian приємно попіаритися за рахунок допомоги відомому проектові.

Отже, тепер документація доступна за адресою http://wiki.fuseboxframework.org

Поки що особливої вигоди з точки зору користувача я не побачив, але Адам наполягає, що редагування стало значно зручнішим. Сподіваюсь, це позитивно відобразиться на кількості документації.

Трекер знаходиться за адресою http://jira.fuseboxframework.org

Більшість тікетів було вже перенесено. Але, як зауважив Адам, якщо важливі для вас тікети були загублені, він буде радий їх перенести, або навіть можете зробити це самі.

Автор: Сергій Галашин | Опубліковано: 12.04.2009 о 16:46 | Категорії: Fusebox - Documentation - Frameworks -

 

Fusebox 5

Версия 5.1 этого фреймворка вышла 26 июня, скачать ядро, плагины и примеры можно тут. Там же можно скачать и словари, но о них чуть дальше. Всё что написано касается версии для ColdFusion, но большинство подходит и для PHP-версии. Для упрощения понимания терминов, перевод названий не везде дословный.

Некоторые нововведения:

- добавлены новые режимы работы (кроме уже существующих development и production), - добавлены словари (lexicons), - теперь можно использовать одни и те же файлы ядра для нескольких приложений. Собственно можно использовать практически все файлы, от сёркитов до словарей (global sharing), - добавлены безопасные URL-ы - добавлен режим трассировки

Коротко о каждом

Режимы работы:

1. developement-full-load - аналогичен режиму developement для Fusebox 4, который теперь использовать не рекомендуется (режим, не Fusebox =)). Заставляет Fusebox парсить все файлы, а если были изменены xml файлы - в добавок перезагружает сам Fusebox 2. development-circuit-load - перегружает все circuit файлы, которые участвуют в запросе и парсит все файлы, необходимые для выполнения текущего запроса 3. production - тут изменений нет, используются уже распарсеные файлы, все работает правильно и быстро =)

также можно выбрать режим, используя переменные (само собой они логические): fusebox.load - перегружает xml файлы fusebox.parse - парсит выбранный фьюзэкшн fusebox.execute - выполняет его fusebox.loadclean - то же что и load, но удаляет все файлы, которые распарсены до этого fusebox.parseall - парсит все public фьюзэкшны

Словари (lexicons)

Позволяют вводить использовать в circuit файлах новые функции и управлюящие структуры. Словари состоят из слов (verbs). Объявляются и используются словари как пространства имен XML. Подключить словарь можно так:
в fusebox.xml.cfm
<fusebox xmlns:myLex="/lexicon/mylex"/>
или так
в circuit.xml.cfm
<circuit xmlns:myLex="/lexicon/mylex"/>

и затем использовать в circuit.xml.php примерно так:
<myLex:dump label="Attributes Scope" var="Attributes" />
это вызовет слово dump из лексикона myLex с параметрами label и var

За руководством по написанию словарей лучше обратиться сюда

 

Shared core files

Для использования общих файлов ядра, в каждом отдельном приложении нужно создать файл index.cfm такого вида:
<cfapplication name="sampleapp" sessionmanagement="Yes" sessiontimeout="#CreateTimeSpan(0, 4,0,0)#" >
<cfset FUSEBOX_APPLICATION_KEY = "myApp">
<cfset FUSEBOX_APPLICATION_PATH="../scripts/FBCore" >
<cfinclude template="#fusebox_Application_Path#/fusebox5/fusebox5.cfm" >
с разными FUSEBOX_APPLICATION_KEY и соответствующими путями к ядру и приложению

"Безопасные" URL'ы

Используются за счет еще одного нововведения - тега . Теперь xfa будет выглядеть так:
<xfa name="edit" value="app.edittask">
<parameter name="id" value="#attributes.id#"/>
</xfa>
вместо
<xfa name="edit" value="app.edittask&amp;id=#attributes.id#"/>

Такой механизм позволяет модифицировать URL, изменяя параметры self, queryStringStart, queryStringSeparator, queryStringEqual и myself. Например если задать их все как '/', то такой получим URL: app.edittask/id/#attributes.id# и myself - index.cfm/fuseaction/

"Безопасность" тут заключается в более удобном понимании таких URL'ов человеком и поисковыми системами.

Режим трассировки

Установив
<parameter name="debug" value="true" />
можно отслеживать время выполнения отрезков приложения, расставляя метки трассировки при помощи myFusebox.trace(type,message) предопределенные типы - fusebox, runtime, compiler. Можно создавать свои собственные типы.

Вот вкратце и все о нововведениях. На самом деле их значительно больше, и они заслуживают более подробного описания, но, что есть - то есть =)

Автор: Владимир Каленюк | Опубліковано: 06.09.2007 о 06:46 | Категорії: Frameworks - Fusebox -