Frage

Ich habe ein Unternehmen, das entspricht eine Aufgabe, die mehrere Staaten haben kann. Die „Aufgabe“ kann entweder in einem anhängigen, weitergegeben oder gescheiterten Staat sein. Jeder dieser Staaten werden auch einige einzigartige Daten. Zum Beispiel in einem gescheiterten Staat soll das Unternehmen einen Grund für den Fehler hat, in dem anstehenden Zustand sollte es eine Frist für die Bewertung hat, etc.

Während die oben führt ich mich zu denken, sollte ein eigenes Objekt habe jeden Zustand zu repräsentieren, die zugrunde liegende ID für das Unternehmen soll gleich bleiben, schiebt mich zurück in Richtung denkt, dies als ein einzelnes Objekt.

Auch von Staat zu Staat Übergang erfordert eine gewisse Logik. A „pending“ Aufgabe Übergang zu einem „bestanden“ Zustand wird anders als eine „nicht bestanden“ Aufgabe behandelt werden, um den gleichen Übergang zu machen.

Wenn die Darstellungen für jeden Zustand waren genau die gleichen ich nur eine primitive Eigenschaft verwenden würde und mit ihm getan werden. Da jedoch die verschiedenen Zustände leicht unterschiedliche Darstellungen haben, ich habe kämpfen, um den besten Weg, dies zu modellieren, um herauszufinden. Die Logik für den internen Zustand regeln ist immer ein wenig chaotisch so dass ich dachte ich würde einen Schritt zurück und überdenken. Irgendwelche Gedanken?

Ich bin mit c # wenn ich diese Sprache Agnostiker betrachten würde.

War es hilfreich?

Lösung

Als ich diese Frage zu lesen, war meine Antwort eine Aufzählung zu verwenden, um den Zustand zu definieren. Nachdem es rereading, würde ich jedoch eine der folgenden Vorschlag:

  1. Implementieren Sie jede Aufgabe als separate Klasse (PendingTask, PassedTask, ...) mit den gleichen Eltern und einem Konstruktor, der eine Aufgabe jeglicher Art, die vor diesem Zustand kommt akzeptiert.
  2. Implementieren Sie eine Aufgabe, und erstellen Sie eine neue Klasse TaskStateData mit Kind Klassen für die für jeden Zustand benötigten Daten.
  3. Implementieren Sie eine Aufgabe, sondern verfügt über ein separates Verfahren, den Zustand für jeden Zustand Typen mit Parametern für die zusätzlichen Attribute für diesen Zustand
  4. benötigt ändern

Ich schlage vor, diese Lösungen die Datenintegrität zu gewährleisten.

Andere Tipps

Möchten Sie einen reinen objektorientierten Ansatz hat Nachteile. Es sei denn, Sie viel zu tun auf mit polymorpher Code Verwaltung planen, vermeiden Sie Ihre Domain-Klasse des Staat mit Polymorphismus direkt darstellen. Ich habe auf einem hybriden Ansatz angesiedelt. Die verschiedenen Zustände müssen als separate Eltern / Kind-Vererbungsbaum modelliert werden. Beginnen Sie mit einer abstrakten Basisklasse MyState, die als Kinder MyState1, MyState2 haben und MyState3. (Siehe Jeffrey Antwort für eine Beispiel.

Das Unternehmen, das seinen Zustand muss verfolgt hat ein Attribut von ‚strom Zustand‘, die vom Typ MyState ist. wenn das Objekt ändert Zustand ist, ist es eine einfache Zuordnung oder setter () -Aufruf es zu ändern. Sie können Singleton Instanzen jeden Zustand konstruieren, wenn dies gewünscht wird, oder neue Instanzen für jede Statusänderung konstruieren. Es hängt davon ab, wie oft der Zustand ändert und wie viele Objekte, die ihren Zustand verfolgt. Wenn die Zahlen zu groß werden können Sie den Einmengenansatz berücksichtigen.

  

Die „Aufgabe“ kann entweder in einem anhängigen, weitergegeben oder gescheiterten Staat.   A „pending“ Aufgabe Übergang zu einem „bestanden“ Zustand wird anders als eine „nicht bestanden“ Aufgabe behandelt werden, um den gleichen Übergang zu machen.

Das scheint eine ziemlich ungeradee Sammlung von Zuständen. Ich würde erwarten, dass eine Aufgabe, einige Zeit in Anspruch nehmen auszuführen, so Übergang von den anstehenden dann entweder auf der Ausführung bestanden oder nicht bestanden, und Aufgaben, die nicht ausgeführt werden, bevor die Zeit abläuft abläuft. Wenn es auch von einem Übergang zu failed-und-abgelaufen ist fehlgeschlagen dann das könnte einen anderen Zustand hinzufügen.

Zeichnen Sie eine Zustandsmaschine, die Zustände zu finden.

Als erstes müssen Sie die Zustände strukturell modellieren? Würden eine anhängige / abgelaufene Flagge, eine geplante Zeit und ein Ergebnis zu tun (mit Erfolg und Misserfolg, da die beiden Unterarten Ergebnis)? Was tun Kunden der Aufgabe Notwendigkeit von ihm?

Zum anderen interagieren Sie mit einer Aufgabe oder einem Scheduler? Es ist nicht ungewöhnlich, dass eine Aufgabenbeschreibung zu einem Scheduler zu geben und eine Zukunft zu kommen, die über das Ergebnis der Aufgabe abgefragt werden können. Aber die Aufgabe selbst nicht ausgesetzt ist, sondern nur, ob es vollständig ist und das Ergebnis. Wenn Sie Fortschritte benötigen, sollten Sie einen Scheduler haben, die von Task-ID abgefragt werden können Fortschritte zu erhalten, anstatt eine Aufgabe Objekt eine Referenz halten, um - unter Aufgabe, eine Aufgabe, die den Zustand ändert gleichzeitig macht es schwierig, einen einheitlichen Satz zu erhalten von Zustandsdaten von ihm, bis er einen Endzustand erreicht. Wenn die ‚bestanden‘ Zustand nicht Fehlerinformationen, dann die Abfrage ‚Sie sind gescheitert‘, gefolgt von ‚Ausfallstatus bekommen‘ leicht führt zu einem Rennen, wenn Sie externalisieren Verriegelung (ewww), so atomar eine unveränderliche Aufgabe Zustandsinformation Objekt Rückkehr wird wünschenswert, durch die Zeit, um Ihre Aufgabe Objekt wird mehr oder weniger äquivalent zu einem Scheduler übergeben die ID.

Haben Sie einen Blick auf die Zustandsmuster.

Das klingt wie eine ideale Anwendung von Objekt Vererbung und Polymorphismus.

abstract class Task
{
      public int TaskId { get; private set; }
      abstract PassedTask TransitionToPassed();
      ...
}

class PendingTask : Task
{
      PassedTask TransitionToPassed()
      {
            PassedTask passed = new PassedTask();
            passed.TaskId = TaskId;
            ...
            return passed;
      }
      ...
}

class PassedTask : Task
{
      PassedTask TransitionToPassed()
      {
            return this;
      }
      ...
}

class FailedTask : Task
{
      public string ReasonForFailure { get; private set; }
      PassedTask TransitionToPassed()
      {
            ...
      }
      ...

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top