Применение компонент-ориентированной архитектуры для...
Post on 22-May-2015
2.994 Views
Preview:
TRANSCRIPT
INTR
O
Применение Компонентно-Ориентированой Архитектуры для написания расширений
Тема:
Vitaly Korotun
vitaly@magento.com
Associate Director, Professional Services, Kiev
КР
АТК
ИЙ
ОБ
ЗО
Р К
ОМ
ПО
НЕН
ТН
О-
ОР
ИЕН
ТИ
РО
ВА
НН
ОЙ
АР
ХИ
ТЕК
ТУ
РЫ
БА
ЗО
ВА
Я М
ОД
ЕЛ
Ь
КО
МП
ОН
ЕН
ТН
ОГО
ФР
ЕЙ
МВ
ОР
КА
ПР
ЕИ
МУ
ЩЕС
ТВ
А К
ОМ
ПО
НЕН
ТН
О-
ОР
ИЕН
ТИ
РО
ВА
НН
ОЙ
АР
ХИ
ТЕК
ТУ
РЫ
Независимость расширенийКомпоненты являются неделимыми единицами системы, компонентная модель предписывает, как именно они должны взаимодействовать, фреймворк регламентирует их архитектуру и предоставляет весь обслуживающий вспомогательный функционал.
Улучшение предсказуемости системыКомпонентная модель регламентирует правила проектирования, которые насильственного навязываются всем компонентам. Это означает, что единообразие различных глобальных свойств способствуют увеличению таких качественных показателей, как масштабируемость, безопасность, конфигурируемость и т.д.
Компонент
компонент является тем, что можно
рассматривать, как "чёрный ящик"
внешние спецификации не
зависят от внутренней реализации
Компонентная модель
Компонентная модель предписывает то, как компоненты взаимодействуют друг с другом
ЗА
ДА
ЧИ
, КО
ТО
РЫ
Е Р
ЕШ
АЕТ
КО
МП
ОН
ЕН
ТА
Я М
ОД
ЕЛ
Ь
ОДНОРОДНОСТЬ КОМПОЗИЦИИ
Типизация компонентов
ЗА
ДА
ЧИ
, КО
ТО
РЫ
Е Р
ЕШ
АЕТ
КО
МП
ОН
ЕН
ТА
Я М
ОД
ЕЛ
Ь
ОДНОРОДНОСТЬ КОМПОЗИЦИИ
Типизация компонентов
Определение Схемы взаимодействий
ЗА
ДА
ЧИ
, КО
ТО
РЫ
Е Р
ЕШ
АЕТ
КО
МП
ОН
ЕН
ТА
Я М
ОД
ЕЛ
Ь
ОДНОРОДНОСТЬ КОМПОЗИЦИИ
Типизация компонентов
Определение Схемы взаимодействий
Компоновка в Ресурсы
Компонентный фреймворк
Мини-операционные системы
ЗА
ДА
ЧИ
, КО
ТО
РЫ
Е Р
ЕШ
АЕТ
КО
МП
ОН
ЕН
ТН
ЫЙ
ФРЕЙ
МВ
ОРК
СОГЛАСОВАНИЕ И ОБСЛУЖИВАНИЕ РАБОТЫ СИСТЕМЫ
Предоставление ресурсов
ЗА
ДА
ЧИ
, КО
ТО
РЫ
Е Р
ЕШ
АЕТ
КО
МП
ОН
ЕН
ТН
ЫЙ
ФРЕЙ
МВ
ОРК
СОГЛАСОВАНИЕ И ОБСЛУЖИВАНИЕ РАБОТЫ СИСТЕМЫ
Предоставление ресурсов
Управление работой компонентов
ЗА
ДА
ЧИ
, КО
ТО
РЫ
Е Р
ЕШ
АЕТ
КО
МП
ОН
ЕН
ТН
ЫЙ
ФРЕЙ
МВ
ОРК
СОГЛАСОВАНИЕ И ОБСЛУЖИВАНИЕ РАБОТЫ СИСТЕМЫ
Развертывание компонентов и приложений
Предоставление ресурсов
Управление работой компонентов
Интерфейсы
Интерфейсы обеспечивают механизм для контроля зависимостей, которые возникают между модулями системы
Контракты
Контракт компонента указывает шаблон (модель) взаимодействия по отношению к этому компоненту
Сп
осо
бы
Ож
ид
ан
ия
светл
ого
буд
ущ
его
Первы
й сп
осо
бВ
торой
спосо
б
Витаем в облаках
Действуем
Компонент-ориентированная разработка Magento Extension
Краткий Обзор архитектуры Magento
Client-Server Architecture
Blackboard
Peer-to-peer
Implicit invocation
Plug-ins
Monolithic System
Component-Based Architecture
Structured Architecture
Object-Oriented Architecture
ОП
РЕД
ЕЛ
ЕН
ИЕ А
РХ
ИТЕК
ТУРЫ
Различные алгоритмы дают различные значения производительности, различный уровень
сложности и приводят к различным уровням головная боли
ОП
РЕД
ЕЛ
ЕН
ИЕ А
РХ
ИТЕК
ТУРЫ
Посылать уведомления удаленному сервису, всякий раз при сохранении продукта
Должно легко конфигурироваться для работы только с
определенными типами продуктов
Если удаленная система вернула
ошибку, отменяем сохранение
Если удаленная система
ответила`not_valid` продукт должен
быть отмечен флагом `not_valid`?
Вариант 1
•Перекрываем контроллер saveAction() method
Вариант 2
•Перекрываем модель продукта save() method
Вариант 3
•Перекрываем ресурс модель продукта save() method
Вариант 4
•Декларируем обсервер на событие сохранения продукта
Вариант 5
•Определяем новый аттрибут со своей backend model и делаем всё там
АН
ТИ
ПА
ТТЕРН
Ы Spy Games
АН
ТИ
ПА
ТТЕРН
Ы
Spy Games
Концепция
• В систему установлено множество пользовательских модулей и, в основном, все их изменения осуществляются с помощью шаблона “Event-Observer".• Когда все пользовательские модули делают то, что они должны непосредственно внутри блоков или даже внутри шаблонов.• Конечно, отсутствие документации.
Spy Games
АН
ТИ
ПА
ТТЕРН
Ы
Дисфункция
• Приложение сложно отлаживать и трудно тестировать. • Трудно предсказать сценарий на каждой странице.
АН
ТИ
ПА
ТТЕРН
Ы
Spy Games
Рефакторинг• Если вы собираетесь изменять процесс, используйте дополнительный фильтр в контроллере процесса.• Если вы собираетесь изменить поведение во время какого-то пользовательского действия, лучше всего внедрить логику в контроллере.• Если вы собираетесь изменять данные, используйте перекрытия моделей или их вспомогательных спутников.
АН
ТИ
ПА
ТТЕРН
Ы Buddy Guy
АН
ТИ
ПА
ТТЕРН
Ы
Buddy Guy
• Экземпляр класса, который делает прямые вызовы в любые объекты, с которыми он "хочет" иметь дело (модели, ресурс модели, блоки) из любого места (блок, контроллер, шаблоны).
Концепция
АН
ТИ
ПА
ТТЕРН
Ы
Buddy Guy
• Устанавливает "скрытые" отношения между модулями, увеличивает сцепление и приводит к проблеме со следующими обновлениями.• Часто приводит к проблемам с производительностью.
Дисфункция
AN
TIPA
TTER
NS
BY M
.P.S.T. Buddy Guy likes The Anarchy
АН
ТИ
ПА
ТТЕРН
Ы
Buddy Guy
• Только помощники и модели могут быть созданы за пределами «родного» модуля
Рефакторинг
КО
МП
ОН
ЕН
Т-О
РИ
ЕН
ТИ
РО
ВА
НН
АЯ
РА
ЗРА
БО
ТК
А M
AG
EN
TO
EX
TEN
SIO
N
ПЕРЕГРУЗКА КЛАССОВ
$product = Mage::getModel('catalog/product');
<config> /****/ <global> <models> <catalog> <!-- catalog models class group declaration--> <class>Mage_Catalog_Model</class> <!-- catalog resource models class group declaration--> <resourceModel>catalog_resource_eav_mysql4</resourceModel> </catalog> </models> </global> /****/</config>
КО
МП
ОН
ЕН
Т-О
РИ
ЕН
ТИ
РО
ВА
НН
АЯ
РА
ЗРА
БО
ТК
А M
AG
EN
TO
EX
TEN
SIO
N
ДЕКЛАРАЦИЯ НОВОЙ ГРУППЫ КЛАССОВ
class My_Module_Factory{ public static function getPlugin($pluginClass = '', $arguments = array()) { $pluginClass = trim($pluginClass); if (strpos($pluginClass , '/')===false) { $className = $modelClass; } $className = Mage::getConfig()->getGroupedClassName('plugin', $pluginClass); if (class_exists($className)) { return new $className($arguments); } else { #throw Mage::exception('My_Module', ‘***’); return false; } }}$plugin = My_Module_Factory :: getPlugin(‘my_module/some_class');
КО
МП
ОН
ЕН
Т-О
РИ
ЕН
ТИ
РО
ВА
НН
АЯ
РА
ЗРА
БО
ТК
А M
AG
EN
TO
EX
TEN
SIO
N
ПЕРЕХВАТ/ПЕРЕАДРЕСАЦИЯ ВЫЗОВОВ <frontend> <routers> <checkout> <args> <modules> <custom_checkout before="Mage_Checkout">Custom_Checkout</custom_checkout> </modules> </args> </checkout> </routers> <layout> <updates> <custom_checkout module="Custom_Checkout"> <file>custom/checkout.xml</file> </custom_checkout> </updates> </layout> </frontend>
app/code/local/Custom/Checkout/
./controllers/OnepageController.php
http://your-domain.com/checkout/onepage/billing
http://your-domain.com/checkout/onepage/shipping
http://your-domain.com/checkout/onepage/customstep
КО
МП
ОН
ЕН
Т-О
РИ
ЕН
ТИ
РО
ВА
НН
АЯ
РА
ЗРА
БО
ТК
А M
AG
EN
TO
EX
TEN
SIO
N
ИНТЕРНАЦИОНАЛИЗАЦИЯ (I18N)echo Mage::helper('catalog')->__('Text Message');
<frontend>... <translate> <modules> <Mage_Catalog> <files> <default>Mage_Catalog.csv</default> </files> </Mage_Catalog> </modules> </translate>...</frontend>
design/[AREA]/[PACKAGE]/[THEME]/locale/[LOCALE_CODE]./translate.csv
КО
МП
ОН
ЕН
Т-О
РИ
ЕН
ТИ
РО
ВА
НН
АЯ
РА
ЗРА
БО
ТК
А M
AG
EN
TO
EX
TEN
SIO
N
LAYOUT XML<layout> <default translate="label" module="page"> <block type="page/html" name="root" output="toHtml" template="page/3columns.phtml"> <block type="page/html_head" name="head" as="head"> ... </block> <block type="core/text_list" name="content" as="content" translate="label"> ... </block> <block type="page/html_footer" name="footer" as="footer" template="page/html/footer.phtml"> ... </block> </block> </default> ...</layout>
<layout> ... <catalog_product_view translate="label"> <reference name="root"> <action method="setTemplate"><template>page/2columns-right.phtml</template></action> </reference> <reference name="head"> <action method="addJs"><script>varien/product.js</script></action> </reference> <reference name="content"> <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml"> </reference> </catalog_product_view> ...</layout>
<layout> ... <PRODUCT_TYPE_simple translate="label" module="catalog"> <label>Catalog Product View (Simple)</label> <reference name="product.info"> <block type="catalog/product_view_type_simple" name="product.info.simple" as="product_type_data" template="catalog/product/view/type/default.phtml"> <block type="core/text_list" name="product.info.simple.extra" as="product_type_data_extra" translate="label"> <label>Product Extra Info</label> </block> </block> </reference> </PRODUCT_TYPE_simple> ...</layout>
КО
МП
ОН
ЕН
Т-О
РИ
ЕН
ТИ
РО
ВА
НН
АЯ
РА
ЗРА
БО
ТК
А M
AG
EN
TO
EX
TEN
SIO
N
Функциональность
Ремонтопригодность
Юзабилити
Эффективность
Надежность
Переносимость
OU
TR
O
OU
TR
O
OU
TR
O
Вопросы
vitaly@magento.com
top related