Artykuł

sty 05 2009
0

Programowanie obiektowe - hermetyzacja

W poprzednim artykule, napisałem wprowadzenie do programowania obiektowego. Dowiedzieliście się zatem czym jest klasa, obiekt i konstruktor. Pokazałem w jaki sposób tworzyć prosty kod obiektowy w Javie i w PHP. Dzisiejszy artykuł jest kontynuacją tamtego tekstu. Przyjrzymy się bliżej jednej z trzech głównych zasad programowania obiektowego czyli hermetyzacji. Opowiem wam dlaczego jest ona taka ważna i w jaki sposób jest realizowana w kodzie źródłowym.

Hermetyzacja - wprowadzenie

Hermetyzacja jest jednym z ważniejszych mechanizmów programowania obiektowego, a jej głównym założeniem jest dbanie o bezpieczeństwo naszego kodu. Bez hermetyzacji, każdy element naszego kodu mógłby być wykonywany zawsze, bez żadnych ograniczeń. Inni użytkownicy mogliby tworzyć swój kod źródłowy na podstawie naszego, bez żadnych restrykcji. Dlatego osoby odpowiedzialne za programowanie obiektowe, wymyśliły mechanizm zwany hermetyzacją. Ideą nowoczesnego programowania obiektowego jest pisanie kodu, jak najbardziej zamkniętego. Dlatego ograniczamy dostęp do części zmiennych, metod, które wykonywane są wewnątrz określonej klasy. Dostęp do tych elementów jest tym samym ograniczony na zewnątrz. Jeśli utworzymy obiekt klasy, w której zastosowano hermetyzację, będziemy mieli ograniczony dostęp do części zasobów tej klasy.

Nie jest jednak powiedziane, że dostęp do części zasobów tracimy bezpowrotnie. Najczęściej jest on realizowany za pomocą specjalnie przygotowanych do tego celu metod. Więcej o dwóch najpopularniejszych takich metodach dowiecie się w dalszej części artykułu.

Modyfikatory dostępu

Wspomniałem już jak ważne znaczenie ma hermetyzacja dla bezpieczeństwa naszego kodu, nie wspomniałem jednak w jaki sposób jest ona realizowana w naszych aplikacjach. Aby skorzystać z hermetyzacji musimy wprowadzić termin modyfikatora dostępu. Modyfikatorami dostępu nazywamy specjalne słowa kluczowe, które określają dostępność wskazanego elementu w naszym kodzie źródłowym. Ze względu na specyfikę Javy (wykorzystanie pakietów do grupowania klasa), modyfikatory mają tutaj trochę inne znaczenie niż w PHP.

Modyfikatory dostępu w Javie

W Javie mamy cztery modyfikatory dostępu:

  • domyślny - występuje wtedy kiedy nie został nadany żaden modyfikator. Pozwala na dostęp do elementów w obrębie danego pakietu.
  • public - dostęp jest zawsze możliwy. Zarówno w obecnym pakiecie jak i wszystkich innych.
  • private - dostęp możliwy tylko w obrębie danej klasy. Elementów prywatnych nie można dziedziczyć.
  • protected - modyfikator bardzo podobny do modyfikatora private. Jedyna ale bardzo kluczowa różnica jest taka, że elementy oznaczone tym modyfikatorem mogą być dziedziczone.

Modyfikatory dostępu w PHP

W PHP mamy również cztery modyfikatory dostępu z tym, że modyfikator public i domyślny realizują takie same zadania.

  • domyślny, public - modyfikator domyślny i public stosowane są zamiennie. Oznaczają one pełny dostęp do określonego elementu.
  • private - dostęp możliwy tylko w obrębie danej klasy. Elementów prywatnych nie można dziedziczyć.
  • protected - modyfikator bardzo podobny do modyfikatora private. Jedyna ale bardzo kluczowa różnica jest taka, że elementy oznaczone tym modyfikatorem mogą być dziedziczone.

Metody get i set

Możemy już ograniczyć dostęp do części składowych naszej klasy i zwiększyć bezpieczeństwo, ale teraz pojawia się pytanie w jaki sposób uzyskać dostęp do prywatnych zmiennych, kiedy naprawdę mogą być one potrzebne? Np. jeśli w naszej klasie Human, (opis w artykule: Programowanie obiektowe - wprowadzenie), chcielibyśmy zmodyfikować imię określonego osobnika, lub po prostu je odczytać? Już spieszę z odpowiedzią. W programowaniu obiektowym służą do tego specjalne metody get (pobieranie danych) i set (modyfikowanie danych). Ponieważ konstrukcja tych metod różni się w obu opisywanych językach, przedstawię je osobno dla każdego z nich.

get i set w PHP

W PHP5, metody get i set mają specjalną konstrukcję. Implementując je w naszej klasie przeciążamy domyślną wersję tych metod. Obie metody poprzedzone są znakiem podwójnego podkreślenia (__). Przykładowy kod:

public function __set($sVariableName, $mValue) 
{
	$this->$sVariableName = $mValue;
}

public function __get($sVariableName) 
{
	return($this->$sVariableName);
}

W metodzie __set przekazujemy nazwę zmiennej którą chcemy zmodyfikować oraz nową wartość tej zmiennej (przedrostek m oznacza mixed). W metodzie __get zwracamy zmienną. Być może część z was, zwróciła uwagę na dziwne konstrukcje użyte w tych metodach, polegające na zastosowaniu podwójnego znaku dolara. Dzięki takiemu zabiegowi możemy w sposób dynamiczny modyfikować/odczytywać określone zmienne. Prześledźmy teraz przykład wykorzystania tych metod:

$oAnn = new Human('Ania', 'Blond', 20, 175);
$oAnn->sName = 'Basia';
echo $oAnn->sName;

Efektem powyższego kodu jest zmiana wartości zmiennej sName w obiekcie oAnn. Kod napisany w takiej postaci wygląda jakbyśmy dokonywali edycji zmiennej bezpośrednio, jednak jest to niejawne wykorzystanie metod __get i __set. Gdybyśmy wyrzucili te funkcje, powyższy kod nie zadziałał by ze względu na prywatny charakter zmiennych.

get i set w Javie

W Javie nie mamy określonych specjalnych konstrukcji dla tego typu metod ale przyjeło się, że takie metody nazywają się get/setNazwaZmiennej. W przypadku metody get, która zwraca dane, musimy jeszcze określić typ zwracanych danych. W naszym przykładzie jest to String ponieważ zmienna sName jest właśnie Stringiem. W metodzie set wykorzystujemy słowo kluczowe this do zaznaczenia naszej zmiennej składowej klasy. Kod obu metod został przedstawiony poniżej:

public String getName()
{
	return(sName);
}

public void setName(String sName)
{
	this.sName = sName;
}

W tej chwili aby zmienić imię, a następnie je odczytać musimy wykonać następujący kod:

Human oAnn = new Human("Ania","Blond",20,175);
oAnn.setName("Basia");
oAnn.getName();

Wykonanie powyższego kodu spowoduje wyświetlenie imienia Basia.

Podsumowanie

Dzisiejszy artykuł miał na celu opisanie hermetyzacji, jednej z głównych zasad programowania obiektowego. Jak widzieliśmy jest to bardzo ważny aspekt wpływający w znaczący sposób na bezpieczeństwo naszej aplikacji. Zawsze należy pamiętać o tym by pisać jak najbardziej hermetyczny kod, a dostęp do zmiennych prywatnych realizować za pomocą specjalnie napisanych do tego metod.

Data ostatniej modyfikacji: 05.06.2011, 17:18.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus