Dynamic Flow Design

65 views
Skip to first unread message

Denis

unread,
Oct 17, 2011, 6:25:44 PM10/17/11
to Event based Components
Ich habe gerade Ralfs Artikel "Aus eins mach zwei" in der dotnepro
10/2011 gelesen. Insbesondere seine Antwort zu dynamischen Aspekten
von FD hat mir interessiert, da ich bei verschiedenen Versuchen, mit
FD/EBC einen dynamischen Aspekt aus meiner Problem-Domäne zu
modellieren immer wieder an Grenzen gestoßen bin. Meine Problemdomäne
umfasst vor allem Lösungen in Form von Funktionsbibliotheken, die
meistens dynamischer in Ihrer Benutzung sind als Applikationen.

Ralfs Antwort auf die im Artikel gestellte Frage hat mich leider nicht
befriedigt. Was ich ihm hier natürlich nicht vorwerfen will! Im
Gegenteil, ich möchte aufzeigen, dass es noch einen anderen dynamische
Aspekt gibt, als den von Ralf diskutierten.

Das von Ralf diskutierte Szenario beinhaltet die dynamische
Konfiguration von Funktionseinheiten. Hier ist der Datenfluss in und
aus der FE immer gleich, die grundlegende Funktion der FE ändert sich
jedoch. Als Beispiel hatte Ralf eine Persistenzadapter diskutiert, der
zur Laufzeit seine Funktionalität aus verschiedenen Instanzen zur
Daten-Persistierung bezieht - einer zur lokalen Datenspeicherung, ein
anderer zur Datenspeicherung über einen Web-Service. Auf der
Abstraktionsebene des Persistenzadapters ist die Möglichkeit einer
unterschiedlichen Implementierung desselben im Modell nur durch die
dynamische Konfiguration sichtbar. Das Modell skaliert im Endeffekt
über die unterschiedliche Funktionalität der Instanzen des
Persistenzadapters.

Ich sehe noch einen anderen Aspekt im Zusammenhang mit dynamischer
Benutzung von Funktionseinheiten. Dies lässt sich generell mit der
Realsierung von Multiplexer-Funktionalität in Verbindung bringen.
Beispiel: Eine Socketverbindung als Datensenke, jedoch mehrere
Quellen, die konkurrierend Daten über diese Socketverbindung senden
wollen. Die Daten der verschiednen Quellen werden von einer
entsprechenden Komponente, die im Zentrum der Design-Bemühungen steht,
nach einem vorgegebenen Protokoll zu einem Datenstrom für die Socket
verwoben.

Stellt euch jetzt vor die Anzahl der Quellen ist potentiell unendlich
(also nur durch die Ressourcen begrenzt), die Quellen sind jedoch
ähnlich, erfüllen also das gleiche Interface. Natürlich will man dies
auch im Flow-Design-Modell ausdrücken können, was natürlich nicht
geht, da man ja kein unendliches Modell aufzeichnen kann.
Ein analoges Problem hat man bei der Definition von formalen Sprachen.
Dort benutzt man endliche Grammatiken, um unendliche Sprachen zu
beschreiben, indem rekursive Ableitungen spezifiziert werden. In
unserem Fall wäre das FD-Diagramm die Grammatik; eine laufende Instanz
der Realisierung des FD-Diagramms wäre die die Sprache. Die Analogie
ist nicht von ungefähr gewählt, man kann wirklich eine (homomorphe)
Abbildung von FD-Diagramm und durch sie beschrieben FD-Laufzeit-
Instanz auf Grammatiken und die durch sie aufgespannte formale
Sprachen vornehmen. In Sinne von Grammatiken und formalen Sprachen ist
Ralf's Runtime nichts anderes als ein Interpreter für FD-
Diagramme. :-)

Ihr seht schon, ich kommen fachlich aus der Ecke der formalen
Sprachen...
Da der Aspekt der Unendlichkeit bei den formalen Sprachen (und nur
unendliche formalen Sprachen, zu den alle Turing-mächtigen
Programmiersprachen gehören, sind wirklich interessant!) so immens
wichtig ist, weil er sie ausdrucksmächtig macht, fühle :-) ich, dass
er bei FD nicht unberücksichtigt bleiben sollte. Es sollte als ein FD-
Element und entsprechende Semantik dahinter geben, welches in FD-
Diagrammen diesen unendlichen Aspekt ausdrücken und repräsentieren
kann.

Ein Multiplexer mit einer Abbildung von N:1 ist ja noch recht einfach
zu realsieren. Richtig interessant wird es erst, wenn man auch den
Rückweg als Datenfluss betrachten muss: Es wird ein Datenstrom aus
einer Socket gelesen und entsprechend einem vorgegebenen Protokoll in
Datenpaket unterteilt, die an verschiedene FE's als Datensenken
ausgeliefert werden sollen. Die FEs implementieren alle das gleiche
Interface. Welches Datenpaket an welche Senke gesendet werden soll,
ist im Datenpaket kodiert, das ist Domänen-spezifisch; nicht jedoch
die Auslieferungs-Infrastruktur an die jeweilige FE. Dafür wird ein
Demultiplexer benötigt, der die Datenpakete anhand der Senken-Kennung
an die zugehörige FE sendet.

Ich sehe für den Multiplexer zwei Anforderungen:
1. Man muss FEs an- und abmelden können; möglicherweise ist eine
eindeutiger Identifikation von FEs notwendig
2. Multiplexer sollten inhärent threadsicher sein, da die
verschiedenen FEs ja potentiell konkurrierend Daten senden könnten;
dies impliziert aus meiner Sicht eine Art Input-Queue (a la Actor in
Scala) für Datenfluss-Pakete

Für Demultiplexer sind die Anforderungen ähnlich bzw. komplementär:
1. Man muss FEs an- und abmelden können; FE's müssen eindeutig
identifizierbar sein
2. Demultiplexer sollten inhärent asynchron bzgl. der Auslieferung von
Datenpaketen an FEs sein, um die paralle Verarbeitung der Datenpakete
in den verschiedenen FEs zu ermöglichen und um vor allem ein
Blockieren des Demultiplexers zu vermeiden.

Bei den beiden letzten Punkten bin ich mir nicht sicher, ob man diese
nicht abschwächen und in einer separaten FE ud optional realsieren
sollte. Ich könnte mich hier zu sehr von meinen spezifischen Domänen-
Anforderungen leiten lassen. Generell denke ich aber, dass wir für das
Konzept der Aktoren (wie in Scala implementiert und hier [http://
lamp.epfl.ch/%7Ephaller/doc/haller07coord.pdf] beschrieben) prüfen
sollten, inwieweit es wert ist in FD Eingang zu finden und Aktoren als
FD-Design-Elemente verfügbar zu machen. In meinem Verständnis wären
threadsichere Multiplexer und asynchrone Demultiplexer von Ihrem Wesen
her Aktoren im Sinne von Scala und obigen Konzeptpapiers.

Denis

Ralf Westphal

unread,
Oct 19, 2011, 5:08:36 PM10/19/11
to event-based...@googlegroups.com
leider weiß ich nicht genau, was du forderst/kritisierst.

zweierlei greife ich aber mal auf:

(de)multiplexer: wenn du sie brauchst, bau sie dir. ist doch kein problem. sind funktionseinheiten wie andere auch. dazu muss FD nicht erweitert werden.

falls senken von multiplexern dynamisch erzeugt werden müssen, dann ist das doch auch kein problem. ich habe einen lösungsansatz im artikel beschrieben.

ganz allgemein möchte ich aber sagen: versuche deine problem konkreter zu beschreiben. vom konkreten zum allgemeinen. du kommst sehr aus der theorie (motto: "was könnte noch alles nützlich sein"), hab ich den eindruck. daraus folgen dann leider oft overengineered solutions. also: nenne ein konkretes problem und wir suchen eine lösung mit FD.

außerdem musst du FD und übersetzung (z.b. EBC) trennen. wenn du über actors redest, willst du dann etwas an FD ändern oder eine übersetzung finden, die wie actors funktioniert?

in FD kann man funktionseinheiten ja leicht kennzeichnen, die auf einem eigenen thread laufen.
das hat dann aber noch nichts mit einer implementation zu tun.
wie du die übersetzt... ist deine sache.

