# Design Patterns in Programm hineinfließen lassen



## Jürgen Müller (6. Jun 2008)

Hallo allerseits,

Ich habe mal ein UML Bild erstellt von einem geplanten Programm. Die MainWindow Klasse ist ein JFrame, alle anderen Klassen sind von JPanel abgeleitet und stellen JTabbedPanes dar. Die letzte KLasse ist die ComponentPanel Klasse mit einen add(..); methode für das GBLayout.

Später wird hinter jeder JPanel Klasse eine embedded MySql-Tabelle stehen als Datenmodel für die Daten die in den GUI-Klassen eingegeben werden. Die MySql-Tabellen haben teilweise Beziehungen zueinander.

Nun frage ich mich, da ich mich bereits etwas mit verschiedenen Design Patterns beschäftigt habe, welches Design Pattern ich über meine Anwendung "stülpen" könnte bzw. macht ein Design Pattern bei mir überhaupt Sinn ?

Dann hätte ich noch gleich eine Frage:

MVC Pattern: wende ich das MVC Muster bereits an, wenn ich meine Daten, GUI und SteuerungsMethoden bereits in einer eigenen Klasse habe? oder fehlt das Delegate?


----------



## L-ectron-X (6. Jun 2008)

Mindestens das MVC-Pattern, das DAO-Pattern und das Factory-Pattern können hier eingesetzt werden.


----------



## Jürgen Müller (6. Jun 2008)

L-ectron-X hat gesagt.:
			
		

> Mindestens das MVC-Pattern, das DAO-Pattern und das Factory-Pattern können hier eingesetzt werden.



DAO:



> DAO ist eine hervorragende Wahl um die *Persistenzschicht* und *die eingesetzten Technologien wie z.B. JDBC*, EJB CMP oder Hibernate *zu abstrahieren und somit den Code für den Datenzugriff vom Rest der Anwendung zu isolieren*.



ok DAO kannte ich nicht bzw. nie davon gehört, doch hört sich gut an! Kannst du mir Tutorials oder eine Lektüre dazu empfehlen? Ich habe das Buch Entwurfsmuster von Kopf-Fuß doch leider gibt es dort keine tolles Beispiel von DAO :/

MVC: ok also MVC schaue ich mir genau nochmals an...

Factory Method Pattern: Habe mir das Pizza Beispiel durchgelesen mit der Pizzafabrik und den verschiedenen Pizzen, doch ich weiß nicht wie ich dies auf mein Programm anwenden sollte bzw. ich sehe da keine deckenden Muster...

Könntest du da noch näher draufeingehen?


----------



## Jürgen Müller (6. Jun 2008)

da hab ich noch was auf wikipedia gefunden:


> (DAO, deutsch: „Datenzugriffsobjekt“) ist ein Entwurfsmuster, das den Zugriff auf unterschiedliche Arten von Datenquellen (z. B. Datenbanken, Dateisystem, etc.) so kapselt, dass die angesprochene Datenquelle ausgetauscht werden kann, ohne den aufrufenden Code zu ändern



Datenquelle sprich MySql datenbank austauschen... warum sollte ich das wollen? Selbst in 2 Jahren gibts nichts besseres als eine embedded MySql Datenbank.

Wie gesagt ich bin der Meinung man sollte jedes Pattern genau abwägen ob damit nicht auf Spatzen mit Riesenkanonen geschossen wird sprich man springt weit übers Ziel hinaus... doch da fehlt mir die Erfahrung, daher frage ich ja hier ;-)


----------



## foobar (6. Jun 2008)

Das DAO-Pattern ist auch dann praktisch, wenn man die DB später nicht auswechseln will, weil man eine saubere Trennung von Persistenzschicht und dem Rest der Anwendung hat.


----------



## L-ectron-X (6. Jun 2008)

Zum DAO- und Factory-Pattern hat semi ein schönes Beispiel geschrieben und gut erklärt.
http://www.java-forum.org/de/viewtopic.php?p=393061#393061


----------



