Mittwoch, 4. August 2010

Adobe Cairngorm vs. GraniteDS Tide MVC

Teilen
Wer eine etwas umfangreiche Flex Applikation entwickelt wird früher oder später nicht um ein vernünftiges MVC Framework herumkommen. Man kann sich noch soviel Mühe geben und mittels Code-Behind Pattern Layout von Logik trennen, aber der Einsatz eines MVC Frameworks bringt deutliche Vorteile die man nach kurzer Zeit nicht mehr missen möchte.

Nun gut. Am Anfang der Entwicklung nutzte ich das Adobe Cairngorm MVC Framework welches sehr stark an die alt hergebrachten J2EE Patterns angelehnt ist. Zur Anbindung an das Spring Backend verglich ich BlazeDS mit GraniteDS und habe mich für Letzteres entschieden, was ich bis heute nicht bereut habe.

Tide ist Teil von GraniteDS und als MVC Framework zu gebrauchen. Zusätzlich bringt es noch sehr viel andere nützliche Features (ServerPush/Security etc.) mit. All dies kommt sozusagen mit GraniteDS als nette Beigabe mit.

Kürzlich habe ich entschieden Cairngorm durch Tide zu ersetzen (ein Framework weniger). Die ersten Schritte wurden bereits umgesetzt und es haben sich viele Vorteile als auch einige unschöne Dinge (mit denen man leben kann) gezeigt.

Cairngorm:
Das Prinzip bei Cairngorm ist wie folgt: Teile dem Controller mit, welcher Command bei welchem Event auszuführen ist. Im Command nutze das Business Delegate Pattern und handle den Result in der Command Klasse. Der Delegater nutzt wiederum das ServiceLocator Pattern um das Backend aufzurufen.

Nachteil: Folgt man dieser Vorgehensweise, spürt man recht schnell wie man das DRY Prinzip verletzt. Immer wieder Event and Command binden, usw. Die Anzahl der Command Klassen wächst somit pro Eventtyp. Irgendwie schlecht. Viel zu viel Code für einen einzigen Button Click.

Vorteil: Die IDE als auch der Compiler decken Fehler in der Implementierung auf, da alles typisiert ist.

Tide:
Hier wird Loose Coupling gross geschrieben. Meiner Ansicht nach etwas zu GROSS.
Vorteil: Sehr viel weniger und redundanter Code, schickes MVC Framework, integriert sich gut und nicht zu aufdringlich, d.h. der Code bleibt relativ sauber, wenige Tide Dependencies.

Nachteil:
Observermethoden werden über AS Annotationen markiert. Der EventType ist dabei ein String:
[Observer("ADD_USER")]
public function addUser():void

Das Event wird gemäss Standard geworfen:
dispatchEvent(new UserEvent(UserEvent.ADD_USER));
-> Fehler werden zur Laufzeit sichtbar und sind nicht trivial zu finden. In der IDE ist es nicht möglich Referenzen ausfindig zu machen (nur mit einem file search).

Ähnlich wie bei Spring wird ein Tide Context aufgebaut der die markierten(!) Klassen verwaltet. Eventhandling und Auffindung der Services läuft über diesen Context. Einen Service findet man über eine dynamische Klasse:
tideContext.userService.findAll(onUsersLoaded);
Vertippt man sich stattdessen und schreibt:
tideContext.userervice.findAll(onUsersLoaded);
meckert der Compiler nicht und auch zur Laufzeit tritt kein Fehler auf (dynamische Proxy Klasse)!
Das Java Pendant sieht folgendermaßen aus:
class UserService, Methode: List findAll().

Der Parameter onUsersLoaded ist eine Eventhandler Methode.

Thema Security: Grosse Probleme ergaben sich bei der Nutzung der Spring Security (die von GraniteDS eingerichtet ist) und dem Cairngorm Framework. Cairngorm wrapped auftretende Exceptions und es ist nicht ohne weiteres möglich an die SecurityExceptions von GraniteDS ranzukommen. Mühseelig die Fehlercodes und Texte auszuwerten um an den Cause zu gelangen. Diese Probleme hat man nicht wenn man Tide benutzt!

Alles in allem muss ich aber sagen, dass ich Tide dem Cairngorm bevorzuge zumal ich sowieso GraniteDS benutze. Wer BlazeDS nutzt sollte sich möglicherweise noch andere MVC Frameworks ansehen bevor er sich für Cairngorm oder Tide entscheidet.




Dienstag, 6. Juli 2010

Aber bitte nicht die Katze im Sack

Teilen
Vor einiger Zeit habe ich einen Eintrag geschrieben der ein Komponentenmodell einer OSGi Anwendung darstellt.

Dies war die Theorie - heute die Praxis um zu zeigen, dass hinter einer schönen Fassade auch eine saubere Architektur steckt. Hin und wieder sollte man zu einem Dependency Analyse Tool greifen und die gewünschte Architektur dahingehend überprüfen.

