Przyspieszanie działania złożonych fragmentów aplikacji
Czy zdarzyło Ci się pracować z rozbudowaną klasą o bardzo dużej liczbie funkcji ? Jaka część z nich była wykorzystywana regularnie, a co było wywoływane okazjonalnie ? Problem wielkich klas dotyczy każdego języka i różnych typów projektów o bardziej rozbudowanej funkcjonalności.
Wielkie klasy są szczególnym utrapieniem w językach interpretowanych np.: PHP. Ilość kodu w złożonych aplikacjach jest na tyle duża, że istotnie wpływa na opóźnienia w otrzymywaniu wyników działania skryptów. Są sytuacje, w których nie ma lub są bardzo ograniczone możliwości zastąpienia jednej takiej klasy kilkoma mniejszymi. Przykładem takim jest pisanie modułu do frameworka, CMS’a czy innego systemu do tworzenia aplikacji. To samo dotyczy także tworzenia modułów DLL czy SO w językach C i C++. Moduł wymaga określonego interfejsu za pomocą, którego funkcjonalność jest osadzana w jądrze aplikacji. Spróbujmy zastąpić główną klasę zbiorczą poprzez jej proxy. Nie będzie to jednak zwykłe proxy takie jak opisane chociażby tutaj. Nasze proxy będzie kontrolowało dostęp do funkcjonalności umieszczonych w kilku różnych mniejszych klasach. Ta konstrukcja przypomina wzorzec fasady udostępniając jeden wspólny interfejs zbiorczy i delegując wykonanie odpowiednich metod do właściwych metod w innych obiektach. Pamiętaj jednak, że cały czas wykazuje ona właściwości buforujące typowe dla proxy tzn. obiekt właściwy (z implementacją) nie zostanie utworzony tak długo aż nie dojdzie do próby uruchomienia jakiejś jego metod.
Zastanawiasz się pewnie co się stanie kiedy jedna klasa funkcjonalności np.: związana z produktami, będzie potrzebowała użyć funkcji należącej do innej klasy np.: firm produkujących jakieś produkty. Nie ma najmniejszych przeszkód, aby klasom implementującym przekazać nasz obiekt proxy w konstruktorze. Będzie wtedy dostępna pełna funkcjonalność modułu.
Jeśli posługujesz się językiem Java (JDK 1.3+) lub korzystasz z zaawansowanych własności PHP 5 to zapewne wiesz czym jest DynamicProxy. Dla przypomnienia, o ile zwykły proxy musi mieć zadeklarowane odpowiednie metody pośredniczące w odwoływaniu się do obiektów właściwych, o tyle dynamiczny proxy może realizować te przekierowania bez takich deklaracji. Nie wszystkie języki wspierają taki mechanizm. W języku Java posłuży nam do tego InvocationHandler z pakietu java.lang.reflect, natomiast w PHP są specjalne konstrukcje językowe tzw. “magic methods”. Więcej szczegółów na temat proxy w Javie znajdziesz tutaj, a na temat magicznych metod języka php tutaj. O dynamicznym proxy w Javie można też przeczytać na stronach javaworld.com.
Przedstawione własności naszej klasy moglibyśmy określić mianem SelectiveProxy, a przy użyciu dynamicznego proxy DynamicSelectiveProxy. A może masz inny pomysł na nazwę dla tej klasy ?
Tags: PHP, Programowanie w Java
Najświeższe komentarze