ich arbeite derzeit im rahmen einer FD runtime daran, damit quasi automatisch umzugehen. da kannst du "mit einem knopfdruck" alle operationen in einem flow zu sequenziell arbeitenden actors machen.

-ralf

--
Ralf Westphal - One Man Think Tank
Hans-Henny-Jahnn-Weg 44
D-22085 Hamburg
Germany
Tel 0170-3200458
Email in...@ralfw.de

Denis

unread,
Nov 3, 2011, 3:16:12 AM11/3/11
to Event based Components
Ich finde den Ansatz "Flow Design" wirklich revolutionär. Und ich
denke, der Begriff "revolutionär" ist nicht zu hoch gegriffen! Gerade
deswegen liegt mir viel daran, mein Problem, dass sich mir beim
Designen (beim Implementieren war ich eben noch nicht) in den Weg
gestellt hat, zu lösen. Aber ich denke, es ist ein
Modellierungsproblem, kein Implementierungsproblem.

Ich versuche mal mit Hilfe zweier FD-Diagramme konkreter zu werden.

Einen Multiplexer mit einer zur Compile-Zeit festen Anzahl von Eingang-
Pins aufzuzeichnen, an denen eine feste Zahl von Funktionseinheiten
hängt, ist sicher keine Problem. Nachfolgend eine entsprechendes
Diagramm.
http://www.flickr.com/photos/69367457@N03/6307301356/in/photostream/

Mein Problem ergibt sich daraus, dass zur Compile-Zeit die Anzahl der
Eingang-Pins nicht bekannt ist. Deren Anzahl ist dynamisch zur
Laufzeit. Informell würde ich das in einem Flow-Design-Diagramm wie
folgt aufzeichen:
http://www.flickr.com/photos/69367457@N03/6306779545/in/photostream/

Dies Diagramm folgt (nach bestem Wissen) der durch Ralf unter
http://geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/flow-design-cheat-sheet-ndash-part-i-notation.aspx
vorgeschlagenen Notation - bis auf die drei untereinanderstehenden
Punkte... Um die geht es mir gerade.

Was will ich mit den drei Punkten ausdrücken? Na, dass dieses Diagramm
eigentlich ein potentiell unendliches Diagramm ist. Ich kann alle
möglichen Ausprägungen dieses Design nicht aufzeichnen, weil man eben
kein unendliches Diagramm zeichnen kann. Die drei Punkte im Diagramm
erlösen mich von der Notwendigkeit ein unendliches Diagramm zu
zeichnen, sie implizieren die Dynamik des Designs. Aber, sie sind
nicht formalisiert, sie haben keine konkrete Implementierungssemantik,
sie sind nur intuitiv verständlich. An Deiner Darstellung der Notation
im obigen Link, Ralf, fand ich gerade sehr gut, dass Du die Notation
im zweiten Artikel (http://geekswithblogs.net/theArchitectsNapkin/
archive/2011/03/20/flow-design-cheat-sheet-ndash-part-ii-
translation.aspx) durch eine Semantik verschiedener
Implementierungsmöglichkeiten konkretisiert und damit festgelegt
hattest.

Ich kann hier noch keine Lösung für dieses Problem vorschlagen und
wollte mir auch erst mal klarwerden, ob andere dieses Problem auch
sehen und ich nicht möglicherweise völlig falsch liege.

Denis
> Email i...@ralfw.de

Olaf Krumnow

unread,
Nov 3, 2011, 3:22:00 AM11/3/11
to event-based...@googlegroups.com

Hallo Denis,

mir ist noch nicht ganz klar, wie der Multiplexer dann etwas unterschiedliches mit den dynamisch generierten Eingangspins anstellen soll. Für mich sieht es eher so aus, als wenn Deine verschiedenen Eingangspins eigentlich Ausgänge verschiedener Funktionseinheiten sind, die alle an denselben Eingang des Multiplexers gehören, zumal die Signatur des Pins immer gleich ist. Aber vielleicht habe ich Deine Problemstellung auch noch nicht ganz durchdrungen...

Gruß
Olaf

 

----- Ursprüngliche Nachricht -----

Von: Denis

Gesendet: 03.11.11 08:16 Uhr

An: Event based Components

Betreff: Re: Dynamic Flow Design

Ralf Westphal

unread,
Nov 3, 2011, 4:45:17 AM11/3/11
to event-based...@googlegroups.com
grad hatte ich schon eine längere antwort geschrieben - aber nun fällt mir eine ganz einfache lösung auf:

du hast gar kein problem :-) das szenario, das du gemalt hast, gibt es nicht.
dieses szenario:


ist dasselbe wie dieses:


wenn der multiplexer nichts tut außer multiplexen (d.h. n eingänge auf 1 umlegen), dann ist er bei FD sogar überflüssig:


wenn der multiplexer aber eigene funktionalität hat (z.b. filtert), dann ist es etwas anderes. dann muss er drin bleiben. das sieht aber so aus:


dann finde ich deine notation völlig ok. der maßstab ist: versteht man sie. und das tut man, denke ich. sie ist intuitiv.

allerdings hat FD den anspruch der eindeutigen übersetzbarkeit. was wird daraus also im quellcode?
woher kommen die beliebig vielen quellen zur laufzeit?

das musst du entscheiden. vielleicht ist EBC da nicht so der hit.

Message has been deleted

chrkon

unread,
Nov 3, 2011, 11:01:21 PM11/3/11
to Event based Components
Hallo Ralf,

ich glaube Denis hat eher ein Problem auf der De-Multiplexer Seite. Er
will die ankommenden Daten Tupel (Zieladresse, String) auf die
verschiedenen Senken verteilen.

Er schreibt:
> Welches Datenpaket an welche Senke gesendet werden soll,
> ist im Datenpaket kodiert, das ist Domänen-spezifisch; nicht jedoch
> die Auslieferungs-Infrastruktur an die jeweilige FE. Dafür wird ein
> Demultiplexer benötigt, der die Datenpakete anhand der
> Senken-Kennung an die zugehörige FE sendet.

Ich stelle mir seine Anordnung so vor:
https://cacoo.com/diagrams/4lRNvcI01dEywwSr

Das "Problem" ist, dass zur Compile Zeit die Anzahl noch nicht
bekannt ist. Aber wenn man den Senken eine Eingangsprüfung
verpasst, dann kann man sich den De-Multiplexer komplett sparen.

Dann können alle parallel an den einen Ausgang des Empfängers
angehängt werden und jeder verarbeitet nur die Nachricht mit der
richtigen Zieladresse.

https://cacoo.com/diagrams/1gSenTnMgm4MwVKP

Das ist eine Abwandlung des Patterns "Zuständigkeitskette".

Dieser Ansatz gefällt mir gut, da damit nur die Senke Ihre Adresse
kennen muss. Eine Konsequenz wäre aber, dass die Domänen-
Logik sich auf die Senken verteilt. Das heißt es gäbe keinen
zentralen Verwalter für den Datenstrom.

Ob das ein Nachteil ist?
Ich glaube nicht. Das System wäre dadurch leichter zu erweitern.

Viele Grüße,
Christof

Ralf Westphal

unread,
Nov 4, 2011, 2:46:33 AM11/4/11
to event-based...@googlegroups.com
ich finde das alles sehr abstrakt.
wir sollten daher über eine konkreten, realen anwendungsfall sprechen.
der enthält eine interaktion, die einen fluss triggert.
und der nennt die variablen funktionseinheiten und wann die feststehen.
ich kann nämlich nicht glauben, dass die erst zur laufzeit entstehen.

--
Ralf Westphal
www.ralfw.de

Mike Bild

unread,
Nov 4, 2011, 3:16:10 AM11/4/11
to Event based Components
Hallo,

ganz pragmatisch finde ich Christofs Ansatz hinreichend gut
beschrieben. Der Empfänger entscheidet über eine Zustellung.

class Program
{
static void Main(string[] args)
{
var bus = new Bus();
var t1 = new MySink1();
var t2 = new MySink2();
bus.Subscribe(t1);
bus.Subscribe(t2);

bus.Send(new MyMessage());
bus.Send(new MyMessage() { Reason = "OK"});
}
}