## Jürgen Müller (6. Jun 2008)

L-ectron-X hat gesagt.:
			
		

> Zum DAO- und Factory-Pattern hat semi ein schönes Beispiel geschrieben und gut erklärt.
> http://www.java-forum.org/de/viewtopic.php?p=393061#393061



Habs mir mal durchgelesen und viele Fragen nun ^^

Ich finde in Semi`s Code nichts von einer MySql Verbindung noch irgendwelche sql statements ??

Ist Dao nun ein Pattern sprich ein spezielles Verhältnis von Klassen/Interfaces zueinander etc oder ein Framework? Ich dachte Dao würde MySql irgendwie kapseln und mir Methoden bereitstellen.


----------



## Jürgen Müller (7. Jun 2008)

so habe mal die forensuche benutzt mit "DAO" und les mich da mal durch...

noch eine letzte Frage: also ist es OK wenn ich die H2 embedded  Datenbank benutze mit DAO als Schicht zwischen Datenbank und meiner meiner Java Anwendung?


----------



## Jürgen Müller (7. Jun 2008)

Morgähn ^^

http://www.codefutures.com/products/firestorm/download/

Das ist umsonst zumindest der Lizenzschlüssel(support kostet) wäre das nicht Zeitersparnis etc wenn man das benutzen würde? oder würdet ihr alles von Hand machen?


----------



## L-ectron-X (7. Jun 2008)

Sicher, probiers einfach mal aus. Ich hab bis jetzt die DAO-Schicht selbst geschrieben, aber ich werde mir auf jeden Fall auch mal das Material von deinem Link ansehen.



			
				Jürgen Müller hat gesagt.:
			
		

> also ist es OK wenn ich die H2 embedded  Datenbank benutze mit DAO als Schicht zwischen Datenbank und meiner meiner Java Anwendung?


Ja.


----------



## maki (7. Jun 2008)

Kannst auch iBatis nehmen, wenn es etwas einfacher sein darf, ohne JPA/Hibernate.

http://ibatis.apache.org/

Hier noch ein generisches Hibernate DAO: http://www.hibernate.org/328.html

Nachtrag: AdressBuch, Veranstaltungen, Noten, Wochenplan, Vorkommnisse sehen für mich wie Domainklassen aus (Model), sind aber abhängig von der GUI da sie von Componentpanel erben, muss dass denn sein? 

Nachtrag 2: Englische Begriffe sind zu bevorzugen, da kommt es dann nicht zu so seltsamen Konstrukten wie getNote() und ähnlichem.


----------



## Guest (7. Jun 2008)

Jürgen Müller hat gesagt.:
			
		

> ...
> Ich finde in Semi`s Code nichts von einer MySql Verbindung noch irgendwelche sql statements ??


Hier gibt es eine Fortsetzung zu dem DAO-Beispiel.

http://www.java-forum.org/de/viewtopic.php?p=411095#410864

Gruß,
semi


----------



## Jürgen Müller (7. Jun 2008)

maki hat gesagt.:
			
		

> Kannst auch iBatis nehmen, wenn es etwas einfacher sein darf, ohne JPA/Hibernate.
> 
> http://ibatis.apache.org/
> Hier noch ein generisches Hibernate DAO: http://www.hibernate.org/328.html
> ...



1. Zu iBatis: wie ganz oben gesagt, das ist eine Java Desktop Anwendung und was ich brauche ist eine schnelle embedded Datenbank. Glaube kaum dass mir Hibernate da hilft oder entgegen kommt.

2. Zu Nachtrag: Das sind alles GUI-Klassen auf der Umel Karte darum ComponentPanel, damit ich die add Methoden nicht jedesmal neu in die Klasse schreiben muss.

3. getNote finde ich ok getGrade klingt bescheuert,  vor allem weil die Benutzeroberlächetexte auch in deutsch sind sollte man das einheitlichmachen mit holeNote(), setzeNote() meine Meinung als Deutscher ;-)

Danke semi für deinen Link!

