Podstawy popularnych języków programowania obiektowego

Akcesory i hermetyzacja

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.

C++

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);
};

Objective C

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.

Java

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;
    }
}

C#

class Instrument
{
    protected int identifier;
    protected int productionDate;

    public int IDENTIFIER { get; set; }
    public int PRUDUCTIONDATE { get; set; }
}

Ruby

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