public class Bus
{
readonly Subject<object> _subject = new Subject<object>();
public void Subscribe<T>(ISink<T> target)
{
_subject
.OfType<T>()
.Where(target.Filter)
.Subscribe(target.OnSink);
}
public void Send<T>(T value)
{
_subject.OnNext(value);
}
}

public interface ISink<in T>
{
bool Filter(T value);
void OnSink(T value);
}

public class MySink1 : ISink<MyMessage>
{
public bool Filter(MyMessage value)
{
return String.IsNullOrEmpty(value.Reason);
}

public void OnSink(MyMessage value)
{
//Do it
}
}

public class MySink2 : ISink<MyMessage>
{
public bool Filter(MyMessage value)
{
return value.Reason == "OK";
}

public void OnSink(MyMessage value)
{
//Do it
}
}

public class MyMessage
{
public string Reason { get; set; }
}


Cheers,
Mike

Ralf Westphal

unread,
Nov 4, 2011, 3:43:44 AM11/4/11
to event-based...@googlegroups.com
für mich ist nicht die technik das problem hier.

ob ein bus source und sink verbindet oder das direkt geschieht... das ist eine frage des geschmacks. wenn das problem der variabilität nur an einem punkt auftritt, empfinde ich einen bus als kanone für einen spatzen.

mich interessiert der grund für die variabilität. und wann löst sie sich auf? wann ist bekannt, wieviele sources und/oder sinks es gibt? davon für mich mehr ab. gibt es überhaupt ein variabilitätsproblem? wirklich?

wenn zum programmstartzeitpunkt die sources/sinks bekannt sind, gibt es nämlich keines. dann wird verdrahtet und gut ist.

wenn aber zur laufzeit sources/sinks dazu kommen oder weggehen, dann ist das was anderes. dann muss das im modell sichtbar sein. das ist dann sozusagen eine meta-ebene, die die struktur des flows zur laufzeit verändert. aber dafür muss das szenario konkreter werden.

Mike Bild

unread,
Nov 4, 2011, 4:54:41 AM11/4/11
to Event based Components
Hallo,

ohne Frage. Das ist meine Übersetzung des Wunsches, muss so natürlich
nicht gemacht werden.

Das modellieren von dynamischen Systemen ist schon spannend - nur ist
das wirklich nötig? Es könnte sonst so

http://en.wikipedia.org/wiki/System_dynamics

aussehen ;-).

Cheers, Mike



On 4 Nov., 08:43, Ralf Westphal <ra...@ralfw.de> wrote:
> für mich ist nicht die technik das problem hier.
>
> ob ein bus source und sink verbindet oder das direkt geschieht... das ist
> eine frage des geschmacks. wenn das problem der variabilität nur an einem
> punkt auftritt, empfinde ich einen bus als kanone für einen spatzen.
>
> mich interessiert der grund für die variabilität. und wann löst sie sich
> auf? wann ist bekannt, wieviele sources und/oder sinks es gibt? davon für
> mich mehr ab. gibt es überhaupt ein variabilitätsproblem? wirklich?
>
> wenn zum programmstartzeitpunkt die sources/sinks bekannt sind, gibt es
> nämlich keines. dann wird verdrahtet und gut ist.
>
> wenn aber zur laufzeit sources/sinks dazu kommen oder weggehen, dann ist
> das was anderes. dann muss das im modell sichtbar sein. das ist dann
> sozusagen eine meta-ebene, die die struktur des flows zur laufzeit
> verändert. aber dafür muss das szenario konkreter werden.
>
> Email i...@ralfw.de

chrkon

unread,
Nov 5, 2011, 1:59:47 AM11/5/11
to Event based Components
Hallo Ralf,
ich kann verstehen, dass Du lieber mit einem praktischen Beispiel
arbeitest. Ich habe mir einen Anwendungsfall überlegt. Er ist zwar
konstruiert und fiktiv, aber man könnte sich solch eine Anforderung
schon vorstellen.

Kontext der Aufgabe:
An einer Industrieanlage müssen kontinuierlich an verschiedenen
Stellen die Umgebungsparameter (Temperatur, Druck, Gaskonzentratonen
oder ähnliches) gemessen werden. Im Falle einer Störung / eines
Unfalls in der Anlage kann es sein, dass bestimmte Bereiche durch
zusätzliche Sensoren engmaschiger überwacht werden müssen. Dazu müssen
zusätzliche Sensoren angeschlossen werden.

Beim Anschließen eines Sensors wird in der Software jeweils eine
Funktionseinheit für Sender und Emfänger erzeugt, die beide genau
diesem Sensor zugeordnet sind. Dies geht nur dynamisch, weil die
Anzahl und Art der Sensoren im Vorfeld nicht bekannt sind und von der
Art der Störung abhängen.

Die Frage ist, ob man solch eine Anforderung überhaupt im Flow Design
darstellen kann bzw, ob man das überhaupt darstellen muss. Würde es
nicht reichen, diese Funktionseinheiten als variabel in der Anzahl zu
beschreiben? Die Konfiguration des Systems ändert sich zwar, aber die
eigentliche Aufgabe der Funktionseinheiten ändert sich doch nicht.

Viele Grüße,
Christof


On 4 Nov., 08:43, Ralf Westphal <ra...@ralfw.de> wrote:

Stefan Lieser

unread,
Nov 5, 2011, 3:20:31 AM11/5/11
to event-based...@googlegroups.com
Moin,

mal so ganz platt gefragt: ändert sich irgendeines deiner Programme dynamisch in der Struktur, weil der Benutzer eine weitere Datei öffnet? Sind die Sensoren mit ihren Datenströmen nicht eher Daten die fließen, als Funktionseinheiten?

Viele Grüße
Stefan Lieser

Ralf Westphal

unread,
Nov 5, 2011, 8:48:12 AM11/5/11
to event-based...@googlegroups.com
Ah, danke für die Konkretisierung. Jetzt sieht das alles anders aus - und wird ganz einfach :-)

Erste Beobachtung: Es handelt sich um ein verteiltes System. Die Auswertung und die Sensoren sind unabhängige Betriebssystemprozesse (oder gar Geräte).

Zweite Beobachtung: Die Architektur hängt davon ab, ob die Sensoren ein zentrales System kennen können (Push) oder ob das System die Sensoren kennen soll (Pull).

Bei Push würden die Sensoren ihren Status bei Bedarf melden. Bei Pull würde das System die Sensoren periodisch per Polling abfragen.

Tja... wie denn nun? :-) Wenn die Sensoren kommen und gehen können, dann wäre es doof, wenn das Auswertungssystem immer wieder daran angepasst werden müsste. Ich bin deshalb für eine Push-Architektur:

Es gibt einen Server als well-known endpoint. Den kennen alle Sensoren. Die Sensoren hängen alle in einem (W)LAN und melden ihre Daten, wann immer sie mögen, an den Server.

Wenn wir mal von einem möglichen Lastproblem absehen, dann ist diese Architektur sehr flexibel. Es können beliebig viele Sensoren vorhanden sein. Die können heute auf- und morgen abgebaut werden. Egal. Wenn sie im Netzwerk hängen, melden sie einfach munter an den Server. Im Flow-Design macht das keinen Unterschied. Hier erstmal ein Softwarezellendiagramm dafür, das big picture:


Die Sensoren sind abhängig von der Auswertung. Die Abhängigkeit besteht in der Kenntnis eines well-known endpoint, an den die Sensoren z.B. Daten mit TCP schicken.

Aus 1+n Softwarezellen folgt, dass es 1+n Modelle gibt: für jede Softwarezelle eines.

Das Modell für die Auswertung kann so aussehen:


Und das Modell für die Sensoren ist auch trivial:


Irgendwoher kommen die Sensordaten und werden versandt. Fertig.

Das Problem mit einer unbekannten Zahl von Sensor-Funktionseinheiten ist keines, das Flow-Design betrifft. Wie Stefan so sagte: die vielen Sensoren stecken in den Daten. Die sehen vielleicht so aus:

class Messwert
{
    string SensorId;
    string SensorTyp;
    double Wert;
}

