Enkapsulacja
Z Wikipedii
Enkapsulacja (z ang. encapsulation, kapsułkowanie, hermetyzacja lub inaczej ukrywanie informacji) to jedno z założeń paradygmatu programowania obiektowego. Polega ono na ukrywaniu pewnych danych składowych lub metod obiektów danej klasy tak, aby były one (i ich modyfikacja) dostępne tylko metodom wewnętrznym danej klasy lub funkcjom z nią zaprzyjaźnionym. Z pełną enkapsulacją mamy do czynienia wtedy gdy dostęp do wszystkich pól w klasie jest możliwy tylko i wyłącznie poprzez metody, lub inaczej: gdy wszystkie pola w klasie znajdują się w sekcji prywatnej (lub chronionej).
[edytuj] Przyczyny stosowania enkapsulacji:
- Uodparnia tworzony model na błędy polegające np. na błędnym przypisywaniu wartości oraz umożliwia wykonanie czynności pomocniczych jak np. pobranie z konta 10% wypłacanej kwoty jako prowizja (nie uwidocznione w przykładzie).
Przykład:
typedef double TypPieniedzy; class KontoBankowe { public: KontoBankowe( const TypPieniedzy saldoPoczatkowe = 0 ) throw(); bool wplac( const TypPieniedzy kwota ) throw(); bool wyplac( const TypPieniedzy kwota ) throw(); TypPieniedzy podajStanKonta() const throw(); private: TypPieniedzy saldo; }; KontoBankowe::KontoBankowe( const TypPieniedzy saldoPoczatkowe = 0 ) throw() : saldo( saldoPoczatkowe ) { } bool KontoBankowe::wplac( const TypPieniedzy kwota ) throw() { if ( kwota > 0 ) { saldo += kwota; return true; } return false; } bool KontoBankowe::wyplac( const TypPieniedzy kwota ) throw() { if ( ( kwota > 0 ) && ( kwota <= saldo ) ) { saldo -= kwota; return true; } return false; } TypPieniedzy KontoBankowe::podajStanKonta() const throw() { return saldo; }
- Mamy klasę
KontoBankowe
. Nie powinno się tak zdarzyć, że stan konta mógłby być modyfikowany przez zwykłe odwołanie się do danejsaldo
(np.:mojeKonto.saldo = 123;
). Tusaldo
konta bankowego jest daną chronioną (dostęp jest private), do której dostęp mają tylko funkcje zaprzyjaźnione lub funkcje składowe (wewnętrzne) (tu:podajStanKonta
,wplac
iwyplac
). Powinno się zapewnić maksymalne bezpieczeństwo w odniesieniu do danejsaldo
. Stąd też metodaTypPieniedzy podajStanKonta()
jest oznaczona jakoconst
, wartość kwoty w metodachvoid wplac( const TypPieniedzy kwota )
ivoid wyplac( const TypPieniedzy kwota )
jest określona również jakoconst
aby jej wartość nie została "przypadkiem" zmieniona w trakcie działania tych metod. Enkapsulacja ma też na celu sprawdzanie poprawności wpisywanych danych (czy powinno się dać wpłacić na konto kwoty będącej wartością ujemną?).
- Lepiej oddaje rzeczywistość. W powyższym przykładzie obrazuje atomowe operacje na koncie bankowym, podczas gdy odwołanie się bezpośrednie do salda nie oznaczałoby nic szczególnego.
- Umożliwia rozbicie modelu na mniejsze elementy. Dzięki stosowaniu enkapsulacji można budować modele rzeczywistości jako struktury składające z mniejszych modułów, z których każdy ma pewne określone dane i określone metody wpływania na ich stan i sprawdzania go. Na przykład w tworzeniu modelu samochodu można użyć modułu silnika, który ma określony szereg danych wewnętrznych (np. opisujących jego stan w trakcie pracy) i metod wewnętrznych (np. pobranie paliwa, wywołanie reakcji, ruch wirnika). Wszystko to jednak jest nieistotne dla użytkownika (a nawet nie powinno być dostępne), który ma możliwość użycia tylko zapłonu i wyłączenia silnika.