40

Применение компонент-ориентированной архитектуры для написания Magento Extensions

Embed Size (px)

Citation preview

Page 1: Применение компонент-ориентированной архитектуры для написания Magento Extensions
Page 2: Применение компонент-ориентированной архитектуры для написания Magento Extensions

INTR

O

Применение Компонентно-Ориентированой Архитектуры для написания расширений

Тема:

Vitaly Korotun

[email protected]

Associate Director, Professional Services, Kiev

Page 3: Применение компонент-ориентированной архитектуры для написания Magento Extensions

КР

АТК

ИЙ

ОБ

ЗО

Р К

ОМ

ПО

НЕН

ТН

О-

ОР

ИЕН

ТИ

РО

ВА

НН

ОЙ

АР

ХИ

ТЕК

ТУ

РЫ

Page 4: Применение компонент-ориентированной архитектуры для написания Magento Extensions

БА

ЗО

ВА

Я М

ОД

ЕЛ

Ь

КО

МП

ОН

ЕН

ТН

ОГО

ФР

ЕЙ

МВ

ОР

КА

Page 5: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ПР

ЕИ

МУ

ЩЕС

ТВ

А К

ОМ

ПО

НЕН

ТН

О-

ОР

ИЕН

ТИ

РО

ВА

НН

ОЙ

АР

ХИ

ТЕК

ТУ

РЫ

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

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

Page 6: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Компонент

компонент является тем, что можно

рассматривать, как "чёрный ящик"

внешние спецификации не

зависят от внутренней реализации

Page 7: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Компонентная модель

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

Page 8: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ЗА

ДА

ЧИ

, КО

ТО

РЫ

Е Р

ЕШ

АЕТ

КО

МП

ОН

ЕН

ТА

Я М

ОД

ЕЛ

Ь

ОДНОРОДНОСТЬ КОМПОЗИЦИИ

Типизация компонентов

Page 9: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ЗА

ДА

ЧИ

, КО

ТО

РЫ

Е Р

ЕШ

АЕТ

КО

МП

ОН

ЕН

ТА

Я М

ОД

ЕЛ

Ь

ОДНОРОДНОСТЬ КОМПОЗИЦИИ

Типизация компонентов

Определение Схемы взаимодействий

Page 10: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ЗА

ДА

ЧИ

, КО

ТО

РЫ

Е Р

ЕШ

АЕТ

КО

МП

ОН

ЕН

ТА

Я М

ОД

ЕЛ

Ь

ОДНОРОДНОСТЬ КОМПОЗИЦИИ

Типизация компонентов

Определение Схемы взаимодействий

Компоновка в Ресурсы

Page 11: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Компонентный фреймворк

Мини-операционные системы

Page 12: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ЗА

ДА

ЧИ

, КО

ТО

РЫ

Е Р

ЕШ

АЕТ

КО

МП

ОН

ЕН

ТН

ЫЙ

ФРЕЙ

МВ

ОРК

СОГЛАСОВАНИЕ И ОБСЛУЖИВАНИЕ РАБОТЫ СИСТЕМЫ

Предоставление ресурсов

Page 13: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ЗА

ДА

ЧИ

, КО

ТО

РЫ

Е Р

ЕШ

АЕТ

КО

МП

ОН

ЕН

ТН

ЫЙ

ФРЕЙ

МВ

ОРК

СОГЛАСОВАНИЕ И ОБСЛУЖИВАНИЕ РАБОТЫ СИСТЕМЫ

Предоставление ресурсов

Управление работой компонентов

Page 14: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ЗА

ДА

ЧИ

, КО

ТО

РЫ

Е Р

ЕШ

АЕТ

КО

МП

ОН

ЕН

ТН

ЫЙ

ФРЕЙ

МВ

ОРК

СОГЛАСОВАНИЕ И ОБСЛУЖИВАНИЕ РАБОТЫ СИСТЕМЫ

Развертывание компонентов и приложений

Предоставление ресурсов

Управление работой компонентов

Page 15: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Интерфейсы

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

Page 16: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Контракты

Контракт компонента указывает шаблон (модель) взаимодействия по отношению к этому компоненту

Page 17: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Сп

осо

бы

Ож

ид

ан

ия

светл

ого

буд

ущ

его

Первы

й сп

осо

бВ

торой

спосо

б

Витаем в облаках

Действуем

Page 18: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Компонент-ориентированная разработка Magento Extension

Page 19: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Краткий Обзор архитектуры Magento

Client-Server Architecture

Blackboard

Peer-to-peer

Implicit invocation

Plug-ins

Monolithic System

Component-Based Architecture

Structured Architecture

Object-Oriented Architecture

Page 20: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ОП

РЕД

ЕЛ

ЕН

ИЕ А

РХ

ИТЕК

ТУРЫ

Различные алгоритмы дают различные значения производительности, различный уровень

сложности и приводят к различным уровням головная боли

Page 21: Применение компонент-ориентированной архитектуры для написания Magento Extensions

ОП

РЕД

ЕЛ

ЕН

ИЕ А