Frage: Macht DAO den DB Zugriff nicht langsam? da wird ewig viel gekapselt und verwurschtelt da frag ich mich doch was an den guten alten JDBC Zugriffen schlecht war  :wink:  vor allem habe ich so wie ich das ganze bisher verstanden habe um einiges mehr an Code...

vor allem den Satz verstehe ich net...:


```
The basic idea behind the iBATIS introduction was to significantly reduce the amount of Java code that a Java developer normally needs to access a relational database with the use of XML files containing SQL queries.
```

wenn ich zu JDBC noch iBatis dazunehme wie kann ich dann weniger Code benötigen um eine rel. DB anzusprechen ??


----------



## maki (8. Jun 2008)

> 1. Zu iBatis: wie ganz oben gesagt, das ist eine Java Desktop Anwendung und was ich brauche ist eine schnelle embedded Datenbank. Glaube kaum dass mir Hibernate da hilft oder entgegen kommt.


Kommt darauf an, wenn du ein Domainmodell mit  OR Mapper gewohnt bist, wirst du mit nix anderem arbeiten wollen.
Wenn du Hibernate nicht kennst, ist es anders, die Lernkurve ist ziemlich steil.



> 2. Zu Nachtrag: Das sind alles GUI-Klassen auf der Umel Karte darum ComponentPanel, damit ich die add Methoden nicht jedesmal neu in die Klasse schreiben muss.


Nun, eine neue Klasse zu schreiben wäre ein saubereres Design 

In OO Sprachen schreibt man sehr viele kleine Klassen.



> 3. getNote finde ich ok getGrade klingt bescheuert, vor allem weil die Benutzeroberlächetexte auch in deutsch sind sollte man das einheitlichmachen mit holeNote(), setzeNote() meine Meinung als Deutscher icon_wink.gif


Benutzeroberflächen gibt es in vielen Sprachen, hat rein gar nix mit dem Quellcode zu tun, die deutsche Sprache pflegt man definitiv nicht im Quelltext von Progammen.
"Denglisch", die hässliche Vermischung von Deutsch und Englisch, wie zB. "getNote()" rührt in der IT daher dass Leute nicht konsequent sind, per Konvention sollen getter mit get beginnen und setter mit set, wichtig bei vielen Frameworks (von JSF bis iBatis und Hibernate), "setze" und "hole" sind nicht möglich. Was bleibt? 



> Frage: Macht DAO den DB Zugriff nicht langsam? da wird ewig viel gekapselt und verwurschtelt da frag ich mich doch was an den guten alten JDBC Zugriffen schlecht war icon_wink.gif vor allem habe ich so wie ich das ganze bisher verstanden habe um einiges mehr an Code...


Falsche "denke", in der OO macht man genau das.
"Langsam"? Vielleicht wäre Assembler eher etwas für dich 
Nee, quatsch. Vergiss Performance, ist nicht wichtig, ist aber vor allem nicht vorherzusagen, kann man nur messen, alles andere ist geraten.



> wenn ich zu JDBC noch iBatis dazunehme wie kann ich dann weniger Code benötigen um eine rel. DB anzusprechen ??


Mit iBatis braucht man keine Zeile JDBC mehr, wenn man schon mal JDBC Code geschrieben hat, versteht man warum JDBC ein sog. "PITA" ist.


----------



## foobar (8. Jun 2008)

> Mit iBatis braucht man keine Zeile JDBC mehr, wenn man schon mal JDBC Code geschrieben hat, versteht man warum JDBC ein sog. "PITA" ist.


Mhhhm, lecker http://de.wikipedia.org/wiki/Pita *g*


----------



## Jürgen Müller (8. Jun 2008)

> 2. Zu Nachtrag: Das sind alles GUI-Klassen auf der Umel Karte darum ComponentPanel, damit ich die add Methoden nicht jedesmal neu in die Klasse schreiben muss.





> Nun, eine neue Klasse zu schreiben wäre ein saubereres Design



