2009-03-09 15 views
0

Lassen Sie uns sagen, dass wir da draußen eine Web-App haben, dass ein Benutzer ein Formular ausfüllen haben soll, und dann schafft es ein Ticket im Backend-Workflow-Engine. Dieses Formular wird weiterhin das Portal für den Kunden sein, um zu sehen, was vor sich geht. Einige Formulare gehen direkt zur Ticket-Erstellung; Andere müssen von jemand anderem genehmigt werden, bevor sie ein Ticket erstellen, und sie können auch abgelehnt werden. Das Ding sendet E-Mails verfolgt Antworten auf die Fragen der Form, verfolgt alle hochgeladenen Anhänge und protokolliert auch „Updates“, wie verschiedene Aktionen, die den Zustand der Form gemacht zu ändern.Refactoring Spaß: Umgang mit komplizierten Zustand

Die Business-Logik zu entscheiden, was zu tun, wenn das Formular zuerst vorgelegt wird oder gespeichert Start behaarten zu bekommen, und ich bin auf der Suche auf Möglichkeiten, es zu Refactoring. Ich habe begonnen, die Zustands-/Strategie-Muster zu betrachten, aber es scheint, als ob die ganze Logik nur irgendwann an einer Stelle zusammengelegt werden müsste. Mit allen Abhängigkeiten von Antworten/Attachments/Log-Einträgen ist es außerdem schwierig, Mocks zu injizieren, weil es so viel hat, dass es verfolgen muss.

Hier ist ein Pseudocode-ish-Layout des Formularobjekts "Speichern" -Funktionalität, vereinfacht nach unten ... es beginnt zu fiesen und ich versuche zu sehen, ob ich es irgendwie sauberer machen kann.

+0

und die Frage war? ... –

+0

Gibt es irgendwelche Möglichkeiten, die Logik aus BigNastyMethod herauszuziehen? Würde ein Designmuster helfen? Welche? – Chris

Antwort

2

Ich habe in letzter Zeit viel über Staatsmaschinen nachgedacht und fand den folgenden Vorschlag sehr vielversprechend. Ich wünschte, ich könnte dir sagen, dass es wirklich gut funktioniert, aber ich bin noch nicht so weit gekommen. Ich kann Ihnen sagen, dass es besser aussieht als jede Lösung, die ich bisher versucht habe. Hier ist der Link .. Hierarchical State Machine

0
if (isNewForm) { 

    if (JustDenied) { 
     ... 
    } 

    if (JustApproved) { 
     .... 
    } 

} else { 
    ... not a new form ... 
} 

Ich bin nicht sicher, wie Sie Ihre Handhabung JustDenied, aber vielleicht:

switch (FormState) { 
case JustApproved: 
    .... 
case JustDenied: 
    .... 
} 

Der Pseudo-Code, so schwer zu sagen, ob das funktionieren würde. Aber ja, ich stimme zu, dass das, was du gepostet hast, anfängt, Pasta zu ähneln.

0

Ich denke, dies ist ein ausgezeichneter Kandidat für Workflow Foundation.

Problem ist nicht eine komplizierte Zustandsmaschine zu schreiben, ist es mit der Dynamik eines Unternehmens zu tun (die auch manchmal wie Nudeln scheinen kann;)). Die Regeln ändern sich, der Code muss geändert werden, und wie Sie selbst bemerkt haben, kann die Wartbarkeit hier zum Albtraum werden ...