Wzorce projektowe w informatyce stosuje się już od dawna i aktualnie korzystanie z nich w programowaniu jest nie tylko standardem, ale i obowiązkiem. Dzięki nim kod jest bardziej zorganizowany i łatwiejszy w rozwijaniu, co jest niezwykle ważne w przypadku aplikacji typu Open Source.

Mimo iż stosowanie wzorców jest obowiązkowe, to sama ich implementacja w danym systemie zależy już od jego autorów. Bardziej rozbudowane aplikacje często wykorzystują nie jeden a kilka wzorców. W przypadku Magento jest to nawet kilkanaście. A przynajmniej tyle udało mi się odkryć. Poniżej przedstawiam, mam nadzieję kompletną listę wzorców projektowych wykorzystywanych przez tą platformę wraz z krótkimi przykładami ich zastosowania w kodzie.

Model Widok Kontroler

Aktualnie chyba najpopularniejszy wzorzec stosowany w programowaniu. Dzieli on aplikację na trzy części:

  1. Model – zawierają logikę biznesową
  2. Widok – odpowiada za sposób w jaki aplikacja prezentowana jest użytkownikowi
  3. Kontroler – odbiera dane od użytkownika, przekazuje je do modelu oraz zarządza widokami

Wykorzystanie wzorca przez Magento

Warstwa widoku przejęła część obowiązków kontrolera i została rozbita na układ (layout)  – plik xml definiujący co i gdzie wyświetlić na stronie, szablon (template) – plik phtml odpowiadający za to, jak wyświetlić dany element, oraz blok – mający za zadanie pobrać dane z modelu i przekazać je do szablonu.

moduł

Metoda wytwórcza

Interfejs odpowiedzialny za instancjonowanie klas.

Wykorzystanie wzorca przez Magento

Implementację tego wzroca znajdziemy w klasie bazowej Mage w postaci takich metod jak np. getModel(‚grupa_klas/klasa’) czy helper(‚grupa_klas/klasa’) do których jako parametr przekazujemy abstrakcyjną nazwę klasy której instancję chcemy utworzyć.

1cod

Singleton

Określa, że w danym momencie może istnieć tylko jedna instancja danej klasy oraz umożliwia do niej globalny dostęp.

Wykorzystanie wzorca przez Magento

Wystarczy wywołanie metody Mage::getSingleton(‚grupa_klas/klasa’). Co ciekawe, korzystając z metody Mage::getModel(‚grupa_klas/klasa’) ciągle mamy możliwość tworzenia nowych instancji danego obiektu. Do implementacji tej metody wykorzystano Rejestr.

2cod

Rejestr

Pozwala na umieszczanie obiektów i danych w globalnej puli, umożliwiając dostęp do nich z każdego miejsca w kodzie.

Wykorzystanie wzorca przez Magento

Dodanie czegoś do rejestru w Magento odbywa się przez wywołanie metody Mage::register($unikalnyKlucz, $wartość), natomiast odczytanie przez metodę Mage::registry($unikalnyKlucz). Aby usunąć wartość z rejestru możemy skorzystać z metody Mage::unregister($unikalnyKlucz).

3cod

Event/Observer

Polega to na zdefiniowaniu Obserwatorów reagujących na konkretne wydarzenia w kodzie.

Wykorzystanie wzorca przez Magento

To ze względu na ten wzorzec architekturę Magento określa się jako napędzaną eventami (eng. event-driven architecutre). Implementacja tego wzorca w Magento pozwala na zmianę logiki aplikacji bez konieczności modyfikowania jej kodu. Definicje Obserwatorów znajdziemy w plikach konfiguracyjnych modułów, natomiast sam Event wywołujemy przez metodę Mage::dispatchEvent($nazwaEventu, $danePrzekazywaneDoObserwatora).

4cod

5cod

6cod

Front Controller

Wzorzec ten definiuje istnienie tylko jednego punktu wejścia do aplikacji.

Wykorzystanie wzorca przez Magento

W Magento wszystkie żądania przechodzą przez index.php który odpowiada za inicjalizację całej aplikacji.

7cod Prototyp

Zezwala obiektom na tworzenie innych instancji klas specyficznych dla siebie.