Aber ich habe doch eine neue Klasse geschrieben genannt ComponentPanel ??



> In OO Sprachen schreibt man sehr viele kleine Klassen.



Wo habe ich wenige große Klassen?



> Benutzeroberflächen gibt es in vielen Sprachen, hat rein gar nix mit dem Quellcode zu tun, die deutsche Sprache pflegt man definitiv nicht im Quelltext von Progammen.
> "Denglisch", die hässliche Vermischung von Deutsch und Englisch, wie zB. "getNote()" rührt in der IT daher dass Leute nicht konsequent sind, per Konvention sollen getter mit get beginnen und setter mit set, wichtig bei vielen Frameworks (von JSF bis iBatis und Hibernate), "setze" und "hole" sind nicht möglich. Was bleibt?


 ok also getGrade() auch wenn das sehr hm ungewohnt ist.



OK iBatis scheint ein interessantes Framework zu sein welches mir Arbeit ab nimmt. Das schaue ich mir näher an. Wenn ich also iBatis benutze sollte ich dann auch nocht mit dem DAO Pattern arbeiten ??


----------



## foobar (8. Jun 2008)

> Aber ich habe doch eine neue Klasse geschrieben genannt ComponentPanel ??


Dir fehlt die Trennung zwischen Domainmodel und GUI(View). Deine Klassen Adressbuch, Noten, Wochenplan sollen nur das Domainmodel darstellen. Guck dazu mal Pojos an: http://de.wikipedia.org/wiki/Plain_Old_Java_Object



> OK iBatis scheint ein interessantes Framework zu sein welches mir Arbeit ab nimmt. Das schaue ich mir näher an. Wenn ich also iBatis benutze sollte ich dann auch nocht mit dem DAO Pattern arbeiten ??


Ja, die DB-Schicht sollte trotzdem gekapselt werden. Wenn du mit einem Persistenzframework arbeitest, kann die Kapselung aber viel dünner ausfallen.


----------



## Jürgen Müller (8. Jun 2008)

jetzt habe ich noch ein gutes Zitat gefunden, welches evtl. hervorhebt was ich brauche und was überflüssig wäre:



> I've been playing around with Persistence frameworks lately, after been inspired by a Hibernate, which is a de facto standard is used in lot of places. While Hibernate is certainly an excellent technology, it is not always the right choice. In other words, *Hibernate* works very well if your data model is well in sync with object model, *because ORM solutions like Hibernate map object to tables.* However, let’s suppose data model is not in sync with object model, this is where the model starts breaking down. One size does not fit all. So this is where I like to use iBatis; as the alternative solution, iBatis maps results sets to objects, so no need to care about table structures.



In meinem Programm KÖNNTE es so sein, dass beim Programmstart  IMMER alle Daten aus der Datenbank gelesen werden. Diese Daten können sein Strings, int, date oder auch objekte.Nun würde ich dieses Daten je Tabelle in je einer ArrayList speichern als Objekte sprich am Besten wäre eigentlich, wenn alles aus der Datenbank ein Objekt wäre.


Anhand der Voreinstellungen der GUI z.B.  ist in der JComboBox ausgewählt, dass in der GUI-Jtable nur Adressdaten der Schüler aus Klasse "7a" angezeigt werden. Jetzt jedes Objekt in der ArrayList nach dem String "7a" zu durchsuchen und diese dann in die Tabelle mit setValueAt(); zu schreiben wäre ja Schwachsinn...

Wißt Ihr was ich meine ungefähr? Ich denke Ihr oder einige von Euch kennen iBatis/Hibernate und bestimmt könnt Ihr mir ziemlich genau sagen was in meinem Fall geeignet wäre?

Würde mich zumindest darüber sehr freuen, damits nicht von Beginn an chaotisch wird  :lol:


----------



## Jürgen Müller (8. Jun 2008)

foobar hat gesagt.:
			
		

> > Aber ich habe doch eine neue Klasse geschrieben genannt ComponentPanel ??
> 
> 
> 
> ...



