Wpis z mikrobloga

Może mi ktoś wytłumaczyć jak pięciolatkowi, dlaczego lepsze jest zmienianie prywatnych zmiennych za pomocą publicznych funkcji, zamiast robienie ich od razu publicznymi zmiennymi? Przecież to wychodzi dokładnie na to samo, tylko dłużej i więcej kodu. Przeczytałem wyjaśnienia z pierwszych 10 wyników google i wszystkie sprowadzają się do "kiedyś zrozumiesz jak cośtam". No właśnie chciałbym wiedzieć jakie "cośtam".
#programowanie #cpp

  • 28
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Goryptic: żeby nie wkładać do zmiennej bezsensownych danych, np do zmiennej trzymającej temperaturę wody nie podać wartości ujemnej ani powyżej 100, bo wtedy to już nie woda, tylko lód lub para wodna
  • Odpowiedz
@Goryptic: łatwiej to zrozumieć na przykładzie javy, tzw. gettery i settery. tak się po prostu przyjęło i nie potrafię tego wytłumaczyć xD za to ja osobiście robienie tych całych getterów i setterów mam z głowy dzięki adnotacji z lomboka co je generuje
  • Odpowiedz
@Goryptic: robisz to w funkcji, która ma ustawiać wartość zmiennej. W podanym przeze mnie przypadku będzie.
Void setTemp(float val){
If (val >= 0 && val < 100) temp =val;
}
  • Odpowiedz
ale jakim cudem ten sposób z funkcją ma przed tym chronić?

@Goryptic: W tej funkcji dajesz walidację poprawności przypisywanych do tej zmiennej wartości (np wiek - sprawdzasz czy jest intem i czy jest większy od 0 i mniejszy niż 130 na przykład) i tak dalej.
  • Odpowiedz
@Goryptic: bo jak masz czerwone auto i chcesz zmienić jego kolor bez zmiany całej obudowy to zmieniasz farbę na obudowie a nie całą obudowę albo lakier. Metody publiczne używane są przez zewnętrzne klasy i API, wiec musisz pilnować INNYCH żeby zmieniając kolor auta nie podpieprzyli zderzaków na null.
  • Odpowiedz
@Goryptic: Po pierwsze tak jak napisane wyżej, można obsłużyć ustawienie nie poprawnych wartości.

Wg mnie generalnie chodzi o separację tego co dana klasa udostępnia publicznie, a tego co dzieje się w środku. Dzięki temu możesz zmienić wewnętrzną implementację, nie zmieniając nic na zewnątrz, dzięki czemu wszystko jest nadal kompatybilne. Np. zmieniasz typ danych, albo pakujesz coś w ogóle do jakiejś innej struktury, a na zewnątrz nadal są widziane te same
  • Odpowiedz
@Goryptic: w funkcjach przypisujących wartości dla zmiennych nie koniecznie jest tylko validacja wartości, bo może być także przeliczanie jakiś innych zmiennych, które są zależne od tej zmiennej.
  • Odpowiedz
@Goryptic: Przede wszystkim fieldy posiadające gettery i settery pozwalają na weryfikację przypisywanych danych. Tak jak napisał @Asparte, możesz przypilnować w ten sposób czy dane są poprawne. Albo na przykładzie samochodu - chcesz ograniczyć jego prędkość do 100km/h, wtedy w set'cie dla tego pola dajesz warunek, że jeżeli mniej niż 100 to ustaw na podaną wartość, jeżeli więcej to ustaw na równo 100.

Nie wiem jak to działa w
  • Odpowiedz
@Goryptic: W przypadku typów prostych w sumie ma to małe znaczenie - przydaje się tylko przy walidacji. Jeśli w jakiejś klasie masz pole, np:

public ArrayList lista;
to warto porobić metody dostępowe, aby uchronić przed zrobieniem czegoś takiego z innej klasy:

lista = null;
co byłoby poprawną operacją, a na 90% popsułoby działanie całego obiektu. A to tylko jeden z przykładów, gdzie udzielenie publicznego dostępu do jakiegoś obiektu może być
  • Odpowiedz
@Goryptic: Jak inni napisali, chodzi głównie o walidację.

Inna sprawa, że to jest gównoargument i świadczy o błędnym zaprojektowaniu klas, gdyż zamiast getterów i setterów powinny być pola publiczne. Nie po to są metody w oop.
No, ale takie to wygodne...
  • Odpowiedz
@Goryptic: o, to co wyżej kolega napisał też jest ważne. Możesz stwierdzić że przy ustawianiu jakieś zmiennej chcesz wykonać też jakieś dodatkowe działania, np. zapisać gdzieś ten fakt, uruchomić listener itd. Gdybyś dopiero wtedy chciał dodać setter, to byłaby kupa dodatkowej roboty, a gdyby inni korzystali z takiej klasy to już w ogóle.
  • Odpowiedz
@Szab: @Goryptic: Teraz doczytałem, że chodzi o C++. W przypadku Cpp powyższe dalej ma zastosowanie - choć do zmiennej obiektowej nie można przypisać nulla, to można go przypisać do wskaźnika. Ew. można przypisać do zmiennej obiektowej jakiś bezsensowny obiekt, który także popsuje nam działanie klasy.
  • Odpowiedz