Ebben a részben azt gondolom, nagyon sokat tanultunk. Talán egészen más nézőpontból gondolkodunk a programozásról, mint azelőtt.
Korábban lehet, hogy azt gondoltad, hogy "itt csak meg kell tanulni azt a 20 utasítást".
Aztán láttuk, hogy a meglévő frameworkok mennyi mindenre jók, szóval "csak meg kell tanulni pár frameworkot".
Aztán láttuk, hogy vannak ezek a design patternek, szóval "csak pár design patternt".
De a végén egészen messzire jutottunk. A Java nyelv lehetőségeit okosan kihasználva nem 54 sornyi átláthatatlan kódot kell írnunk, hanem megteremtettük egy olyan framework alapjait, ahol tényleg csak annyit kell írni, ami szükséges, és minden szónak értelme, funkciója van.
A framework amit elkezdtünk készíteni, látványosan könnyebbé teszi a dolgunkat! Igaz, egyszer időt kell szánni a framework elkészítésére, de utána minden programunk egyszerű, átlátható lesz, és hamar elkészül.
Ezeket az új fogalmakat ismertük meg:
Dulifuli ezeket a célokat állította
1) [Kész] Egy ablakban lévő dologhoz egyetlen sort kelljen írni.
2) Automatikusan rendezze el az ablakban a vezérlőket - értelmesen, ne kelljen nekem megadni, hogy hány sor meg hány oszlop lesz, meg hogy mi mekkora legyen.
3) [Kész] Minden logikusan és értelmesen nézzen ki és viselkedjen magától.
4) [Kész] Minél kevesebbet kelljen megtanulni a frameworkről. A frameworkök jönnek-mennek, nem vicces, hogy 100 osztályt és ezek minden metódusát fejben kell tartani ahhoz, hogy GUI-t lehessen csinálni.
5) Támogassa már az alapvető megjelenési dolgokat: a szám-formátumokat, tizedeseket, dátum-formátumot, és tudja a nyelvi fordításokat is, hiszen nem mindenki magyarul akarja használni a programomat. Nehogy már ezzel is nekem kelljen foglalkozni.
6) Támogassa már az alapvető ellenőrzéseket: tudja, hogy szám-mezőbe csak számot írunk bele, figyeljen a megadott minimum-maximum értékek betartására. Ezt úgy is nevezik, hogy validátorok.
7) Legyen már képes arra, hogy a változóim értékét megjeleníti, vagy éppen szerkeszti magától. Ne nekem kelljen a képernyőn lévő szövegmezőből kivenni a nevet, és berakni a name változóba, hanem ez magától történjen. Ezt úgy is nevezik, hogy data binding.
Elég sok mindent megcsinálam Dulifuli listájából, de azért vannak itt még meredek dolgok, amik egy kicsit meghaladják egy Java kezdő kurzus kereteit. A következők kellenek még:
2) Automatikusan rendezze el az ablakban a vezérlőket.
Ehhez egy saját layout managert kell csinálni, ami egy olyan osztály, ami beállítgatja a vezérlők x,y pozícióját, meg a szélességét, magasságát, figyelembe véve a vezérlő eredeti méreteit, és hogy mennyi hely van az ablakban.
5) Támogassa már az alapvető megjelenési dolgokat.
Ehhez renderereket fogok csinálni. A renderer egy interface, amiben van egy metódus, ami egy adatot vissza tud adni szövegként. Például, ha egy elefánt 1423.43 kg, és egy magyar felhasználó nézi a képernyőt, akkor "1 423,43", míg egy amerikai felhasználó "1,423.43" feliratot kell hogy lásson - hiszen ezek az elfogadott számformátumok.
A renderereket összekötöm adattípusokkal, hogy például egy int adathoz a szám-renderert használja, míg mondjuk egy dátumhoz a dátum-renderert.
Sok esetben nem biztos, hogy a renderert meghatározza az adat típusa. Például, ha van egy int, ami évszám, akkor ugyan az szám, de mégsem szabad ezres elválasztót tenni bele, tehát a 2016 az "2016" marad, míg a 8234 alma "8 234". Ezeket a kivételetek annotációkkal fogom megadni. Az annotációk olyan "kommentek" amiket nem magunknak, hanem a programnak teszünk. Ezek @ betűvel kezdődnek, például @Render(NumberRenderer.class) Igen, az @Override is egy annotáció!
6) Támogassa már az alapvető ellenőrzéseket.
Ezt részben a szerkeszteni kívánt típusból (szám típus? vagy string?) részben pedig a szerkesztendő változón lévő annotációval fogom megoldani. A számos típusoknál a lehetséges értéktartományt, míg a szöveges típusoknál a maximális hosszt is meg kell adni:
@Min(1900)
@Max(2099)
int year;
@Length(30)
String name;
7) Legyen már képes arra, hogy a változóim értékét megjeleníti, vagy éppen szerkeszti magától.
Ez kissé trükkös. Először is azért, mert egy vezérlő nem tudja, ha a programban valaki megváltoztatta valamelyik változó értékét. Emiatt most egy egyszerű Timer-t fogok használni, ami másodpercenként 10-szer megnézi, hogy egy változónak mi az értéke, és automatikusan frissíti a képernyőn lévő vezérlő tartalmát.
A másik trükkös dolog a változók tartalmának kiolvasása és megváltoztatása. Erre a reflection nevű módszert fogom használni - ami igazán mocskos dolog, de lehetővé teszi azt, hogy a képernyőn lévő értékek és a program változóit összekössem.
(Később, ha még okosabbak leszünk, ezt, és az ellenőrzéseket és a renderereket is felokosítjuk a domain-specifikus adattípusokkal (DST).
Ez azt jelenti, hogy nem int, meg String, meg ilyesmi típusokat használunk - hiszen ezek az adatok tárolását mondják meg, de nem tartalmazzák az adatok jelentését. Ehelyett Name, meg Email, meg Year, meg Money, meg ilyesmi típusokat fogunk használni - és ezek a típusok pontosan tudnak magukról mindent.
Például, egy Year típus tudja, hogy ő egy egész szám 1900 és 2099 között (persze ezt felül lehet bírálni, de az biztos, hogy -324324 az nem jó érték egy évszámnak). Egy Email típus tudja, hogy hogy kellene egy emailnek kinéznie, hol van a kukac helye, és ha nem jó az, amit beírunk az ablakba, akkor tud szólni.)
Azt látom, hogy érdemes egyszer egy kis energiát tenni abban, hogy legyen egy könnyen használható eszközünk. Ezért úgy gondoltam, elvonulok, és csendben megcsinálom az összes többi dolgot.
Mire visszatértek a 09-es részhez, már nem kell a Swing vackait kerülgetni, hanem egyszerűen és simán tudunk csinálni nagyszerű ablakos programokat!