Darüber kann dann eine Auswertung selektieren und filtern und verteilen an unterschiedliche Berechnungen oder Views.

chrkon

unread,
Nov 5, 2011, 4:09:17 PM11/5/11
to Event based Components
Ralf schreibt:

> Das Problem mit einer unbekannten Zahl von Sensor-Funktionseinheiten ist
> keines, das Flow-Design betrifft. Wie Stefan so sagte: die vielen Sensoren
> stecken in den Daten. Die sehen vielleicht so aus:
>
> class Messwert
> {
>     string SensorId;
>     string SensorTyp;
>     double Wert;
> }

Ja, genau so stelle ich mir die Daten vom Sensor vor. Meine Idee war,
dass jeder Sensor eine eigene Funktionseinheit bekommt, die genau auf
den Sensor abgestimmt ist.

> Darüber kann dann eine Auswertung selektieren und filtern und verteilen an
> unterschiedliche Berechnungen oder Views.

In meinem Ansatz gibt es keine seperate Funktionseinheit, die die
Daten verteilt, sondern alle Auswertungseinheiten bekommen alle Daten
und prüfen an Hand der Daten "SensorTyp" und "SensorID", ob sie
Zuständig sind. Nur die passenden Einheiten verarbeiten dann die Daten
und geben sie an den Ausgang weiter.

Dadurch würde sich aber die FlowStruktur ändern, weil beim
"Anstöpseln" des Sensors die spezialisierte Auswerteeinheit in den
Flow eingehängt werden muss.

Ob das wirklich eine ideale Architektur wäre lasse ich mal offen. So
ganz glücklich bin ich mit meinem Ansatz nicht. Aber es war ja ein auf
die Frage von Denis konstruiertes Beispiel.

@Denis: habe ich damit deine Idee "getroffen"?

Viele Grüße,
Christof

Ralf Westphal

unread,
Nov 5, 2011, 4:15:20 PM11/5/11
to event-based...@googlegroups.com
Am 5. November 2011 21:09 schrieb chrkon <konstant...@glm-laser.com>
 

Dadurch würde sich aber die FlowStruktur ändern, weil beim
"Anstöpseln" des Sensors die spezialisierte Auswerteeinheit in den
Flow eingehängt werden muss.

Nein, natürlich nicht. Der Flow steht von vornherein fest.
Es kommen nur nicht für alle Sensorauswerter Daten an, solange keine passenden Sensoren installiert sind.
Welche Sensoren bzw. Sensortypen (für mehr würde ich keine Auswerter vorsehen) es Auswerter maximal geben muss, ist ja von vornherein klar.

chrkon

unread,
Nov 5, 2011, 4:32:06 PM11/5/11
to Event based Components
Hallo Ralf,

genau diese Aussage sehe ich anders.Wenn alle Sensoren im Vorfeld
bekannt wären, hättest Du recht.

> Welche Sensoren bzw. Sensortypen (für mehr würde ich keine Auswerter
> vorsehen) es Auswerter maximal geben muss, ist ja von vornherein klar.

Aber es ist nicht(!) von Anfang an klar, welche Sensoren zum Einsatz
kommen.

Genau wie Du würde ich daher erstmal nur für die zur Zeit benötigten
Sensoren Auswerteeinheiten vorsehen. Aber man könnte jederzeit neue
Sensoren mit spezifischen Auswertern hinzufügen.


Viele Grüße,
Christof

Ralf Westphal

unread,
Nov 5, 2011, 5:01:09 PM11/5/11
to event-based...@googlegroups.com
genau diese Aussage sehe ich anders.Wenn alle Sensoren im Vorfeld
bekannt wären, hättest Du recht.


sensorTYPEN, nicht sensortypinstanzen.
die typen werden sich nur sehr selten ändern.

 
> Welche Sensoren bzw. Sensortypen (für mehr würde ich keine Auswerter
> vorsehen) es Auswerter maximal geben muss, ist ja von vornherein klar.

Aber es ist nicht(!) von Anfang an klar, welche Sensoren zum Einsatz
kommen.

Genau wie Du würde ich daher erstmal nur für die zur Zeit benötigten
Sensoren Auswerteeinheiten vorsehen. Aber man könnte jederzeit neue
Sensoren mit spezifischen Auswertern hinzufügen.


Viele Grüße,
Christof

Denis

unread,
Nov 5, 2011, 7:31:24 PM11/5/11
to Event based Components


Erst mal Danke für die rege Beteiligung!

Ich stimme Ralf zu, dass es hier erst mal nicht um die Technik geht.
Es geht wirklich darum, dass zum Programmstartzeitpunkt die Anzahl der
Quellen nicht bekannt ist.

Ich hatte versucht mein Problem möglichst auf sein Wesen zu
abstrahieren und somit zu fokusieren. Aber da ist wohl zu wenig
Vertrauen auf Eurer Seite da, dass ich das richtig mache. ;-)
Also versuche ich meine Problemstellung konkreter zu beschreiben.

Wie schon in meinem ersten posting geschrieben hatte, ist mir die
Architektur weitestgehend vorgegeben. Eine Applikation instanziiert
Objekte, die eine durch einen Standard vordefinierte Schnittstelle
implementieren. Die Anzahl der Objekte ist durch die Business-Logik
der Applikation vorgegeben. Die Objekte sind Instanzen von Klassen,
die durch eine Bibliothek bereitgestellt werden und somit von
beliebigen Applikationen benutzt werden können. Damit ist prinzipiell
erst zur Laufzeit bekannt, wieviele Objekte instanziiert werden. Meine
Aufgabe ist es, die Methodenaufrufe auf diesen Objekten in Nachrichten
umzuwandeln und über eine! Socketverbindung an einen Server zu
versenden, der diese auswertet und auch antwortet. Die instanziierten
Objekte können prinzipiell in verschiedenen Threads laufen. Da nur
eine Socket-Verbindung da ist, müssen die aus den Aufrufen
resultierenden Nachrichten sequentialisiert werden.

Informell würde ich das folgendermaßen in einem FD-Diagramm darstellen
ohne dass der Server berücksichtigt ist:
http://www.flickr.com/photos/69531831@N08/6316576058/


Aus den Schnittstellenobjekten fliessen also Methodennamen und
Argumente heraus und in eine Funktionseinheit, die aus diesen
entsprechend einem Protokoll eine Nachricht formt. Diese leitet die
erstellte Nachricht komplettiert mit einer eindeutigen Id für das
Objekt (diese wird der FE als Konfigurationswert übergeben, deswegen
das "(C)") an eine FE weiter, die die Nachrichten sequentialsiert und
dann über eine Socket versendet. Die Rückmeldung des Servers lasse ich
zur Vereinfachung erst mal weg.

Das Diagramm ist, denke ich, erst mal intuitiv verständlich. Aber
durch die drei Punkte ist es nur informell und deshalb ausserhalb
Ralfs Notation, denn die Semantik der drei Punkte ist nicht definiert.

Denis

Sent from Samsung tablet
> Email i...@ralfw.de

Ralf Westphal

unread,
Nov 6, 2011, 4:00:16 AM11/6/11
to event-based...@googlegroups.com
Am 6. November 2011 00:31 schrieb Denis <kun...@grammarcraft.de>:
Wie schon in meinem ersten posting geschrieben hatte, ist mir die
Architektur weitestgehend vorgegeben.

Wenn die Architektur vorgegeben ist, warum unterhalten wir uns über Flow-Design?
Was meinst du also mit Architektur?

 
Eine Applikation instanziiert
Objekte, die eine durch einen Standard vordefinierte Schnittstelle
implementieren. Die Anzahl der Objekte ist durch die Business-Logik
der Applikation vorgegeben. Die Objekte sind Instanzen von Klassen,
die durch eine Bibliothek bereitgestellt werden und somit von
beliebigen Applikationen benutzt werden können. Damit ist prinzipiell
erst zur Laufzeit bekannt, wieviele Objekte instanziiert werden.

Das klingt so wie in absolut jedem Programm. "Eine Anzahl von Objekten wird von der Businesslogik instanziert." Natürlich weiß man meist erst zur Laufzeit, wieviele Objekte es gibt. Auch in Flow-Designs: denn da ist unbekannt, wieviele Nachrichten fließen. Jede Nachricht ein Objekt.