Ernste Frage: Macht Ihr das wirklich alle so: iBatis + DAO oder Hibernate + DAO ?


----------



## Jürgen Müller (8. Jun 2008)

ok war gerade auf manning.com habe mir mal die 2 freien Kapitel durchgeles...überflogen


```
Employee emp = (Employee) sqlMap.queryForObject("getEmployee",
new Integer(5));
```

jetzt weiß ich auch warum jdbc alleine nix ist :lol: 

ne iBatis scheint echt ein tolles framework zu sein und für meine kleine Anwendung genau richtig. Das mit der ArrayList war quark wie ich jetzt sehe, kann ja objekte mit integrierter Bedingung direkt mit ibatis aus der DB lesen :bae:


----------



## maki (8. Jun 2008)

> Ernste Frage: Macht Ihr das wirklich alle so: iBatis + DAO oder Hibernate + DAO ?


Natürlich siehe, siehe Antwort von L-etron-X und semi, DAO + JDBC funzt auch.

Wenn ich jetzt so drüber nachdenke, wäre es villeicht nicht verkehrt wenn du dich mit JDBC auseinandersetzt, ist zwar 'ne lowlevel API, aber zum üben richtig, JDBC sollte man zumindest mal gemacht haben dann darf man auch auf Frameworks umsteigen.

Liegt aber an dir.

Wichtig ist dass du deine DB Zugriffschicht vom Rest der Anwendung kapselst -> DAOs

Was dahinterliegt sollte ja austauschbar sein  (JDBC, iBatis, Hibernate, JPA, DTO, etc. pp.)


----------



## ps (8. Jun 2008)

Kurz zu den DAOs:
Wenn man mit JPA arbeitet (Hibernate, Toplink, OpenJPA, etc) so finde ich das ist genug kapselung von der DB Schicht.

Man benutzt für den Zugriff durch den EntityManager ja ausschließlich Klassennamen - die Datenbankstruktur muss einem nicht bekannt sein. Möchte man hier noch eine Schicht dazwischenziehen so ist das wirklich seeeeeh dünn - man gewinnt eigentlich nur bessere Prüfung zur Compile-Time.

Ich finde DAOs aber allgemein sehr unpraktisch wenn man Objekte mit vielen Properties hat und zB. eine Suche implementieren möchte (die DAOs werden unübersichtlich). Baut man generische DAOs so baut man den EntityManager nach ^^


----------



## maki (8. Jun 2008)

> Man benutzt für den Zugriff durch den EntityManager ja ausschließlich Klassennamen - die Datenbankstruktur muss einem nicht bekannt sein. Möchte man hier noch eine Schicht dazwischenziehen so ist das wirklich seeeeeh dünn - man gewinnt eigentlich nur bessere Prüfung zur Compile-Time.
> 
> Ich finde DAOs aber allgemein sehr unpraktisch wenn man Objekte mit vielen Properties hat und zB. eine Suche implementieren möchte (die DAOs werden unübersichtlich). Baut man generische DAOs so baut man den EntityManager nach ^^


Ja ps, sehe ich genauso, generische DAOs sind in etwa das was der PM macht.
DAOs sollten auch nur genutzt werden, um die Datenzugriffsschicht zu abstrahieren, Domainklassen würde ich keine referenzen auf DAOs geben (falls sie Daten/Objekte laden müssen), dafür sind sog. "Repositories" besser geeignet.

IMHO: DAOs nur für "primitive" CRUD Operationen, Repositories ( welche schon Businesslogik enhalten) als Zugriff von Domainklassen aus.

Denke aber dass der TS (noch) nicht wirklich etwas mit all diesen Infos anfangen  kann  (nicht böse gemeint Jürgen Müller, aber wenn du jetzt verwirrt bist ist das verständlich)


----------



## Jürgen Müller (8. Jun 2008)

darfst Jürgen sagen  :lol: 

ich komm schon in ein paar wochen mit einem Beispiel doch zur Zeit halten mich Schöler noch auf Trab.


----------

