Ebben az esetben is kell/illik setter fügvényeket írni?
Ha egy objektum adattagjait nem billentyűzetről, hanem egy fájlból beolvasva adom meg akkor kell setter függvényt írnom az adattagokhoz?
A fájlból beolvasott adatok lesznek az alapértelmezett adatok tehát ezek nélkül nem jön létre egy objektum sem.
Ezt akár konstruktoron belül is beolvashatnám igaz? Vagy külön setter függvényekkel célszerű?
A getter/setter az OOP egyik alapeleme, semmi köze ahhoz, hogy az IO konzol vagy fájl vagy bármi más.
Ha az objektumnak csak úgy van "értelme" ha minden adattagja értéket kap, akkor nyilván ezeket a konstruktorban érdemes megadni, hogy ne lehessen "félkész" példányt létrehozni.
Alapesetben arról sem lenne szabad tudnia az objektumnak, hogy honnan van az adat. Csak annyi számítson, hogy van adat.
Szóval te csinálsz egy ilyet:
class SajatProgramkod {
.. public void csinaljValamit() {
.. .. String Adat = null;
.. .. try (Scanner sc = new Scanner(System.in)) {
.. .. __ Adat = sc.nextLine();
.. .. }
.. .. //Csinálunk valamit az adattal
.. }
}
Ezzel lesz egy olyan gond, hogy ez jelenleg szorosan függ a konzolról való beolvasástól. Szóval ha jön egy olyan igény, hogy ne konzolról, hanem fájlból, hálózatról vagy valahonnan máshonnan szedjünk adatot, a SajatProgramkod-ba bele kell nyúlnod. Hozzátéve, hogy ez a kód nagy valószínűséggel teszteletlen, elég könnyen el is fogod rontani.
Éppen ezért jó lenne, ha valahogy sikerülne olyan megoldást találni, amivel a SajatProgramkod-ba nem kell belenyúlni egy ilyen változtatás esetén. Lényegében azt fogjuk csinálni, hogy szoros kapcsolás helyett laza kapcsolatot építünk ki. Vagyis bevezetünk egy új interfészt:
interface IAdatForras {
.. String getAdat();
}
A SajatProgramkod így fog kinézni:
class SajatProgramkod {
.. private IAdatForras adatForras;
.. public SajatProgramkod(IAdatForras adatForras) {
.. .. this.adatForras = adatForras;
.. }
.. public void csinaljValamit() {
.. .. String Adat = this.adatForras.getAdat();
.. .. //Csinálunk valamit az adattal
.. }
}
Most már csak annyi van hátra, hogy legyenek osztályaink, amik megvalósítják az IAdatForras interfészt:
class KonzolAdatForras implements IAdatForras {
.. public String getAdat() {
.. .. String Adat = null;
.. .. try (Scanner sc = new Scanner(System.in)) {
.. .. __ Adat = sc.nextLine();
.. .. }
.. .. return Adat;
.. }
}
Ha kell fájlból olvasás:
class FajlAdatForras implements IAdatForras {
.. public String getAdat() {
.. .. String Adat = null;
.. .. //Beolvassuk fájlból az adatot
.. .. return Adat;
.. }
}
És ez így működik majd neked:
IAdatForras adatForras = new KonzolAdatForras();
SajatProgramkod s = new SajatProgramkod(adatForras);
Ha változik az igény, hogy innentől kezdve nem konzolról, hanem fájlból kell az adatokat felolvasni, akkor elég ennyit csinálnom:
IAdatForras adatForras = new FajlAdatForras();
SajatProgramkod s = new SajatProgramkod(adatForras);
És ha megfigyeled, a SajatProgramkod-hoz hozzá sem kellett nyúlnom. Ha jól le van tesztelve az, akkor garantáltan működni fog, akármilyen adatforrást teszek alá.
Persze ennek is vannak hátrányai. Ugyanis a SajatProgramkod-nak lett paramétere. Egy jól megírt Dependency Injection Container-rel ezt a problémát is remekül meg lehet oldani.
Kapcsolódó 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!