Tut mir leid, ich sehe in deiner Formulierung keine Konkretisierung.

 
Meine
Aufgabe ist es, die Methodenaufrufe auf diesen Objekten in Nachrichten
umzuwandeln und über eine!

Das verstehe ich noch weniger: wo sind denn die Objekte? In deiner Zeichnung sind sie clientseitig. Warum sollten dann Aufrufe in Nachrichten umgewandelt werden, statt einfach Aufrufe zu machen?

 
Socketverbindung an einen Server zu
versenden, der diese auswertet und auch antwortet. Die instanziierten
Objekte können prinzipiell in verschiedenen Threads laufen. Da nur
eine Socket-Verbindung da ist, müssen die aus den Aufrufen
resultierenden Nachrichten sequentialisiert werden.

Naja, das ist der alllllereinfachste Teil. Alle Nachrichten, die per Socket verschickt werden sollen, laufen in eine Warteschlange. Auf der Warteschlange lauscht ein Thread, der die Nachrichten entnimmt und verschickt. Fertig.

 

Informell würde ich das folgendermaßen in einem FD-Diagramm darstellen
ohne dass der Server berücksichtigt ist:
http://www.flickr.com/photos/69531831@N08/6316576058/


Aus den Schnittstellenobjekten fliessen also Methodennamen und
Argumente heraus und in eine Funktionseinheit, die aus diesen
entsprechend einem Protokoll eine Nachricht formt. Diese leitet die
erstellte Nachricht komplettiert mit einer eindeutigen Id für das
Objekt (diese wird der FE als Konfigurationswert übergeben, deswegen
das "(C)") an eine FE weiter, die die Nachrichten sequentialsiert und
dann über eine Socket versendet. Die Rückmeldung des Servers lasse ich
zur Vereinfachung erst mal weg.

Tut mir leid, du beschreibst hier ein technisches IST ohne Zusammenhang - und willst, dass es genau so mit einem konzeptionellen SOLL (Flow-Design) modelliert wird. Das ist aus meiner Sicht Quatsch.

Das technische IST ist uninteressant. Interessant sind die Anforderungen. Die nennst du aber nicht.
Deshalb kann ich nur wiederholen: bitte konkretisiere. Was soll das Ganze? Was tut die ominöse Businesslogik, was tun die omninösen vielen zu instanzierenden Objekte, wenn doch die Aufrufe auf ihnen nur weitergeleitet werden? Ich begreife das nicht.

 

Das Diagramm ist, denke ich, erst mal intuitiv verständlich. Aber
durch die drei Punkte ist es nur informell und deshalb ausserhalb
Ralfs Notation, denn die Semantik der drei Punkte ist nicht definiert.

Das Diagramm beschreibt irgendwas. Aber ob das Hand und Fuß hat oder ein bestimmtes Problem angemessen löst, weiß ich nicht. Weil ich das Problem, das nicht-technische (!), nicht kenne.

Alle Modellierung beginnt bei den Anforderungen. Alle Modellierung beginnt bei Interaktionen eine Umwelt mit dem herzustellenden System. Da du keine Anforderungen einer Problemdomäne nennst, können wir keine Interaktionen ermitteln. Ohne Interaktionen können wir keinen Flow ableiten.

Das Beispiel mit den Sensoren war da schon konkreter. Deshalb konnte ich dazu Flows malen.

Versuch es doch nochmal.
Email in...@ralfw.de

Denis

unread,
Nov 6, 2011, 5:28:25 AM11/6/11
to Event based Components
Ich denke, ich habe eine Lösung für mein Diagramm-Dilemma.

Deine Kriktik, Ralf, an meiner Darstellung kann ich verstehen und sie
ist auch weitgehend berechtigt und sie hängt mit dem Grund meines
Dilemmas zusammen. Auf die Anforderungen gehen ich nächste Woche noch
mal konkreter ein. Hier erst mal die Lösung, die ich mir zurechtgelegt
habe.

Nachdem ich gestern das informelle Diagramm aufgezeichnet und gesendet
hatte, viel mir auf, dass ich die verschiedenen Abstraktionsebenen
mische. Was hat die Applikation auf derselben Ebene wie die
Schnittstellen-Objekte (Obj1, Obj2 …ObjN) zu tun. Und diese wiederum
sollten nicht mit den FE des Flow-Design zusammen gezeichnet werden.
Ich war einfach noch zu stark in der UML-Denke gefangen, wo irgendwie
immer alles ins Diagramm muss, egal welche Abstraktionsebene.

Besser ist es erst mal nur die Architektur mit Hilfe von
Softwarezellen zu beleuchten.
Auf dieser Abstraktionsebene gibt es nur die Applikation und die
Schnittstellen-Objekte, die sie instanziiert.
https://cacoo.com/diagrams/Q2sfMbaWDAQM6uMu
Hier gehören auch die Punkte hin. Das Diagramm ist an sich informell
und bedarf keiner späteren Formalisierung.

Für das Design greife ich mir jetzt exemplarisch eines dieser Objekte
heraus und beschreibe für dieses das Flow-Design:
https://cacoo.com/diagrams/lInnM7GAdrg0ySwh
Man beachte, dass die FE „Coordinate Call Messages and Send (S)“ ein
Singleton ist. Dieselbe Instanz der FE wird in jedem neu
instanziiertem Schnittstellenobjekt X wieder verwendet. Damit ist auch
mein Dilemma gelöst, da jedes Schnittstellenobjekt den Flow neu
instanziiert und überall neue FE’s des Typs „Create Call Msg (C)“
instanziiert werden, die dann Obj X-spezifisch konfiguriert/
initialisiert werden können – das Singleton bleibt aber immer die
gleiche Instanz.

Jetzt muss ich nur noch die Singleton FE so designen, dass sie mit
konkurrierend ankommenden Daten umgehen kann. Aber das ist nur noch
eine Fingerübung… :-)

… Es ist ebend immer wieder fördernd, wenn man anderen was erklären
und es aufschreiben muss, dann ordnet man seine Gedanke stärker und
wird sich seines eigenen Modells im Kopf besser bewusst. Danke auf
jeden Fall schon mal für diese Diskussion!

Wie gesagt, die konkreten Anforderung liefere ich nächste Woche noch
nach, jetzt verlangt die Familie erst mal ihr Recht…

P.S. Das cacoo-Tool ist cool!
P.S.S. Die Abgrenzung von Architektur und Design ist bei mir immer
noch recht vage im Kopf. Ralf, Du hast damals eine Diskussion in
Deinem Blog angestoßen. Bist Du damals zu einer endgültigen Definition
von Design für Dich gekommen?
> Email i...@ralfw.de- Zitierten Text ausblenden -
>
> - Zitierten Text anzeigen -

Denis

unread,
Nov 21, 2011, 5:11:45 PM11/21/11
to Event based Components
Hier also wie versprochen die ausführliche Darstellung der
Anforderungen und des Architektur-Kontextes, auch wenn's etwas länger
gedauert hat.

