Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

arkadiusz.wasniewski

Tworzenie obiektów

W powyższej kwestii pojawiło się od czasu słowa kluczowego new trochę nowych metod i związanych z tym pojęć. W poszukiwaniu optymalnego kodu warto zwrócić uwagę na następujące pojęcia:

  • Inversion of Control - obiekt nie tworzy samodzielnie żadnych wymaganych przez siebie instancji klas. Zamiast tego pobiera je z zewnętrznych zasobów;
  • Push. Don't Pull - obiekt nie tworzy samodzielnie żadnych wymaganych przez siebie instancji klas. Zamiast tego są mu one przekazywane jako parametry konstruktora lub właściwości;
  • Dependency Injection - tworzenie instancji wymaganych klas zleca się obiektowi (kontenerowi) zewnętrznemu, który zna zależności pomiędzy klasami.

Zastosowanie Inversion of Control powoduje, iż możemy całą logikę tworzenia klas skupić w jednym lub kilku miejscach w programie, korzystając przy tym z metod fabryki, fabryk abstrakcyjnych czy też z wzorca lokalizacji usług (Service Locator), który może być, w zależności od sposobu implementacji, niejako fabryką fabryk abstrakcyjnych. Dzięki takiemu podejściu łatwiejsze jest zarządzanie tworzeniem instancji klas, ich powtórnym wykorzystaniem czy też podmianą implementacji w zależności od potrzeb.

Gdzie tylko jest to możliwe należy zaś korzystać z Push. Don't Pull. Obiekt nie powinien wiedzieć za dużo o swoim otoczeniu. To po pierwsze. A po drugie taki sposób postępowania ułatwia testowanie klas. Z doświadczenia mogę powiedzieć, iż to podejście staje naturalne i oczywiste jeśli korzysta się z klas testujących. Częstą praktyką jest również łączenie w ramach klasy Inversion of Control z Push. Don't Pull poprzez deklarację dwóch konstruktorów. Pierwszy umożliwia przekazanie jako parametrów wszystkich wymaganych obiektów i ten konstruktor może być wykorzystywany do testów. Drugi konstruktor ustawia te samo zmienne klasy co pierwszy, ale pobiera instancje wymaganych klas z zasobów zewnętrznych.

Korzystanie z Dependency Injection wymaga zaś od nas wsparcia się zewnętrznymi narzędziami. Wśród nich wymienić można StructureMap, Spring.NET, czy też Windsor Container. Programiści urządzeń mobilnych (platforma .NET CF) mogą skorzystać z możliwości Mobile ObjectBuilder z Mobile Client Software Factory. Zależności pomiędzy klasami definiuje się zazwyczaj w postaci konfiguracji w plikach w formacie XML lub korzystając z atrybutów. Oczywiście taki sposób działania wymaga pewnych zasobów komputera co może mieć krytyczne znaczenie zwłaszcza dla aplikacji mobilnych.

Opublikowane 4 lipca 2007 13:55 przez arkadiusz.wasniewski

Komentarze:

 

arkadiusz.wasniewski said:

Jedną z cech dobrego oprogramowania są luźne powiązania pomiędzy klasami. Droga do tego celu ciężka i

sierpnia 24, 2008 11:49
Komentarze anonimowe wyłączone
W oparciu o Community Server (Personal Edition), Telligent Systems