Hermetyzacja kodu - kilka pytań

0

Cześć przykładowo mam taki kod:

class foo
{
	private:
	int a;
	
	public:
	void setValue(int v) { a = v;}
	int getValue() {return a;}
};
 

Zastosowanie tutaj zmiennej jako prywatnej i funkcji operującej na niej jako publicznej to hermetyzacja ?
Ponadto co mi da zrobienie zmiennej "a" jako prywatnej, skoro w każdej chwili mogę ją zmienić poprzez publiczną metodę setValue.
Przykładowo:

// tutaj nie mam dostępu do zmiennej a:
foo obiekt;
obiekt.a = 2; // blad;
obiekt.setValue(2); // teraz a = 2; 

Jaki jest sens stosowanie setValue skoro ta zmienna "a" i tak została zmieniona na 2 tak jak chciałem mimo braku dostępu do niej. W zasadzie używając funkcji setValue nie ma różnicy wtedy czy "a" jest prywatne czy publiczne. Jeśli chciałbym użyć "a" w wyrażeniu to:

int wynik = obiekt.a * 2 + obiekt.a / 3; // błąd
int wynik = obiekt.getValue() * 2 + obiekt.getValue() / 3; // dobrze 

Tylko więcej pisania :P

0

Najprawdopodobniej nie powinieneś udostępniać takiej zmiennej w żaden sposób.
Być może interesuje Cię POD type.
Twój kod według twoich założeń ale po ulepszeniu:

class Foo{
private:
	using bar_type = int;
	bar_type a;
public:
	inline bar_type a() const
	{ return a; }

	inline void setA(bar_type value)
	{ a = value; }
	//lub
	inline void a(bar_type value)
	{ a = value; }
};
1

Korzystając z funkcji zamiast bezpośrednio ze zmiennej publicznej możesz mieć kontrolę nad przypisywanymi do zmiennej wartościami. Przykładowo jeśli chcesz żeby zmienna miała wartości w przedziale <0;100> to możesz w funkcji setValue to kontrolować i odpowiednio reagować albo przypisując wartości skrajne przy przekroczeniu ich przez wartość albo rzucać wyjątek lub zwracać w jakiś inny sposób błąd, a nawet jak teraz nie masz takiego wymogu to być może w przyszłości może się pojawić, a wtedy dodanie jakiejś logiki z tym związanej będzie dużo mniej kosztowne.

0

Nie popadajmy w paranoję, getAaa, setAaa to nie jest to samo co czytanie bezpośrednio.

Założenie że "gettter łamie hermetyzację" jest myśleniem wywrotowym, ponieważ:

class Kolo
{
    private:
    double promien;
 
    public:
    double getPowierzchnia() {return M_PI*promien*promien;}
    void setPowierzchnia(double a) { ... ustaw promien; }
};

Przy takiej konstrukcji nie mamy gettera/settera wybranego atrybutu ale i tak go możemy w sposób zdefiniowany zmienić.
W związku z tym nie powinniśmy w ogóle robić funkcji/metod gdybyśmy chcieli tak myśleć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1