Im allgemeinen geht es darum einer Applikation den Zugriff auf
Peripheriegeräte über eine Bibliothek bereitzustellen. Die
Schnittstelle dieser Bibliothek ist durch einen Industrie-Standard
(UnifiedPOS - http://en.wikipedia.org/wiki/UnifiedPOS) vorgegeben. Der
Standard definiert verschieden Geräte-Kategorien, die jede ein
abstraktes Modell für eine Peripherie-Geräte-Klasse definiert und
sowohl eine Methoden-Schnittstelle als auch die Semantik des Geräte-
Modells definiert. Der Standard definiert die Methoden-Schnittstelle
sprachunabhängig. Es gibt jedoch drei verschieden Plattformen, die den
Standard jeweils auf Java, .Net und OLE abbilden.
Jeder Geräte-Hersteller, der diesen Standard unterstützen möchte, muss
für sein Gerät einen Geräte-spezifischen Treiber für jede dieser
Plattformen implementieren.
Jede Applikation, die ein Peripherie-Geräte ansteuern möchte, für das
es einen Treiber nach diesem Standard gibt, muss ein
gerätespezifisches Treiber-Objekt instanziieren. Dazu stellt die
Bibliothek ein ebenfalls standardisiertes Konzept ähnlich einer
Factory-Methode bereit.

Wir wollen den Zugriff auf diese Bibliothek remote-fähig machen. Dabei
geht es weniger darum den Zugriff auf die Geräte wirklich im Netz
verfügbar zu machen, als Interoperabilität zwischen den Plattformen zu
realisieren um damit den Aufwand der Implementierung für alle
Plattformen zu vermeiden. Dabei wird der geräte-spezifische Treiber
nur für eine ausgewählte Plattform implementiert. Auf alle anderen
Plattformen wird die Funktionalität über eine Bibliothek
bereitgestellt, die für jede Gräte-Kategorie einen generischen Treiber
bereitstellt, der den Aufruf einer Methode der standardisierten
Schnittstelle quasi als Remote-Procedure-Call an einen Server
weiterleitet, der die eigentlichen funktionalen Treiber der
ausgewählten Plattform geladen hat, und den über's Netzwerk
transportieren Aufruf in einen lokalen Methoden-Aufruf umsetzt. Die
Rückgabeparameter des Methodenaufrufes müssen natürlich auch wieder
zurück transportiert werden.
Diese Architektur habe ich mal im folgenden Software-Holon-Diagramm
versucht darzustellen:
https://cacoo.com/diagrams/Yrox2aGF4eq9OLhh

Dies ist der architekturelle Rahmen, in dem ich mich bewege. Meine
Aufgabe, die ich design-technisch mit FD bewältigen möchte, ist jedoch
beschränkt auf die Entwicklung der Bibliothek auf der
Applikationsseite. Deswegen meinte ich auch in einem meiner Posts,
dass mir die Architektur weitgehend vorgegeben wäre. Eigentlich habe
ich diese Bibliothek für .Net auch bereits implementiert (übrigens dem
Konzept von Space-Based Componentes folgend, das Ralf mal in der
dotmetpro vorgestellt hatte, FD gab es damals noch nicht...). Da ich
diese Problemdomäne aufgrund der bereits vorgenommen Implementierung
recht gut durchdrungen hatte, schien es mir naheliegend daran mal FD
auszuprobieren. In diesem Sinne würde ich auch Design von Architektur
abgrenzen – es ist das Herausarbeiten einer konkreten
Lösungsvorschlags - einer Architektur - aus einem Lösungsraum, durch
das Festlegung oder Auswählen von Anforderungen, die die möglichen
Lösungen bzgl. dieser Anforderungen gewichten. In diesem Sinne würde
ein Design immer eine Architektur umfassen, jedoch zusätzlich zur
konkreten Architektur-Darstellung auch noch die Anforderung und
möglicherweise daraus resultierende Schlussfolgerungen aufzeigen, die
zu dieser konkreten Architektur geführt haben. … aber das ist
eigentlich eine andere Diskussion. :-)

Im Sinne der obigen Architektur versuche ich jetzt noch mal die
applikationsseitige Bibliothek mit Hilfe von FD zu designen und würde
mich natürlich sehr freuen, Eure Meinung darüber zu hören.

In meinem letzten Post, hatte ich ja schon mein Diagramm-Dilemma
gelöst, indem für jedes von der Applikation instanziierte Treiber-
Objekt der Event-Fluss neu instanziiert wird, wobei die FE, die den
TcpClient bedient, in allen instanziierten Event-Flüssen als Singleton
wiederverwendet wird (https://cacoo.com/diagrams/lInnM7GAdrg0ySwh). Im
Kontext der obigen Architektur würde ich das jetzt etwas angepasst und
ausführlicher folgendermaßen darstellen:
https://cacoo.com/diagrams/RW7CXLTZJzhtAaCC

Der oberen Teil stellt die Abstraktion eines Treiber-Objektes dar. Ich
habe mit Absicht keine Verbindungen zwischen dem umschließenden
Treiber-Objekt und der eingebetteten FE eingezeichnet. Damit soll
symbolisiert werden, dass hier ein Wechsel in der
Implementierungstechnologie stattfindet – von objektorientiert, mit
eingehenden Methodenaufrufen als einfließendem Fluss, nach FD mit
Events. Eigentlich ein Implementierungsdetail, aber hier auch
irgendwie wichtig.

Das umschließende Device-Objekt wandelt also ein eingehenden
Methodenaufruf in einen Datenobjekt vom Typ „Request“ um und startet
damit dem Datenfluss hinein in die FE „Send Call Request,
ReceiveAnswer and Receive Device Events“. Die „Device Events“ sind
hier jetzt keine Events im Sinne von EBC sondern asynchrone Events des
Device-Modells, die durch Zustandsänderungen am Hardware-Gerät erzeugt
werden. Dieses Modell-Konzept hatte ich oben noch nicht erwähnt.

Im unteren Teil wird in die oben genannte FE hineingezoomt: Aus dem
einfließende Request-Datenobjekt wird in ein Tupel aus DeviceId und
Nachricht berechnet. Die Nachricht wird entsprechend dem vorgegebenen
Nachrichten-Protokoll als String erzeugt. Bei einem späteren
Protokollwechsel wäre nur diese FE auszutauschen. Das erzeugte Tupel
fließt in die Singleton-FE „Coordinate Call Messages and Send“ ein,
die von jedem instanziierten Fluss in jedem anderen
Treiber-Objekt wiederverwendet wird. Diese FE hat eine Abhängigkeit
zum TcpClient-Objekt, der die Socket-Verbindung realisiert, über die
die Nachricht am Ende asynchron versendet wird.

Die DeviceId wird nach Versendung der Nachricht an die FE „Receive
Messages, Extract DeviceId“ weitergesendet, die diese in einem FIFO
puffert. Diese FE läuft in ihrem eigenen Thread und empfängt
Nachrichten über den TcpClient. Sie ist ebenfalls ein Singleton und
wird von allen instanziierten Flüssen in allen Device-Objekten
wiederverwendet, da ja für alle zusammen nur eine Socket-Verbindung
verwendet werden soll. Die FE analysiert, ob es sich um eine Antwort
auf eine „Call Message“ handelt oder um einen „Device Event“. Im Falle
einer Antwort wird eine DeviceId aus dem FIFO geholt und geprüft, ob
die Antwort dazu korrespondiert, d.h. ob sie die dieselbe DeviceId
enthält. Der Antwort-String wird zusammen mit der DeviceId an die FE
zur Analyse und Aufbereitung der Antwort-Argument weitergeleitet.
Ähnliches passiert für den Device-Event.

Im Falle eines Verbindungsabbruchs, oder einer unpassenden DeviceId
fließt ein Fehler aus der FE.

Wahrscheinlich wird man bei einer Implementierung der beiden
Singletons eventuell dazu kommen, dass sie noch weiter in Unter-FEs
zerlegt werden können – z.B. ist die Extraktion der DeviceId
protokollspezifisch und damit wert in einer eigenen FE realisiert zu
werden, um dann bei einem Protokollwechsel einfacher austauschbar zu
sein. Aber das Ausspezifizieren der FE kann man ja dann nachgelagerten
Arbeitsschritten überlassen. Das ist aus meiner Sicht ja gerade der
Vorteil des FD-Ansatz – einfaches Wechseln der Abstraktionsebene beim
Absteigen in die Implementierung.

Jetzt würde mich natürlich auch interessieren, ob das obige FD-Diagram
auch ohne meine zusätzlichen Ausführungen (abgesehen von der
Architekturbeschreibung, die natürlich unbedingt notwendig ist)
verständlich gewesen wäre. Denn ich stelle mir vor, in der produktiven
Verwendung der FD-Diagramme ohne diese zusätzlichen Erläuterungen
auszukommen. Oder sollten sie immer dabei sein, um alles verstehen zu
können?

Interessant wäre auch zu reflektieren, wie man unterschiedliche
Strategien mit FD realisieren könnte. Also wenn z.B. nicht nur eine
Socket-Verbindung für alle Treiber-Objekte, sondern für jeden Request
eine neue Verbindung aus einem endlichen Socket-Pool verwendet werden
soll...

Denis

On 6 Nov., 11:28, Denis <kun...@grammarcraft.de> wrote:
> Ich denke, ich habe eine Lösung für mein Diagramm-Dilemma.
>
> Deine Kriktik, Ralf, an meiner Darstellung kann ich verstehen und sie
> ist auch weitgehend berechtigt und sie hängt mit dem Grund meines
> Dilemmas zusammen. Auf die Anforderungen gehen ich nächste Woche noch
> mal konkreter ein. Hier erst mal die Lösung, die ich mir zurechtgelegt
> habe.
>
> Nachdem ich gestern das informelle Diagramm aufgezeichnet und gesendet
> hatte, viel mir auf, dass ich die verschiedenen Abstraktionsebenen
> mische. Was hat die Applikation auf derselben Ebene wie die
> Schnittstellen-Objekte (Obj1, Obj2 …ObjN) zu tun. Und diese wiederum
> sollten nicht mit den FE des Flow-Design zusammen gezeichnet werden.
> Ich war einfach noch zu stark in der UML-Denke gefangen, wo irgendwie
> immer alles ins Diagramm muss, egal welche Abstraktionsebene.
>
> Besser ist es erst mal nur die Architektur mit Hilfe von
> Softwarezellen zu beleuchten.
> Auf dieser Abstraktionsebene gibt es nur die Applikation und die

> Schnittstellen-Objekte, die sie instanziiert.https://cacoo.com/diagrams/Q2sfMbaWDAQM6uMu

Ralf Westphal

unread,
Nov 22, 2011, 3:37:46 PM11/22/11
to event-based...@googlegroups.com
danke für deine ausführliche beschreibung. da die technischen rahmenbedingungen mir zumindest dadurch immer noch nicht ganz klar sind, kann ich nicht sagen, ob ich in allen teilen deinem flow-design zustimme. wir sind wohl jenseits dessen, was hier online besprechbar ist.

aber du hast zwei konkrete fragen gestellt:

ist dein design ohne deine erklärungen verständlich? natürlich nicht. es ist mir ja nicht mal mit deinen erklärungen komplett verständlich :-)
aber darum geht es bei FD auch nicht. FD behauptet nicht, dass jede lösung jedem laien verständlich sei. man muss immer die problemdomäne verstehen. mit FD und ohne.
nur mit FD ist es dann leichter, eine lösung zu verstehen. ein walk through kann dann fließen - während er beim üblichen abhängigkeitsverhau springt und sich dann in details verliert.

