5

Utworzono zestaw klas reprezentujących skierowany cykliczny wykres do reprezentowania procesów BPM, oparty na klasie JUNGDirectedSparseGraph, który zapewnia tylko podstawowe metody manipulacji wykresami w celu dodawania i znajdowania wierzchołków i krawędzi.Płynny interfejs do budowania ukierunkowanego wykresu cyklicznego?

Wyzwanie, przed którym stoję, polega na stworzeniu builder, który zapewnia fluent interface możliwość tworzenia wykresów zawierających złożone rozgałęzienia, cykle i wiele węzłów końcowych (patrz przykłady poniżej).

równoległych gałęzi

Parallel Branches

Łączące Gałęzie

Merging Branches

Cycles

Cycle

Kompleks

Complex

My prąd realizacja (patrz przykład poniżej) uciekają się do aliasing wierzchołek której ma widełki (np wierzchołek "B" Parallel Branches), a potem odwołaj się do aliasu dodając nową gałąź do tego wierzchołka. Mój twórca zawiera również coś podobnego, co pozwala na łączenie gałęzi i cykli. Wprowadzono aliasy, ponieważ nazwy wierzchołków nie są unikalne na wykresach BPM. Chcę bardziej eleganckiego, płynnego interfejsu, aby szybko tworzyć wykresy, wolne od tych odniesień.

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

Czy za dodanie parser DOT do swojego programu?'GraphBuilder.parse (" A -> B; B -> C; B -> D; ")' wydaje się bardziej czytelne. –

+0

@Duncan Przeczytaj cały wpis. Nie proszę o całego budowniczego, po prostu nie chcę mieć aliasów, bo nie są eleganckie. – izilotti

+3

Jeśli chcesz zbudować cykliczny wykres, ale łańcuch metod ma strukturę drzewa, pewna forma aliasingu wydaje się nieunikniona. –

Odpowiedz

5

Problem polega na tym, że budowniczy jest łańcuchem metod, podczas gdy chcesz zbudować wykres z cyklami. trzeba się cofnąć, a do tego konieczne jest, aby odnieść się do poprzednich węzłów albo jawnie (używając ich etykiety) lub implictly, np:

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(); 

Można użyć strukturę drzewa, aby zbudować swój wykres:

SubGraph.node("id", "label") 
     .to("edgeName1", SubGraph.node("A").to("", SubGraph.node("C"))), 
     .to("edgeName2", SubGraph.node("B")); 

, ale to tylko opóźnia problem, ponieważ będziesz musiał ponownie odnieść się do węzłów wyraźnie, gdy cykle wchodzą w grę. Bez jakiegoś GUI lub obszernych rysunków ASCII nie ma możliwości zdefiniowania wykresu bez aliasów.

Osobiście polecam parser DOT-style:

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

który jest jednocześnie łatwiejszy do czytania i pisania.

EDIT: dla lulz: cyklicznej wykresu bez aliasingu:

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

Niezły punkt na temat cofania, ale tak, łatwo by się złamał. Gdybym używał DOT, wolałbym używać plików tekstowych. Aby przedstawić większe wykresy, łańcuch stałby się naprawdę długi i nieporęczny. – izilotti

0

Można obniżyć parsowanie nieznacznie przez:

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

Twoja notacja jest prostsza niż DOT, ale nie przechwytuje scalania gałęzi w wierzchołek. – izilotti

+1

, chyba że brakuje mi czegoś, co robi, przez ponowne użycie tej samej nazwy (f i b powyżej). – soru

+0

Rozumiem. Druga gałąź kończy cykl b-> c-> f-> d-> b ... Kierunek nie jest wyraźny, ponieważ wynika z połączeń. – izilotti