Sodalla, ich habe mir gestern und heute mal überlegt, was genau ich mir eigentlich vorstelle und wie man es evtl. umsetzen könnte. Der UML Entwurf Klassenentwurf sieht so aus
(Was benutzt ihr eigentlich zum modellieren, Code generieren und reverse engineeren?)
Den aktuellen SourceCode dazu könnt ihr hier finden:
Source
Meine Idee um die Sachen voneinander zu entkoppeln und trotzdem zusammenarbeiten zu lassen ist folgende:
RawImageData packt ein beliebiges Datenobjekt zusammen und liefert ein paar optionale Zusatzwerte, die gesetzt werden können, aber nicht zwingend müssen. Ein weiterer Wert, der bei Erstellung übergeben wird, ist String id. Das Ding soll später als Eclipse RCP Erweiterung laufen und auf die Weise ggf. sicherzustellen, einen bestimmten Adapter zu wählen, falls mehrere möglich wären.
RawImageDataAdapter interpretiert so ein verpacktes Datenobjekt auf bestimmte Art und Weise, es stellt quasi einen "Viewer" dar.
Der DataAdapterValidator prüft, ob RawImageData zu einem bestimmten Adapter passt, ich wollte die Interfaces trennen, um die Möglichkeit zu haben, eine leichtgewichtige Prüfklasse zu haben, da ja das erstellen des richtigen Adapters schon kosten könnte. Vielleicht gibt es da einen besseren Ansatz? Kann man definieren, dass zwei interfaces nicht zusammen implementiert werden dürfen? Später könnte es damit z.B. möglich sein, dass der Builder selbstständig nach passenden Adaptern sucht.
Das AlphaCreationAlgorithm Interface definiert Funktionen die für einen beliebigen RawImageDataAdapter einen passenden Alpha Channel zurückgeben müssen, auch, wenn der Adapter selbst keinen Alpha Kanal zurückgeben würde.
Der Builder selbst wird einfach nur konfiguriert, ein bestimmtes Zielbildformat zu erzeugen. Dabei soll sichergestellt sein, dass zu jedem Zeitpunkt mit einem validen Adapter auch tatsächlich ein Bild erzeugt werden kann. Jeder build() Aufruf bekommt jeweils immer einen RawImageDataAdapter übergeben, aus dem er das Bild erzeugt. Außerdem ist im Builder immer ein AlphaCreationAlgorithm hinterlegt, der im Falle, dass ein RGB oder Greyscale Bild mit Alpha Kanal versehen werden soll, diesen erzeugt. Ferner kann dem build Aufruf auch ein bestimmter AlphaCreationAlgorithm mitgegeben werden, der für diesen einen build den AlphaKanal des Original bzw. die im Builder hinterlegten AlgoRegeln überschreibt.
Die drei Enumerations stellen schlicht die Aufzählung eindeutiger Bezeichner dar.
Erweiterungsmöglichkeiten:
1.) RawImageData: enthält eine HashMap "userData" in der wahlfreie weitere Informationen mit String Key hinterlegt werden können.
2.) RawImageDataAdapter: Will man ein neues Datenformat als Bild interpretieren, muss man einfach dieses Interface implementieren. Damit sollte es möglich sein, wahlfreie Eingaben in Bilder umzuwandeln, sogar String Listen, etc. Zu jedem neuen RawImageDataAdapter sollte auch ein Validator erzeugt werden, am Besten als nested static klasse. Kann man das irgendwie erzwingen?
3.) AlphaCreationAlgorithm: Man kann beliebige Regeln in seiner Implementierung erstellen, wie aus den Angaben eines bestimmten RawImageAdapters ein Alpha Channel erzeugt wird. Die zwei Standard Implementierungen AllTransparent und AllOpaque liefern einen komplett transparenten bzw. komplett
undurchsichtigen Kanal zurück. (Obwohl ich mir gerade überlege, dass ein Uniform mehr Sinn macht
So far
P.S. Macht es Sinn, diese Object Geschichte für Arrays irgendwie generisch zu erledigen? Ich habe das versucht, bin aber irgendwie zu blöd dafür, ich raff einfach nicht, wie man dem compiler beibringt, dass er ein beliebiges primitiven Array zu übernehmen bzw. zurückzugeben hat.