Kekke serietitel dag 1: JavaFX Script nl

Door YopY op dinsdag 29 juni 2010 23:00 - Reacties (6)
Categorie: -, Views: 4.458

Dit is een eerste deel in een nieuwe serie (mogelijk onsamehangende) posts die door mijn andere serie heen gaat (die mogelijk gewoon onderbroken wordt), waarin ik probeer om nieuwe dingen te leren in het gebied van programmeren. Dit voornamelijk omdat ik toch het idee heb dat ik op mijn werk niet veel dingen meer kan leren, en zoals elke werkende Tweakert zou moeten weten: Stilstand is achteruitgang.

Deze blogpost begin ik met wat willekeurige opmerkingen over JavaFX. Ik speelde wat met het idee voor een soort van website beheer applicatie (waarmee je vanuit één applicatie een brede reeks (web) applicaties kunt beheren, details laat ik even achterwege ivm rant-gehalte), maar liep tegen één belangrijk aspect aan: de GUI.

Het is alweer enige jaren geleden dat ik voor het laatst een GUI maakte in Java's Swing, en zoals velen weten is de default Swing look & feel ongelofelijk lelijk, terwijl juist een mooie en vooral ook gebruiksvriendelijke en vlotte applicatie zo belangrijk is tegenwoordig.

offtopic:
App n [Diminutive of "application"] The irrelevant 10 percent of your code lurking beneath, and well-nigh inaccessible from, the glamorous, marketable GUI layer. bron


Dus ik denk, JavaFX is nieuw en voor grafische dingen, misschien kun je er ook goeie GUIs mee maken? Daar komt nog bij dat JavaFX een tijd terug aangekondigd is, maar een stille dood gestorven is - mede dankzij het feit dat nagenoeg tegelijkertijd Microsoft's Silverlight en Adobe Flex uitkwamen,

Maar eerst moet je een stukje leren en kijken wat je ermee kunt doen. Aldus geschiedde.

Men neme: Een X hoeveelheid tijd, een tutorial, een geïnstalleerde NetBeans IDE for JavaFX, en een glaasje water of twee.

Deze post zal voornamelijk over zaken gaan die ik tegenkom in de Getting Started tutorial, in dit geval waarschijnlijk voornamelijk de taal zelf en handigheidjes of dingen die mij opvallen, dus waarschijnlijk zal de rest van deze blogpost bestaan uit willekeurige onsamenhangende opmerkingen.

Men beginne.

Tutorials en copypasta van code

Hm, de tutorial begint met het maken van een project in Netbeans en de instructie "Kopieer deze code"... Ben ik niet zo'n fan van, maar het is voor een persoon met enige ervaring in wat voor programmeertaal dan ook wel te snappen. Zou het voor een beginner echter niet aanraden. Ik had vroegah ook een hekel aan boeken en dergelijke die je een of twee pagina's code voorschotelden met het bericht "Neem dit over, en het wordt niet van je verwacht dat je er geen fluit van snapt, dat wordt allemaal later uitgelegd!1". Tot zover mijn eerste poging Ruby (on Rails).

JavaFX als taal / Strings formatteren

De taal zelf is een stuk eenvoudiger dan Java (en ja, ik ga het voornamelijk daarmee vergelijken), lijkt me iets vlotter te typen. Het plaatsen van variabelwaarden in strings kan ik ook waarderen, da's iets dat me behoorlijk begint te ergeren bij Java.


code:
1
2
3
4
def numOne = 100;
def numTwo = 200;
def result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");



Ter vergelijking, het Java alternatief zou zijn:


Java:
1
2
3
4
int numOne = 100;
int numTwo = 100;
int result = numOne + numTwo;
System.out.println(MessageFormat.format("{0} + {1} = {2}", numOne, numTwo, result));



Werkt ook, en het zal intern misschien naar iets vergelijkbaars vertaald worden, maar de JavaFX notatie vind ik prettiger - beter op volgorde en dergelijke. Het is natuurlijk wel uitkijken met accolades in je string, ;).

Declaratieve syntax

is wat ze het noemen, blijkbaar. Moet even bijspijkeren wat dat precies is om daar een oordeel over te kunnen vellen. Eerste wat opvalt: types van variabelen en functie return types komen achter de variabele / functiedeclaratie ipv ervoor. Kan me voorstellen dat dit wat logischer is, taalkundig gezien 'functie pietje henk() { return new pietje() };' tegenover functie henk(): pietje. De tweede lees je als "functie henk geeft pietje terug". Alhoewel dit bij variabelen weer minder geldt - ik kan net zo goed zeggen 'nummer piet' als 'piet is een nummer' ( int piet; vs piet: integer). Maar vooruit.

Java functies aanroepen

JavaFX Script en Java zelf zijn dikke matties, en dat blijkt ook uit het volgende voorbeeld: strings parsen naar integers. Volgens de tutorial moet je daarvoor een Java methode aanroepen, en wel als volgt:


code:
1
2
3
4
function run(args : String[]) {
    def numOne = java.lang.Integer.parseInt(args[0]);
    def numTwo = java.lang.Integer.parseInt(args[1]);
}



Da's weer een minpunt - de "fully qualified classname" moeten gebruiken om een functie aan te roepen. Ik zou in dit geval toch de voorkeur geven aan een eenvoudige aanroep naar parseInt(args[0]), waarbij de compiler automagisch aanneemt dat je Integer.parseInt bedoelt. En als 'ie toch hulp nodig heeft, dan toch gewoon integer.parseInt, of anders args[0].toInt();.

Readonly, onlyread, var, def, bind

Oké, JavaFX Script variabelen 101:

* Met 'var' definieer je een variabele.
* Met 'def' definieer je een constante.

Maar hier zijn uitzonderingen op. Ik haat uitzonderingen.

* De enige vars die read-only zijn, zijn diegenen die gedefinieerd zijn met "bind".
* Defs kunnen van waarde veranderen als ze "bound" zijn.

Verwarrend? Vondt ik wel, en ook inconsistent.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Bound vars
var y;
var x = bind y;
println("Is Y read only? {isReadOnly(y)}");
println("Is X read only? {isReadOnly(x)}");
// output:
Is Y read only? false
Is X read only? true

// Bound defs

var a = 1337;
def b = 12;
b = 13; // You cannot change the value of B
def c = bind a;
println(c);
a = a * a;
println(c);

// output
1337
1787569



Lijkt erop dat JavaFX pointers weer hip probeert te maken. Mogelijk zal het doel hiervan zich later openbaren. Vooralsnog lijkt het wat tegenstrijdig. (Spoiler: Heb verderop gezien dat je ook functies aan vars kunt toekennen, dus mogelijk heeft het daarmee te maken).

Spanje wint van Portugal met 1-0, en ik sluit voor vandaag af. Indien dit lichtelijk interresant is zal ik nog wel eens een deeltje twee schrijven, en anders horen jullie nog wel eens van me over een volledig anders onderwerp. Erlang, ofzo, of misschien iets over frustraties van moderne softwareontwikkeling ("ik wil feature X, dat moest gisteren af, in zo weinig mogelijk uren. Nee je krijgt geen tijd om die 7 jaar oude code te gaan refactoren. Watte? Alle primitives worden met objecten gedaan? Huh? Alle data retrieval functies staan in één grote service class en doen allemaal aan het ophalen van een connectie en aanroepen van commit en rollback functies? De fok? Alle DAOs zijn verzamelingen static functies met een bakkes prepared statements? Vector? Wasda?")

Edit: Deel twee is uit :)