Mi a véleményetek a getter-setterekről?
Inkább írsz egy GetX() meg egy SetX() metódust az adott X adattaghoz?
Szerintem jobban használható, ha ugyanazt a nevet (X) tudod használni az adattag értékének lekérdezésekor, mint a beállításakor...
C++ nyelven elég elterjedted a konténer/leíró osztályok, tipikusan sruct-ként vannak definiálva és minden adattagja publikus. Általában csak a változók vannak felsorolva benne, de simán belefér egy konstruktor, manipuláló metódus, vagy valamilyen statikus kreátor.
Tipikusan abban az esetben használják, ha minden getter setter egyébként is triviális lenne. És az osztálynak nincs magasabb absztrakciós szinten művelete.
Előfordulhat meg egy félig getter setter megoldás, ebben az esetben a get-et elhagyjuk, de jelen van a hozzá tartozó setter. pl.: color() setColor(). Nem ritka megoldás, ilyen konvenció alapján íródott például a Qt keretrendszer is.
Minden összevetve a getter setter egy jó dolog, érdemes használni, a dokumentációt csak könnyíti, illetve kódkiegészítés használata során is jól jön.
Nem csak a validálás lehet ok. Pl. ha számítasz arra, hogy egy property változásánál esetleg más kódot is le kell esetleg futtatni, akkor nem baj, ha eleve így írod meg az egész programot. Pl. lehet, hogy naplózni kell, hogy egy objektum egy adott tulajdonsága megváltozott. Ha publikus a tulajdonságod utólag elég agyrém lehet megoldani a naplózást, mert lehet, hogy két tucat helyen változtat a programod az adott objektum adott tulajdonságán.
Vagy pl. lehet szerepe optimalizálásnál is. Mondjuk van egy objektumod, aminek vannak különböző paraméterei. Mondjuk legyen ez egy Mandelbrot halmaz. Ha van egy kirajzol metódus, akkor megtehetd, hogy minden esetben újragenerálod az egészet. De megteheted azt is, hogy cache-eled az eredményt. Ha megváltozott valamelyik paraméter, akkor újragenerálod és elmented a cache-ben. Ha viszont nem változtak a paraméterek, akkor egyszerűen visszaadod a cache tartalmát, megspórolva az újragenerálás hosszú folyamatát. De honnan tudod, hogy egy paraméter megváltozott? Hát ha van setter, akkor abban be tudsz billenteni egy belső változót, hogy „this.changed=true”.
#3 szerintem te valamit félreértettél... Itt pont a getX(), setX() metódusokról van szó.
"Ha publikus a tulajdonságod utólag elég agyrém lehet megoldani a naplózást, mert lehet, hogy két tucat helyen változtat a programod az adott objektum adott tulajdonságán. "
Ez igaz, de csak akkor, ha rossz programozási nyelvet használsz. Egy jól megtervezett nyelvben át tudsz alakítani egy publikus adattagot property-vé anélkül, hogy a kódban bármi mást változtatnod kelljen.
"Minden összevetve a getter setter egy jó dolog, érdemes használni, a dokumentációt csak könnyíti, illetve kódkiegészítés használata során is jól jön."
Ez érdekesnek hangzik, vagy legalábbis úgy tűnik, hogy számomra új információ lehet benne. Viszont nem igazán tértél ki a lényegre. Kifejtenéd, hogy hogyan könnyíti a dokumentációt és a kódkiegészítést?
"Vagy pl. lehet szerepe optimalizálásnál is. Mondjuk van egy objektumod, aminek vannak különböző paraméterei. Mondjuk legyen ez egy Mandelbrot halmaz. Ha van egy kirajzol metódus, akkor megtehetd, hogy minden esetben újragenerálod az egészet. De megteheted azt is, hogy cache-eled az eredményt. Ha megváltozott valamelyik paraméter, akkor újragenerálod és elmented a cache-ben. Ha viszont nem változtak a paraméterek, akkor egyszerűen visszaadod a cache tartalmát, megspórolva az újragenerálás hosszú folyamatát. De honnan tudod, hogy egy paraméter megváltozott? Hát ha van setter, akkor abban be tudsz billenteni egy belső változót, hogy „this.changed=true”."
Ez persze igaz, ha ilyet akarnék csinálni, akkor nekem is ez lenne az első ötletem. (Bár ha egy mód van rá, akkor property syntax-ot támogató nyelvet választanék)
Viszont ez szerintem egy ritkább dolog. Pl. egy ORM esetén nyilván használ ilyet az ember, vagy pl. az általad említett példában. De azt is tegyük hozzá, hogy ha jó az ORM, akkor úgy van megírva, hogy neked nem kell getter-settereket írnod. (Nyilván ez nyelvfüggő is)
Viszont most a nem objektum-orientált elképzelések kerültek főként szóba. Ezek viszonylag triviális példák voltak, vagyis egyértelmű, hogy ilyen esetekben nem lehet mást használni.
De objektum-orientált elképzelésben pl. mi szükség lehet getter-setterekre? Hiszen ott elvileg nincsenek publikus adattagok.
#3-as vagyok
Csak annyiban, hogy én C#-os property-ben gondolkodtam, bocsi!
Inkább írsz egy GetX() meg egy SetX() metódust az adott X adattaghoz?
Az objektumorientáltsághoz hozzátartozik, hogy az objektumok nem hagyhatják, hogy kívülről csak úgy ellenőrizetlenül belepiszkáljanak a belső állapotukba. Az objektumorientáltság pedig hasznos.
"Az objektumorientáltsághoz hozzátartozik, hogy az objektumok nem hagyhatják, hogy kívülről csak úgy ellenőrizetlenül belepiszkáljanak a belső állapotukba. Az objektumorientáltság pedig hasznos."
Az objektumorientáltsághoz az is hozzá tartozik, hogy nincs publikus adattagod. Vagyis, nincs getter-settered.
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!