Dwa podejścia do pisania programu wykorzystującego obiekt. Poniżej przykład w Javie, w C# jest podobnie.
Podejście 1:
public class XYZ
{
private int a;
private int b;
public XYZ()
{
this.a = 0;
this.b = 0;
}
public void SetA(int v)
{
this.a = v;
}
public void SetB(int v)
{
this.b = v;
}
public int GetA()
{
return a;
}
public int GetB()
{
return b;
}
}
XYZ Test = new XYZ
int A = Test.GetA();
int B = Test.GetB();
int C = 1;
int D = 2;
Test.SetA(C);
Test.SetB(D);
Podejście 2:
public class XYZ
{
public int a = 0;
public int b = 0;
}
XYZ Test = new XYZ
int A = Test.a;
int B = Test.b;
int C = 1;
int D = 2;
Test.a = C;
Test.b = D;
Wiem, że jest coś takiego, jak hermetyzacja (uniemożliwienie niekontrolowanej zmiany wartości zmiennych private poza klasą), ale zauważyłem, że to dotyczy pisania kodu, a nie działania programu. Innymi słowy, jeżeli spróbuje się przypisać lub odczytać coś ze zmiennej prywatnej, to program nie skompiluje się, więc nie ma możliwości, żeby istniał działający program, w którym następuje próba dostępu do zmiennej prywatnej i jest jakiś błąd lub wyjątek, bądź cały program sie zamyka.
Rozumiem, że jeżeli chodzi o wielokrotne odczytywanie wartości, która nie jest pamiętana w zmiennej, tylko musi być liczona na podstawie zmiennych za każdym razem, to wtedy stosuje się odpowiednią funkcję wewnątrz klasy.
Natomiast, jak chodzi o operację na jednej zmiennej w klasie, to które podejście jest lepsze?
Cechy obu podejść:
- Podejście 1 polega na nieco "okrężnym" dostępie do danych, a podejście 2 polega na bezpośrednim dostępie do danych, co może mieć znaczenie przy przetwarzaniu dużej ilości danych.
- Podejście 2 to brak pomocniczych metod, bez których program może działać, a więc mniej linii kodu w definicji klasy.
Słyszałem, że powinno się stosować podejście 1, ale nie mam logicznego wytłumaczenia, dlaczego. Jednemu koledze napisałem program, w którym stosowałem podejście 2, program działał bezbłędnie, był dokładnie sprawdzony, ale ten kolega, jak zobaczył kod, to zrozumiał go, ale powiedział, że tak nie powinno się programować.
Jakie jest uzasadnienie stosowania podejścia 1 przy pisaniu programów?