Wykorzystanie wzorca przez Magento

Przykładem jest klasa Mage_Catalog_Model_Product posiadająca metodę getTypeInstance() zwracającą instancję klasy specyficznej dla danego typu produktu.

8cod
Leniwe inicjowanie

Wzorzec ten mówi nam, że przeprowadzanie kosztownych operacji jest opóźniane aż do momentu w którym nie są one potrzebne.

Wykorzystanie wzorca przez Magento

Magento wykorzystuje ten wzorzec przy kolekcjach, które pobierają informacje z bazy danych dopiero wtedy, kiedy spróbujemy się do nich odwołać.

9cod
Iterator

Zapewnia sekwencyjny dostęp do obiektów zgrupowanych w ramach innego większego obiektu.

Wykorzystanie wzorca przez Magento

Jest to kolejny wzorzec stosowany przez kolekcje w Magento. Dzięki temu możemy z nich korzystać jak ze zwykłych tablic.

10cod
Service locator

Hermetyzacja usługi wewnątrz rozbudowanej warstwy abstrakcyjnej. Dzięki temu mamy możliwość zmiany usługi z której korzystamy bez wpływu na całą aplikację.

Wykorzystanie wzorca przez Magento

Przykładami zastosowania tego wzorca w Magento są metody: Mage::getCache() – odpowiedzialna za cache, oraz _getConnection() z klasy Mage_Core_Model_Resource_Db_Abstract zwracająca ORM bazy danych

Pula obiektów

System zamiast niszczyć obiekty odkłada je do puli z której mogą być pobrane i wykorzystane ponownie.

Wykorzystanie wzorca przez Magento

W Magento z tym wzorcem możemy się spotkać w klasie Varien_Object_Cache do której mamy dostęp przez metodę Mage::objects()

11cod Modularność

Zorganizowanie kodu w wyspecjalizowane i niezależne od siebie zbiory, grupujące pewne funkcjonalności. Dzięki takiemu podejściu jest możliwość usunięcia lub podmiany jakiejś funkcjonalności bez negatywnego wpływu na resztę systemu.

Wykorzystanie wzorca przez Magento

Zastosowanie tego wzorca w Magento i sposób w jaki to zrobiono jest niewątpliwie jedną z jego największych zalet. Magento w całości składa się z modułów. Wystarczy zajrzeć do folderu app/code/core/Mage. Każdy z folderów który tam znajdziemy stanowi osobny moduł. Nie są może one od siebie tak niezależne jak wymagałaby definicja wzorca ale i tak cała architektura pozwala na w miarę swobodną rozbudowę  i modyfikację całego systemu poprzez własne moduły.

core

Pusty Obiekt

Wykorzystanie obiektów które są neutralne w zachowaniu. Obiekty takie mają za zadanie zastąpić inne które nie zostały odnalezione. Powinny one oferować taki sam zestaw metod jak obiekt który był szukany ale metody te nie powinny wykonywać żadnych operacji.

Wykorzystanie wzorca przez Magento

Przykładem z Magento są metody getFirstItem() i getLastItem() z klasy Varien_Data_Collection które w momencie gdy kolekcja jest pusta zwracają instancję klasy bazowej do której dana kolekcja się odwołuje.

12cod
Active record

Obiekty stanowią odwzorowanie wiersza tabeli w bazie danych. Obiekty te powinny posiadać właściwości które odzwierciedlają kolumny stanowiące strukturę danej tabeli oraz metody umożliwiające modyfikacje tych właściwości w bazie.

Wykorzystanie wzorca przez Magento

Klasy dziedziczące po klasie Mage_Core_Model_Abstract mają dostęp do metod load(), save() i delete() które umożliwiają wczytywanie, modyfikacje, tworzenie lub usuwanie rekordów z tabeli z którą klasa jest połączona. Dodatkowo klasa Mage_Core_Model_Abstract dziedzicząc po Varien_Object daje nam dostęp do magicznych metod __set() i __get() które odpowiadają za automatyczne zmapowanie kolumn tabeli w bazie danych z właściwościami danego obiektu.

13cod

 

Prezentacja

Chcesz rozwijać swój ebiznes z Divante? Skontaktuj się z nami.