Jednym z podstawowych założeń programowania obiektowego jest hermetyzacja (nazywana też enkapsulacją).
Polega na ukrywaniu danych i części metod tak, aby były one dostępne tylko wewnątrz danej klasy lub funkcjom zaprzyjaźnionym.
Gdy wszystkie pola w klasie znajdują się w sekcji prywatnej lub chronionej, to taką hermetyzację nazywa się hermetyzacją pełną.
W takim przypadku musimy zdefiniować specjalne metody pozwalające na odczytywanie lub ustawianie wartości pól klasy. Nazywamy je setterami i getterami lub trochę bardziej ogólnie—akcesorami.
W hermetyzacji pełnej wszystkie dane są prywatne i możemy uzyskiwać dostęp do nich jedynie używając akcesorów.
W języku C++ wszystkie zmienne znajdują się w sekcji private
. W sekcji public
deklarujemy odpowiednie metody do ustawiania i pobierania danych.
class Instrument
{
private:
int identifier;
int productionDate;
public:
int getIdentifier();
int getProductionDate();
void setIdentifier(int);
void setProductionDate(int);
};
Język Objective-C odrobinę ułatwił sprawę. Trzy linie kodu (zmienna prywatna, getter i setter) możemy zastąpić deklaracją właściwości—@property
.
Właściwość nie jest niczym innym jak właśnie zmienną prywatną uzupełnioną o akcesory.
@interface Instrument : NSObject
@property (nonatomic) int identifier;
@property (nonatomic) int productionDate;
@end
Co ciekawe, składnia uniemożliwia tu stworzenie zmiennej publicznej, więc hermetyzacja pełna jest tu wymuszona.
public class Instrument
{
private int identifier;
private int productionDate;
public int getIdentifier()
{
return identifier;
}
public int getProductionDate()
{
return productionDate;
}
public void setIdentifier(int identifier)
{
this.identifier = identifier;
}
public void setProductionDate(int date)
{
this.productionDate = date;
}
}
class Instrument
{
protected int identifier;
protected int productionDate;
public int IDENTIFIER { get; set; }
public int PRUDUCTIONDATE { get; set; }
}
Język Ruby przyjmuje wspólną konwencję z Objective-C, w miejsce właściwości tworząc jednak atrybut. Różnica pomiędzy nimi jest czysto językowa.
class Instrument
attr_accessor :identifier, :production_date
end