kann man andere arten der socket verbindungen mit FD unterschiedl visualisieren?
ich bin im zweifel, ob das etwas ist, was in einem modell aufscheinen muss. ob eine funktionseinheit für jede nachricht eine neue socket aufmacht oder immer dieselbe benutzt, kann auch ein implementationsdetail sein. allemal ist das so aus sicht der domäne.

damit sind wir aber bei der interessanten frage nach der domäne oder dem belang. da gibt es nämlich mindestens drei:

1. die "business" domäne
2. eine technische bzw. infrastruktur domäne, mit der du beschäftigt bist
3. die kommunikation

1 ist sozusagen um das herum, was du tust.
3 ist in dem, was du tust.

die frage nach den socket verbindungen betrifft zumindest erstmal nicht 2. deshalb muss man das in deinen diagrammen auch nicht sehen.

wenn du allerdings eine funktionseinheit zur tcp kommunikation aufmachst (eine, von der du heute abhängig bist), dann kannst du darin natürlich auch wieder mit flow design arbeiten. in bezug auf den belang ist dann vielleicht die unterschiedliche verbindungshandhabung interessant und sollte in dem modell dann zu sehen sein.

das mit den belangen ist bei flow-design interessant, find ich:

in bezug auf ein zu realisierendes feature für deine funktionseinheit arbeiten durchaus mehrere belange zusammen, z.b.

business domain feature:
-> persistenz -> logik -> security -> logik -> persistenz ->

dabei mag dann ein belang so kompliziert sein, dass er selbst separat entwickelt wird, so wie du das mit dem infrastrukturzeugs grad machst. dann gibt es dafür ein interface, hinter dem wieder flows stehen können.

persistenz domain feature:
-> logik -> caching -> logik -> API ->

logik bezieht sich hier auf persistenz, oben auf business domain.

für mich sind das dann nicht einfach geschachtelte flows, sondern orthogonale.
orthogonal deshalb, weil die implementation nach außen über eine normale schnittstelle anzusprechen ist. so wie jeder standard API.

in bezug auf die modellierung von persistenz ist caching eine black box. caching ist ein blatt im flow des persistenzfeature. oder persistenz in bezug auf das business. im sinne eines fokus haltens finde ich das sinnvoll. und auch durchaus im sinne einer kapselung, für die interfaces eine gute fassade sind.

Denis

unread,
Nov 25, 2011, 1:13:34 PM11/25/11
to Event based Components
Ja, scheinbar lässt sich nicht immer der gesamte Kontext
transportieren, um hier alles verständlich zu machen.

Das mit der Domäne ist interessant. Meiner Meinung nach ist es immer
relativ, was man als "business domain" sieht.
Wir (bei uns in der Abteilung) beschäftigen uns eigentlich
ausschließlich mit Infrastruktur für Applikation, weil wir eben eine
Infrastruktur-Bibliothek herstellen. Die die Bibliothek benutzenden
Applikationen kennen wir meistens gar nicht. Deswegen würde ich unsere
"business domain" als die technischen Aspekte der Infrastruktur-
Bereitstellung sehen. Neben unsere "business domain" gibt es natürlich
auch in unserer Bibliothek wiederum technische bzw. Infrastruktur-
Belange, aber dann auf einer anderen Abstraktionsebene.

Oft ist es schwierig die technischen/Infrastruktur-Belange von denen
der Business-Domäne zu trennen, gerade wenn man nur in technischen
Bereichen unterwegs ist. Aber eine gute Trennung würde ja gerade ein
gutes Design ausmachen...
Hat man sie erst mal gut getrennt, ist der Ansatz die orthogonale
Belange als in Klassen gekapselte Flüsse zu realisieren durchaus
passend, wie ich finde. So zumindest habe ich Deinen letzten Kommentar
verstanden.

Vielleicht solltest Du der Kapselung von Flüssen in Klassen und damit
deren Integration in klassische OO-Architekturen in einem dotnepro-
Artikel oder in Deinem Buch noch mal etwas Raum einräumen. Das Problem
ist doch, dass die meisten von uns nicht in der Position sind, das
Design einer gesamten Applikation zu bestimmen. Vielmehr sind wir
meistens nur für einen Teil der Applikationsfunktionalität
verantwortlich, im besten Fall durch ein Interface vom Rest der
Applikation entkoppelt. Und nur in diesem Teil können wir dann EBC als
dessen Implementierung und FD als Design-Mittel anwenden. Das würde
doch vielleicht auch mehr Leute animieren, es mal im Kleinen mit FD/
EBC zu versuchen, oder?

Ist diese Implementierung im Kleinen dann erfolgreich, weil qualitativ
besser, besser erweitbar, besser wartbar, evolvierbarer als der Rest
der Implementierung der Gesamt-Applikation, dann könnte dies zusammen
mit den verantwortlichen Entwicklern doch die Keimzelle für die
schrittweise Transformation der klassischen OO-Applikationen in eine
FD-design-te, wartbare, professionelle, EBC-basierte Applikation sein.
Der politische Aspekt des Agierens in größeren Firmenstrukturen ist
hier nicht zu unterschätzen! Das wäre dann sozusagen eine Revolution
von unten. Ich habe schon öfter beobachtet, dass es so funktioniert,
und in manchen Strukturen funktioniert es nur so!

Auf meinen Versuch einer Begriffsbildung für Design und die
Unterscheidung von Architektur und Design ist bis jetzt keiner von
Euch eingegangen. Aber mich würde schon Eure Meinung dazu
interessieren. Ich sehe die Definition des Begriffs Design gerade
wegen der kontroversen Diskussion in Ralfs Blog (http://
ralfw.blogspot.com/2011/07/design-zur-diskussion-gestellt.html) immer
noch als offen an.

Denis

