5

Ich habe eine Reihe von Klassen zur Darstellung eines gerichteten zyklischen Graphen zur Darstellung von BPM - Prozessen erstellt, basierend auf JUNG 's DirectedSparseGraph Klasse, die nur grundlegende Graphenmanipulationsmethoden zum Hinzufügen und Finden von Scheitelpunkten und Kanten bietet. Die Herausforderung, der ich gegenüberstehe, ist die Erstellung einer builder, die eine fluent interface bietet, die in der Lage ist, ein Diagramm zu erstellen, das komplexe Verzweigungen, Zyklen und mehrere Endknoten enthält (siehe Beispiele unten).Fließende Schnittstelle zum Aufbau eines gerichteten zyklischen Graphen?

parallele Zweige

Parallel Branches

Merging Zweige

Merging Branches

Cycles

Cycle

Complex

Complex

Mys aktuelle Implementierung (siehe Beispiel unten) zurückgreift den Scheitelpunkt zu Aliasing wo eine Gabel auftritt (beispielsweise Scheitelpunkt "B" in Parallel Branches) und dann I beziehen Sie sich auf den Alias, wenn Sie zu diesem Knoten einen neuen Zweig hinzufügen. Mein Builder enthält auch etwas Ähnliches, um das Zusammenführen von Zweigen und Zyklen zu ermöglichen. Aliase wurden eingeführt, da Vertexnamen in BPM-Diagrammen nicht eindeutig sind. Ich möchte eine elegantere fließende Oberfläche, um schnell Diagramme zu erstellen, die frei von diesen Referenzen sind.

Graph graph = GraphBuilder.newGraph() 
          .addVertex("A") 
          .edgeName("") 
          .addVertex("B", "b-fork") 
          .edgeName("") 
          .addVertex("C") 
          .edgeName("") 
          .addVertex("E") 
          .addBranch("b-fork") 
          .edgeName("")  
          .addVertex("D") 
          .edgeName("") 
          .addVertex("F") 
          .build(); 
+1

Haben Sie darüber nachgedacht einen DOT-Parser zu Ihrem Programm hinzufügen?'GraphBuilder.parse (" A -> B; B -> C; B -> D; ")" scheint besser lesbar. –

+0

@Duncan Bitte lesen Sie den gesamten Beitrag. Ich frage nicht nach dem gesamten Builder, ich möchte einfach keine Aliasnamen haben, weil sie nicht elegant sind. – izilotti

+3

Da Sie ein zyklisches Diagramm erstellen möchten, aber die Methodenkette eine Baumstruktur aufweist, scheint eine Form von Aliasing unvermeidlich. –

Antwort

5

Das Problem ist, dass der Bauherr eine Kette von Methoden ist, während Sie ein Diagramm mit Zyklen aufbauen wollen. Sie werden denselben Weg zurückverfolgen müssen, und tun, dass es notwendig ist, zur vorherigen Knoten beziehen sich entweder explizit (ihr Label verwenden) oder implizit, zB:

Graph graph = GraphBuilder.newGraph() 
         .addVertex("A") 
         .edgeName("") 
         .addVertex("B", "b-fork") 
         .edgeName("") 
         .addVertex("C") 
         .edgeName("") 
         .addVertex("E") 

         .goBack(2) // even worse than using label: breaks easily 
         .edgeName("")  
         .addVertex("D") 
         .edgeName("") 
         .addVertex("F") 
         .build(); 

Sie könnten eine Baumstruktur verwenden, um Ihre Grafik zu bauen:

aber dies verzögert das Problem nur, da Sie wieder explizit auf Knoten verweisen müssen, wenn Zyklen ins Spiel kommen. Abgesehen von einer Art von GUI oder umfangreichen ASCII-Zeichnungen gibt es keine Möglichkeit, einen Graphen ohne Aliase zu definieren.

Persönlich würde ich einen DOT-Stil Parser empfehlen:

parse("a -> b -> c -> f -> e; f -> d -> b"); // "Cyclic graph" 

, die sowohl einfacher zu lesen und zu schreiben.

EDIT: für die lulz: zyklische Graph ohne Aliasing:

// do not ever do this: 
    GraphBuilder.parseASCII(
      "  -->C--  \n" +   
      " |  v  \n" + 
      "A-->B  F-->E \n" + 
      " | ^ \n" + 
      "  -->D--  \n"); 
+0

Netter Punkt über Backtracking, aber ja es würde leicht brechen. Wenn ich DOT benutzen würde, würde ich lieber Textdateien verwenden. Um größere Graphen darzustellen, würde diese Zeichenfolge wirklich lang und klobig werden. – izilotti

0

Sie könnten die Parsen reduzieren auf leicht von:

Graph graph = GraphBuilder.newGraph() 
      .add("a,b,c,f,e") 
      .add("f,d,b"); 
+1

Ihre Notation ist einfacher als DOT, aber es erfasst nicht die Verschmelzung von Verzweigungen in einen Scheitelpunkt. – izilotti

+1

es sei denn, ich verpasse etwas, das es tut, indem ich den gleichen Namen wiederverwende (f und b oben). – soru

+0

Ich verstehe. Der zweite Zweig vervollständigt den Zyklus b-> c-> f-> d-> b ... Die Richtung ist nicht klar, weil auf die Verbindungen geschlossen wird. – izilotti