РХ

ИТЕК

ТУРЫ

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

Должно легко конфигурироваться для работы только с

определенными типами продуктов

Если удаленная система вернула

ошибку, отменяем сохранение

Если удаленная система

ответила`not_valid` продукт должен

быть отмечен флагом `not_valid`?

Вариант 1

•Перекрываем контроллер saveAction() method

Вариант 2

•Перекрываем модель продукта save() method

Вариант 3

•Перекрываем ресурс модель продукта save() method

Вариант 4

•Декларируем обсервер на событие сохранения продукта

Вариант 5

•Определяем новый аттрибут со своей backend model и делаем всё там

Page 22: Применение компонент-ориентированной архитектуры для написания Magento Extensions

АН

ТИ

ПА

ТТЕРН

Ы Spy Games

Page 23: Применение компонент-ориентированной архитектуры для написания Magento Extensions

АН

ТИ

ПА

ТТЕРН

Ы

Spy Games

Концепция

• В систему установлено множество пользовательских модулей и, в основном, все их изменения осуществляются с помощью шаблона “Event-Observer".• Когда все пользовательские модули делают то, что они должны непосредственно внутри блоков или даже внутри шаблонов.• Конечно, отсутствие документации.

Page 24: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Spy Games

АН

ТИ

ПА

ТТЕРН

Ы

Дисфункция

• Приложение сложно отлаживать и трудно тестировать. • Трудно предсказать сценарий на каждой странице.

Page 25: Применение компонент-ориентированной архитектуры для написания Magento Extensions

АН

ТИ

ПА

ТТЕРН

Ы

Spy Games

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

Page 26: Применение компонент-ориентированной архитектуры для написания Magento Extensions

АН

ТИ

ПА

ТТЕРН

Ы Buddy Guy

Page 27: Применение компонент-ориентированной архитектуры для написания Magento Extensions

АН

ТИ

ПА

ТТЕРН

Ы

Buddy Guy

• Экземпляр класса, который делает прямые вызовы в любые объекты, с которыми он "хочет" иметь дело (модели, ресурс модели, блоки) из любого места (блок, контроллер, шаблоны).

Концепция

Page 28: Применение компонент-ориентированной архитектуры для написания Magento Extensions

АН

ТИ

ПА

ТТЕРН

Ы

Buddy Guy

• Устанавливает "скрытые" отношения между модулями, увеличивает сцепление и приводит к проблеме со следующими обновлениями.• Часто приводит к проблемам с производительностью.

Дисфункция

Page 29: Применение компонент-ориентированной архитектуры для написания Magento Extensions

AN

TIPA

TTER

NS

BY M

.P.S.T. Buddy Guy likes The Anarchy

Page 30: Применение компонент-ориентированной архитектуры для написания Magento Extensions

АН

ТИ

ПА

ТТЕРН

Ы

Buddy Guy

• Только помощники и модели могут быть созданы за пределами «родного» модуля

Рефакторинг

Page 31: Применение компонент-ориентированной архитектуры для написания Magento Extensions

КО

МП

ОН

ЕН

Т-О

РИ

ЕН

ТИ

РО

ВА

НН

АЯ

РА

ЗРА

БО

ТК

А 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>

Page 32: Применение компонент-ориентированной архитектуры для написания Magento Extensions

КО

МП

ОН

ЕН

Т-О

РИ

ЕН

ТИ

РО

ВА

НН

АЯ

РА

ЗРА

БО

ТК

А 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');

Page 33: Применение компонент-ориентированной архитектуры для написания Magento Extensions

КО

МП

ОН

ЕН

Т-О

РИ

ЕН

ТИ

РО

ВА

НН

АЯ

РА

ЗРА

БО

ТК

А 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

Page 34: Применение компонент-ориентированной архитектуры для написания Magento Extensions

КО

МП

ОН

ЕН

Т-О

РИ

ЕН

ТИ

РО

ВА

НН

АЯ

РА

ЗРА

БО

ТК

А 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

Page 35: Применение компонент-ориентированной архитектуры для написания Magento Extensions

КО

МП

ОН

ЕН

Т-О

РИ

ЕН

ТИ

РО

ВА

НН

АЯ

РА

ЗРА

БО

ТК

А 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>

Page 36: Применение компонент-ориентированной архитектуры для написания Magento Extensions

КО

МП

ОН

ЕН

Т-О

РИ

ЕН

ТИ

РО

ВА

НН

АЯ

РА

ЗРА

БО

ТК

А M

AG

EN

TO

EX

TEN

SIO

N

Page 37: Применение компонент-ориентированной архитектуры для написания Magento Extensions

Функциональность

Ремонтопригодность

Юзабилити

Эффективность

Надежность

Переносимость

Page 38: Применение компонент-ориентированной архитектуры для написания Magento Extensions

OU

TR

O

Page 39: Применение компонент-ориентированной архитектуры для написания Magento Extensions

OU

TR

O

Page 40: Применение компонент-ориентированной архитектуры для написания Magento Extensions

OU

TR

O

Вопросы

[email protected]