> > (UnifiedPOS -http://en.wikipedia.org/wiki/UnifiedPOS) vorgegeben. Der

> ...
>
> Erfahren Sie mehr »

Ralf Westphal

unread,
Nov 29, 2011, 5:31:22 AM11/29/11
to event-based...@googlegroups.com
Am 25. November 2011 19:13 schrieb Denis <kun...@grammarcraft.de>:
Oft ist es schwierig die technischen/Infrastruktur-Belange von denen
der Business-Domäne zu trennen, gerade wenn man nur in technischen
Bereichen unterwegs ist. Aber eine gute Trennung würde ja gerade ein
gutes Design ausmachen...

Warum ist das schwer? Technisch schwer? Vom Verständnis her schwer? Vom Prozess/der Organisation her schwer?

Ich find das ganz einfach: Man erkennt "Hier Domäne, dort Infrastruktur!" und schon trennt man beides in Klassen oder noch besser Komponenten.



Vielleicht solltest Du der Kapselung von Flüssen in Klassen und damit
deren Integration in klassische OO-Architekturen in einem dotnepro-
Artikel oder in Deinem Buch noch mal etwas Raum einräumen.

Joa, mal schauen. Ist doch aber gar nicht schwer: Wenn du einen Belang hast, dann beschreibst du dessen Funktionalität mit einer Schnittstelle. Das kann sogar eine traditionelle sein.

Und die Methoden der Schnittstelle, die implementierst du mit Flüssen. Ob ein Fluss durch einen Button_Click angestoßen wird oder durch Aufruf einer Interface-Methode, das ist doch egal.

 
Das Problem
ist doch, dass die meisten von uns nicht in der Position sind, das
Design einer gesamten Applikation zu bestimmen. Vielmehr sind wir
meistens nur für einen Teil der Applikationsfunktionalität
verantwortlich, im besten Fall durch ein Interface vom Rest der
Applikation entkoppelt.

Was bedeutet "verantwortlich sein"? Hier scheint mir ein tieferes Problem zu liegen. Wie ist denn das Verständnis von Teamarbeitet in so einem Projekt?

Oder ist es sooo groß, dass da 30 Leute dran sitzen, die natürlich in verschiedene Teams à 5-7 aufgeteilt sind, denen man grobe horizontal geschnittene Bausteine überträgt? Dann frage ich mal danach, wie denn das Verständnis von Architektur ist?

Es kann mal nötig sein, Infrastruktur gezielt zu programmieren. Ok. Das ist dann aber eine besondere Verantwortung. Soweit es geht, würde ich das vermeiden wollen. Und ob es bei euch gerechtfertigt ist, weiß ich nicht. Im Zweifel sag ich mal: Nein.


Auf meinen Versuch einer Begriffsbildung für Design und die
Unterscheidung von Architektur und Design ist bis jetzt keiner von
Euch eingegangen. Aber mich würde schon Eure Meinung dazu
interessieren. Ich sehe die Definition des Begriffs Design gerade
wegen der kontroversen Diskussion in Ralfs Blog (http://
ralfw.blogspot.com/2011/07/design-zur-diskussion-gestellt.html) immer
noch als offen an.

Mach doch nochmal einen Thread auf :-) Ich würd jetzt was dazu sagen.

Denis

unread,
Dec 11, 2011, 10:21:08 AM12/11/11
to Event based Components
>> Oft ist es schwierig die technischen/Infrastruktur-Belange von denen
>> der Business-Domäne zu trennen, ...

> Warum ist das schwer? Technisch schwer? Vom Verständnis her schwer?
> Vom Prozess/der Organisation her schwer?

Es ist von der Abstraktion her schwer. Je näher die Business-Domäne
und Infrastruktur-Domäne liegen, also je technischer die Business-
Domäne, um schwieriger ist die Infrastruktur-Domäne zu abstrahieren.
Meine Erfahrung ist, dass viele Kollegen hier eine Vermischung
vornehmen. Oft trennen die Kollegen beide Belange einfach nicht. Ich
bin mir nicht sicher woran dies liegt, vermute aber eben, dass es
nicht ganz einfach ist, aus oben genannten Gründen.

> Ist doch aber gar nicht schwer: Wenn du einen Belang
> hast, dann beschreibst du dessen Funktionalität mit einer
> Schnittstelle.
> Das kann sogar eine traditionelle sein.

Nein, es ist nicht schwer, wenn man FD dann erst mal verstanden hat.
Ich betrachte das hier dann auch eher aus der Sicht der Propagation
des FD-Ansatzes. Da finde ich es wert, dass dieses Szenario mal in
einem Bespiel betrachtet wird. So in dem Sinne: Seht her, man kann
auch in einer Nicht-FD-designten Appplikation mit einer durch
Interfaces entkoppelten Komponente anfangen und diese mit FD designen
und mit ECB realisieren.

> Was bedeutet "verantwortlich sein"? Hier scheint mir ein tieferes
> Problem zu liegen. Wie ist denn das Verständnis von Teamarbeitet in so einem Projekt?

Ja, hier liegt ein tieferes Problem. Dies ist eher in der
Organsitation der Firma und in den vorhanden Machtstrukturen
begründet. Ick kann nur in der Art agieren, dass ich versuche Kollegen
zu überzeugen. Allerdings habe ich da noch mit ganz anderen,
einfacheren Herausforderungen zu kämpfen, als mit der, die Kollegen
von FD zu überzeugen. Da geht vielmehr erst mal grundlegende
Prinzipien und Methodiken: Regressionstestbarkeit von Code, gemeinsame
Verantwortung für gemeinsamen Code, automatischer Buildprozess, Build-
Artefakt-Repository, Continuous Integration usw.
Das Überzeugen funktioniert auch recht gut, findet aber irgendwie
versteckt vor dem Management statt. Sobald es aber um Veränderungen
geht, die die ganze Abteilung (oder darüber hinaus) betreffen, wie
z.B. die Einführung von Continuous Integration, muss das Managment
involviert werden und viel zu oft wird von diesem dann nur der
initiale Aufwand gesehen, aber nicht die mittel- und langfristigen
Vorteile und Produktivitätssteigerungen. Es mag sein, dass man FD im
Kleinen einführen kann, sozusagen zwischen den Entwickler-Kollegen,
aber sobald es explizit wird, z.B. in Form von Design-Dokumenten, oder
EBC-Realisierungen, dann geht es nicht ohne Involvierung des
Management und spätestens dann braucht man gute Argumente. Am besten
schon Teilkomponenten, die mit FD/EBC umgesetzt wurden, an deren Life-
Cycle und Qualität man die Vorteile erläutern kann.
Dieses produktive Ausprobieren einer neuen Technik kann man nun mal
nur für die Komponenten machen, für die man explizit verantwortlich
ist und dem Management für jede grundlegendere Änderung nicht gleich
Rede und Antwort stehen muss, wobei dann die Gefahr des Abwürgens
besteht!

Es gibt bei uns auch noch einen anderen Aspekt: Ich würde die
Bibliotheksentwickung bei uns nicht als Projekt bezeichnen. Das
impliziert irgenwie eine kurze Laufzeit von unter 2 Jahren. Die
Lebensdauer einer Version einer solchen Bibliothek bei uns ist sehr
lang - mehrere Jahre. Die letzte Version gibt es seit über 7 Jahren.
Sie wird immer weiterentwickelt, indem neue Geräte hinzugefügt werden.
Will man jetzt aber generell etwas ändern, will das gut überlegt sein,
da eben soviel Historie mitgeschleppt wird. Gibt es dann nicht mal
Regressionstest (ich bin seit 4 Jahren dabei, die Kollegen samt Chef
von Unit-Tests zu überzeugen, um eine Basis für Regressionstest zu
haben), dann sind generelle Änderungen nicht so einfach vorzunehmen.
Am Ende wird jede globale Änderung ein Politikum, wo gute Argument
erforderlich sind, bevor das Managment einer solchen Änderung
zustimmt. Bei den Unit-Tests habe ich es damit geschafft, es erst mal
für meinen Verantwortungsbereich einzuführen und hatte damit dann
vorweisbare Ergebnisse und gute Argumente...

Reply all
Reply to author
Forward
0 new messages