Offtopic: Policy Based Class Design

CallForSanity
Windoof-User
Windoof-User
Beiträge: 27
Registriert: 17. Okt 2007 20:45

Offtopic: Policy Based Class Design

Beitrag von CallForSanity »

Hi,

ich wollte mal fragen, was man im Software Engineering von Policy Based Class Design hält.
Sowas gibt es in Java leider nicht, da es keine Templates unterstützt, aber in C++ ist es möglich.
In Java gibt es zwar Generics, aber die sind nicht so mächtig wie Templates, soweit ich weiß.

Ein Beispiel dazu kann man in http://en.wikipedia.org/wiki/Policy-based_design finden.

Das Schöne daran ist meiner Meinung nach, dass es dieselben Vorteile bietet wie direktes Subclassing,
aber ohne die Nachteile, wie Klassenexplosion, etc.

In der Vorlesung haben wir direktes Subclassing durch Einführen neuer Abstraktionen ersetzt.
Allerdings ist dazu ja dann das Erstellen neuer Typen nötig, welches ja dann wieder ein Problem
beim Instanzieren erzeugt, welches wiederum mit Dependency Injection gelöst wird.
Das Alles brauchen wir bei Policy Based Class Design nicht. Dependencies werden bei der
Template-Instanzierung aufgelöst.

Man muss außerdem keinen Basistypen für die neu eingeführten Abstraktionen erstellen,
denn das Ganze wird ja erst zur Kompilierzeit aufgelöst, und zwar egal für welches Template-Argument.
Man kann also nach Herzenzlust Klassen aus anderen Klassen zusammenbauen, ohne auf Hierarchien
oder Interfaces acht geben zu müssen.

Was haltet Ihr davon?

vaidas
Mausschubser
Mausschubser
Beiträge: 65
Registriert: 4. Feb 2010 17:12

Re: Offtopic: Policy Based Class Design

Beitrag von vaidas »

Es ist im Prinzip wie Strategy-Pattern, nur statisch gebunden. Wie beim Strategy müssen die Variationspunkte der Klasse im Voraus durch entsprechende Template-Parameter festgelegt sein.

JanPM
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 105
Registriert: 20. Mär 2009 14:25
Wohnort: Darmstadt

Re: Offtopic: Policy Based Class Design

Beitrag von JanPM »

Ich kenn mich mit Templates net aus, aber im Agile Software Development Buch auf S. 134 steht dass man die Typen nicht mehr zur Laufzeit ändern kann. Und wenn man im Template andere Typen mit den entsprechenden Interfaces benutzen will muss man rekompilieren. Das ist dann halt nicht mehr so dynamisch.

CallForSanity
Windoof-User
Windoof-User
Beiträge: 27
Registriert: 17. Okt 2007 20:45

Re: Offtopic: Policy Based Class Design

Beitrag von CallForSanity »

Richtig, es ist im Prinzip so wie das Strategy-Pattern ohne Dependency Injection und der Nachteil ist, dass es sehr statisch ist.
Da man in C++ allerdings so gut wie alles ständig neu kompilieren muss, ist das meist kaum bemerkbar.
Man benutzt ja mittlerweile deswegen in Unternehmen Build-Systeme (z.B. Incredi Build), welche die Last auf die Rechner im Netzwerk verteilen.

In der Praxis hat sich Policy Based Class Design jedenfalls sehr gut geschlagen, da man einfach deutlich weniger Code für Hilfsklassen, etc. schreibt
und deshalb auch weniger Fehler macht. Ist auf jeden Fall eine sehr mächtige Sache.

Das Hauptproblem ist meiner Meinung nach das Debuggen, da bei vielen Templates extrem komplexe Typen zustandekommen,
und man mit den üblichen Debuggern schnell den Überblick verliert.

JanPM
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 105
Registriert: 20. Mär 2009 14:25
Wohnort: Darmstadt

Re: Offtopic: Policy Based Class Design

Beitrag von JanPM »

Da man in C++ allerdings so gut wie alles ständig neu kompilieren muss, ist das meist kaum bemerkbar.
Wann muss man in C++ eigentlich neu kompilieren falls sich in anderen Klassen was geändert hat? Also in Java muss man nur neu kompilieren wenn sich was am Interface geändert hat das man benutzt. Ich hab jetzt aber schon öfters gelesen dass sich Änderungen auf Clients auswirken, wobei sich die Methoden die der Client benutzt garnicht ändern. Z.B. bei Polluted Interfaces:

Klasse Door implementiert das Interface TimerClient. Wenn sich zb ein RückgabeTYP einer Methode in TimerClient ändert, muss natürlich Door geändert werden. Aber ein Client von Door benutzt vllt nur openDoor(). In Java scheint das keine Änderung zu verursachen (macht auch Sinn in bezug auf dispatch Tables und so im Speicher). Muss in C++ der Client trotzdem rekompiliert werden? Und sehe ich das richtig mit Java?

EDIT:

Bisschen arg offtopic so kurz vor der Klausur, aber wer das auch nicht gewusst hat, hier was von StackOverflow:
http://stackoverflow.com/questions/4033 ... s-required und
http://stackoverflow.com/questions/4012 ... le-the-exe

Antworten

Zurück zu „Archiv“