kopf.lastig Alles mögliche zu Themen wie Familie, Beruf, Medien etc. …

2005-11-29

Domain-Driven Design

Filed under: Software-Entwicklung — Schlagwörter: — Erik @ 17:42

Die letzten Wochen habe ich „Domain-Driven Design“ von Eric Evans gelesen (bei Lehmanns, Amazon). Ich finde, dieses Buch ist für Software-Entwickler sehr empfehlenswert, die sich des objektorientierte Programmiermodells bedienen.

Im Buch geht es darum, wie man gute Objektmodell für Fachdomänen erstellt (daher Domain-driven). Da es sich um ein ganzes Buch zu diesem Thema handelt, fängt es gar nicht erst bei „Substantive sind potentielle Klassen“ an, wie es sonst doch recht üblich in OO-Büchern ist. Evans stellt Patterns vor, die ganz unterschiedlichen Scope haben (von „Entities“ bis „Systemmetapher“) und stellt diese Patterns auch in Zusammenhang zueinander.

Das Ziel von domain-driven design sind „Deep Models“, d.h. Modelle und deren Implementierung (!!!), die aus der vertieften Analyse der Domäne entstehen. Ihr Mehrwert ist ein tiefes Verständnis der Domäne durch die Entwickler, eine größere Übereinstimmung im Wissen der Entwickler und Fachleute, verbesserte Wartbarkeit und vereinfachte Erweiterbarkeit.

Ganz klar wird allerdings herausgestellt, dass domain-driven design kein „must-have“ ist, sondern das es auch Alternativen gibt.

Domain-driven design bedeutet nicht up-front design, sondern: Modell und Implementierung gehören zusammen; das Modell benötigt das Feedback durch die Implementierung. Es wird durch vertiefende Kenntnis (das ist ein Prozess!) der Entwickler über die Domäne gewonnen, Refactoring überträgt neu gewonnene Kenntisse auf das Modell und damit die Implementierung.

Highlights für mich sind:

  • Unterscheidung zwischen Entities und Value Objects
  • Layers – so habe ich mir das schon immer vorgestellt
  • Ubiquitous Language – eine gemeinsame (Fach-)Sprache ist Voraussetzung für gute Kommunikation
  • Intention-Revealing Interfaces – verbessert Lesbarkeit des Codes, damit Wartbarkeit und Verständlichkeit
  • Bounded Context – in welchem Kontext gilt ein Modell überhaupt (davon kann es in einer Anwendung mehrere geben)
  • Responsibility Layers – Verantwortlichkeiten innerhalb eines Objektmodell in Schichten aufteilen

Das Buch kann man auch bei Safari online lesen.

2005-11-28

10 Lieblingsbeschäftigungen meines Sohnes

Filed under: Leben — Schlagwörter: — Erik @ 13:44

Dies sind so ca. die 10 Lieblingsbeschäftigungen / Lieblingspielzeuge meines Sohnes (13 Monate):

  1. Musik hören und „tanzen“
  2. CD’s aus der Hülle nehmen, in den DVD-Player stecken und wieder raus nehmen.
  3. Bücher aus dem lies + spiel Bücherturm nehmen, durchblättern, wieder reintun.
  4. Knöpfe drücken
  5. mit unserer elektrischen Zahnbürste spielen
  6. mit der Computermaus spielen
  7. mit dem Telefon spielen
  8. Schränke ausräumen
  9. mit Bauklötzen spielen
  10. bei Mama/Papa/Oma auf dem Arm sein

2005-11-04

„Hibernate – A Developers Notebook“ – migrating to Hibernate 3.0, Chapter 7

Filed under: Java — Schlagwörter: , , — Erik @ 19:26

Chapter 7 is working in Hibernate 3 (as opposed to chapter 6). The most challanging in this chapter migrationwise are StereoVolumeType.java and SourceMediaType.java . Change the import-package names. The Usertype-stuff is now under the package „org.hibernate.usertype“. It won’t compile, yet as there are some methods missing. For SourceMediaType.java:
[java]
public Object replace(Object original, Object target, Object owner)
throws HibernateException {

return original;
}

public Serializable disassemble(Object value) {
return (Serializable) deepCopy(value);
}

public Object assemble(Serializable cached,
Object owner)
{
// Our value type happens to be serializable, so we have an easy out.
return deepCopy(cached);
}

public int hashCode(Object o) { return o.hashCode(); }
[/java]

For StereoVolumeType.java:
[java]
public Object replace(Object original, Object target,SessionImplementor session,
Object owner)
throws HibernateException {

return deepCopy((StereoVolumeType)original);
}

public int hashCode(Object o) { return o.hashCode(); }

public Object replace(Object original, Object target, Object owner)
throws HibernateException {

return original;
}
[/java]

That’s it.

Powered by WordPress