Natürlich fällt die Einhaltung der sauberen Schichtentrennung und einem gerichteten Dependeny Graph in einem OSGi Umfeld mit Maven Build einfacher, als dies bei proprietären Enterprise Applikationen der Fall ist, wo oft nur auf Package Ebene unterschieden wird.
Dann wird die Sache sehr viel schwieriger und sollte dauerhaft (möglichst im CI Build) einem Dependency Check unterzogen werden (JDepend).

Wenige Klicks in der IDE (stan4j) waren nötig um sich aus 15 OSGi Bundles ein klares Bild über die Abhängigkeiten zu verschaffen (Die Packages liegen z.T in unterschiedlichen Bundles):

Donnerstag, 17. Juni 2010

Apropos Bücher

Teilen
Den dollsten Clue habe ich mit dem Kauf eines Buchs von Apress bzgl. JEE6 und GlassFish v3 gemacht. Das war im vergangenen Jahr (als die Spez noch draft war und der Embedded Container noch unbrauchbar).

Das Buch ist sowas von schrecklich! Komplett für Rookies, voller Fehler und selbst die Code-Beispiele zum Download waren unbrauchbar,

Mich hatte interessiert ob ich die Instanziierung des Embedded EJBContainers korrekt gemacht hatte. Damals hatte ich unheimliche Hacks zu verrichten um das Ding mit Maven/Cobertura/Surefire gescheit zum Laufen zu bringen. Auf der Suche nach Hilfe fand ich einen brandaktuellen Eintrag im Forum von Sun. Dieser Eintrag kam von dem Autor des Buches, der ebenso um Hilfe schrie....

Mittlerweile ist der Autor in die Liga der Java Champions aufgestiegen. Ich vermute, dass ein Buch über Java Technologien die letzte Hürde war die es zu meistern galt :-)

Nun denn, dann fangen wir doch mal an Buuuuch zu schreiben ....

Google Books macht mich traurig

Teilen
Sehr sehr schade ...

Ich mag Bücher. Und noch mehr mag ich Fachbücher! Angefangen 1987 mit den Ausgaben des Amiga Magazins (die übrigens immer noch in Umzugskisten verweilen) bis zum heutigen Tag mit ganz tollen Büchern von Apress, Manning oder O'Reilly.

Gute Fachbücher muss man einfach kaufen, da man sie immer und immer wieder liest und stets Neues darin entdeckt. Deswegen sollte auch ein jeder die Arbeit des Autors schätzen und für den Druck das nötige Kleingeld hinlegen.

Nach der Welle der eBooks auf eDonkey, rapidshare & Co. findet man nun auch so manch tolles Werk auf books.google.com. Dieser Trendbewegung stehe ich momentan noch mit einem weinenden Auge gegenüber und weiss nicht Recht ob dies dem KnowHow der Menschheit dienlich ist oder nicht.

Der Erscheinungstermin von DocBook5 ist laut des Verlags O'Reilly schon wieder verschoben. Mittlerweile von Ende Mai auf Juli; wurde mir per Mail bestätigt. Schade, schade, dabei warte ich schon seit Anfang des Jahres (!) auf genau dieses Stück Papier.

Weder ebook, iPad, books.google können in meinem Bücherregal das Papier ersetzen ...

Mittwoch, 16. Juni 2010

OSGi die µSOA!

Teilen
Der Begriff SOA ist sehr geläufig. Dabei handelt es sich lax ausgedrückt um eine verteilte, lose gekoppelte heterogene Struktur von Applikationen die oftmals mittels einer Middleware (z.B. eines ESB) zusammenhängen. Jede dieser Applikationen bieten dabei der SOA ihre Services an.

Nimmt man eine Lupe zur Hand und schaut sich eine Applikation dieser SOA genauer an könnte man möglicherweise eine Applikation ausfindig machen, die auf OSGi aufgebaut ist und dedizierte Services der SOA anbietet.

Die Architektur einer solchen OSGi Anwendung hat gewisse Ähnlichkeit mit einer echten SOA. Alle OSGi Bundles sind autarke Softwarekomponenten die Services veräußern und der OSGi Runtime und damit anderen Bundles anbieten. Alle Komponenten sind dabei ebenso lose gekoppelt und können während des Betriebs aktiviert bzw. deaktiviert werden ohne größeren Schaden auf andere Komponenten auszuüben.

Die oben erwähnte Middleware ist zu vergleichen mit der OSGi Runtime. Ein vernünftiger OSGi Server wie der SpringSource dmServer bietet eine solide OSGi Laufzeitumgebung die keine Wünsche offen lässt.

