Hermetyzacja (informatyka): Różnice pomiędzy wersjami
[wersja przejrzana] | [wersja przejrzana] |
→Lepiej oddaje rzeczywistość: poprawa błędu (zamiana "tą" na "tę") |
to jest zmienna prywatna. Słowo "chroniona" jest powiązane w języku polskim z dostępem protected, a nie private. |
||
Linia 55: | Linia 55: | ||
</source> |
</source> |
||
Mamy klasę <code>KontoBankowe</code>. Nie powinno się tak zdarzyć, że stan konta mógłby być modyfikowany przez zwykłe odwołanie się do danej <code>saldo</code> (np.: <code>mojeKonto.saldo = 123;</code>). Tu <code>saldo</code> konta bankowego jest daną |
Mamy klasę <code>KontoBankowe</code>. Nie powinno się tak zdarzyć, że stan konta mógłby być modyfikowany przez zwykłe odwołanie się do danej <code>saldo</code> (np.: <code>mojeKonto.saldo = 123;</code>). Tu <code>saldo</code> konta bankowego jest daną prywatną (dostęp jest ''private''), do której dostęp mają tylko funkcje zaprzyjaźnione lub funkcje składowe (wewnętrzne) (tu: <code>podajStanKonta</code>, <code>wplac</code> i <code>wyplac</code>). Powinno się zapewnić maksymalne bezpieczeństwo w odniesieniu do danej <code>saldo</code>. Stąd też metoda <code>TypPieniedzy podajStanKonta()</code> jest oznaczona jako <code>const</code>, wartość kwoty w metodach <code>bool wplac( const TypPieniedzy kwota )</code> i <code>bool wyplac( const TypPieniedzy kwota )</code> jest określona również jako <code>const</code> aby jej wartość nie została „przypadkiem” zmieniona w trakcie działania tych metod. |
||
Hermetyzacja ma też na celu sprawdzanie poprawności wpisywanych danych, np. czy pozwolić użytkownikowi wpłacić na konto kwotę mającą wartość ujemną? |
Hermetyzacja ma też na celu sprawdzanie poprawności wpisywanych danych, np. czy pozwolić użytkownikowi wpłacić na konto kwotę mającą wartość ujemną? |
Wersja z 14:38, 12 lut 2012
Hermetyzacja (inna używana nazwa to enkapsulacja[1], (ang.) encapsulation) – w informatyce, jedno z założeń paradygmatu programowania obiektowego. Hermetyzacja polega na ukrywaniu pewnych danych składowych lub metod obiektów danej klasy tak, aby były one dostępne tylko metodom wewnętrznym danej klasy lub funkcjom zaprzyjaźnionym.
Gdy dostęp do wszystkich pól danej klasy jest możliwy wyłącznie poprzez metody, lub inaczej mówiąc: gdy wszystkie pola w klasie znajdują się w sekcji prywatnej, lub chronionej, to taką hermetyzację nazywa się hermetyzacją pełną.
Przyczyny stosowania hermetyzacji
Można wyróżnić trzy, główne powody wprowadzenia hermetyzacji do programowania obiektowego:
- uodparnia tworzony model na błędy,
- lepiej oddaje rzeczywistość,
- umożliwia rozbicie modelu na mniejsze elementy.
Uodparnia tworzony model na błędy
Hermetyzacja 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 prowizji) lub obsługę sytuacji wyjątkowej (np. brak wymaganych środków).
Przykład w C++:
typedef double TypPieniedzy;
class KontoBankowe {
public:
KontoBankowe( const TypPieniedzy saldoPoczatkowe = 0 );
bool wplac( const TypPieniedzy kwota );
bool wyplac( const TypPieniedzy kwota );
TypPieniedzy podajStanKonta() const;
private:
TypPieniedzy saldo;
};
KontoBankowe::KontoBankowe( const TypPieniedzy saldoPoczatkowe)
:
saldo( saldoPoczatkowe )
{
}
bool KontoBankowe::wplac( const TypPieniedzy kwota ) {
if ( kwota > 0 ) {
saldo += kwota;
return true;
}
return false;
}
bool KontoBankowe::wyplac( const TypPieniedzy kwota ) {
// Powiększenie kwoty o 10% prowizji.
TypPieniedzy kwotaProw = kwota*1.1;
if ( ( kwotaProw > 0 ) && ( kwotaProw <= saldo ) ) {
saldo -= kwotaProw;
return true;
}
return false;
}
TypPieniedzy KontoBankowe::podajStanKonta() const {
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 danej saldo
(np.: mojeKonto.saldo = 123;
). Tu saldo
konta bankowego jest daną prywatną (dostęp jest private), do której dostęp mają tylko funkcje zaprzyjaźnione lub funkcje składowe (wewnętrzne) (tu: podajStanKonta
, wplac
i wyplac
). Powinno się zapewnić maksymalne bezpieczeństwo w odniesieniu do danej saldo
. Stąd też metoda TypPieniedzy podajStanKonta()
jest oznaczona jako const
, wartość kwoty w metodach bool wplac( const TypPieniedzy kwota )
i bool wyplac( const TypPieniedzy kwota )
jest określona również jako const
aby jej wartość nie została „przypadkiem” zmieniona w trakcie działania tych metod.
Hermetyzacja ma też na celu sprawdzanie poprawności wpisywanych danych, np. czy pozwolić użytkownikowi wpłacić na konto kwotę mającą wartość ujemną?
Lepiej oddaje rzeczywistość
Przykład powyższy obrazuje wykonywane na koncie bankowym operacje atomowe identyfikowane nazwami odpowiednimi do wykonywanej operacji – podczas gdy samo odwoływanie się, w sposób bezpośredni, do salda jako pewnej zmiennej, nie dawałoby odwzorowania rzeczywistości reprezentowanej przez tę zmienną.
Umożliwia rozbicie modelu na mniejsze elementy
Dzięki stosowaniu hermetyzacji 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.
- ↑ Jerzy Grębosz: Symfonia C++ Standard. Kraków: Edition 2000, 2005, s. 416. ISBN 83-7366-073-9.