Zum Thema Verteilung (wenn dies wirklich ein Thema sein sollte): "1st law of istribution is, don't distribute, if you don't and won't have to" (Martin Fowler).

Sollte man dennoch in die Verlegenheit kommen OSGi Services verteilen zu müssen, wäre vielleicht das Projekt R-OSGi der ETH Zürich ganz interessant.

µSOA!

Alles in allem könnte man also eine OSGi Applikation inkl. OSGi Runtime als eine µSOA bezeichnen.

Dienstag, 15. Juni 2010

Business Domain Modelling

Teilen
Ein paar Gedanken zum Entwurf einen Domain Models...

Ich frage mich, wie viele Designer und Architekten den Weg zu einem stabilen Domain Model finden welches losgelöst jeglicher Technologie ist und auf eine lange Zeit Bestand hat?

Nehmen wir einmal den Entwickler als erstes Beispiel: Der Entwickler arbeitet am Liebsten in der IDE seiner Wahl und findet sich am besten in der Sprache seiner Wahl zurecht, welche sich letztendlich in Code ausdrückt. Da er glaubt mit den neuesten Standards und Hypes bewandert zu sein, entwirft er ein super-duper Domain Model in Sourcecode (am Besten OO mit POJOs). Metadaten dürfen im Code natürlich auch nicht fehlen, zumal es die Frameworks ja sogar anbieten (Bsp. JPA Annotationen).

Recht schnell wird ihm klar, dass das Ganze doch recht komplex wird aber es stört nicht weiter, da sich immer noch alles abbilden lässt bzw. er der Macher ist und (mittlerweile als Einzigster) den Überblick behält.

Anforderungen wie Langlebigkeit und Wartbarkeit sind erstmal zweitrangig, auch wenn der JCP bereits einen Draft der Folgeversion vorgelegt hat. Neuen Teammembers dieses monolithische Geflecht einzelner Klassen zu erklären und auch die Notwendigkeit der Beziehungen untereinander aufzuzeigen ist ein Genuss, da er sein Modell kennt und Javadoc sein bester Freund. Nur versteht dies jeder? Versteht dies auch der Business Analyst der die Anforderungen definiert hat? Fraglich...

Phase 2:
Sei es ein Technologiewechsel oder ein Upgrade, es ist Zeit, dass der Macher sein Modell upgraded (denn er versteht es am Besten). Reine Fleissarbeit...

Phase 3:
Neue Anforderungen landen im Jira. Denkbar wäre, dass das Modell (oder Teile davon) in eine WSDL gepackt werden, oder generell in ein Schema, um einem Legacy System anbieten zu können. Also basteln wir kurzer Hand ein XMLSchema und natürlich auch die Parser/Writer dazu. Allerdings sind somit unsere eigentlichen Informationen des Business Models redundant und voneinander unabhängig geworden. Noch schlimmer wird es wenn jemand verlangt abhängig von unserem Modell DAO Code (sei es SQL oder Java) zu erzeugen, also bauen wir uns ein Freemarker Template und die nächste Redundanz ist da.

Das Problem was ich aufzeigen möchte ist folgendes: Ist das Business Model nicht das zentrale Herzstück der Anwendung bzw. des gesamten Unternehmens? Und sollte dieses Modell nicht auch von Stakeholders begriffen werden, die sich nicht in den Tiefen unserer Kodierungssprache bewegen? Sollten wir uns nicht einen Schritt von dem Code wegbewegen und nochmals über die Methodologie nachdenken?

Mögliche Lösungsansätze ohne an Code zu denken:

1) UML: Sicherlich interessant nur Overkill. Ich möchte nicht jedes kleinste Detail mit UML modellieren und immer wieder den One-Way-Generator laufen lassen um zu sehen, dass ich ein perfekter Designer bin und mit dem grünen Knopf mein Modell in Code giessen kann. Dies ist einfach nicht effizient genug und wie erwähnt in den allermeisten Fällen eine Einbahnstrasse.

2) Einfache Modellierungssprachen (wie Ecore/EMF) bieten genug um ein Modell anschaulich darzustellen und begreiflich zu machen. Hat man sein Ecore Modell auf dem Desktop ist es lediglich eine Frage des Generators (bzw. des Templates) um jegliche Anforderungen zu erschlagen. Selbst der Business Analyst wagt sich das Modell zu öffnen und findet sich damit zuerecht. Der Vorteil gegenüber vielen kommerziellen UML Tools liegt in den M2T und M2M Transformationen die ich nach Belieben entwerfen kann um zum Ziel zu gelangen.

Wer also die Problemstellung kennt sollte sich die Geschwister Ecore/EMF/Xpand/Xtext und oAW anschauen. Vielleicht hilft dies weiter...

Montag, 14. Juni 2010

Dienstag, 25. Mai 2010

JSR-303 Bean Validation API

Teilen
Check out this SlideShare Presentation: