Freigeben über



Juni 2019

Band 34, Nummer 6

Dieser Artikel wurde maschinell übersetzt.

[Programmiererpraxis]

Naked-Programmierung: Naked-Aktionen

Durch Ted Neward | Juni 2019

Ted NewardWillkommen zurück, Freunde des NOF. Zeitpunkt der letzten, ich untersucht wie NakedObjects Sammlungen behandelt, die ermöglichen, eine Reihe von Objekten voneinander zugeordnet werden soll (msdn.com/magazine/mt833439). Wie ich über dieses Element ist ein Fehler aufgetreten, allerdings habe ich vorgestellt das Konzept einer "Aktion" in den Code ohne ihn wirklich im Detail erläutert. Da Aktionen auf Eigenschaften "Daten" koppeln "Code" sind, ist es sinnvoll, die Aktionen im Detail besprochen, und beachten Sie insbesondere die Stellen, in dem Aktionen Leben können, und wie sie in der Benutzeroberfläche angezeigt werden.

Möchten Sie die naked reagieren?

Aktionen

Die manuelle NEINE beschreibt eine Aktion als "eine Methode, die von einem Benutzer aufgerufen werden soll." Es ist wichtig zu beachten, dass diese Methoden nicht nur Benutzer aufrufbaren sind; die manuelle wechselt, im selben Satz, darauf hinweisen, dass "es auch programmgesteuert über innerhalb einer anderen Methode oder ein anderes Objekt aufgerufen werden kann." Aktionen sind dann, in denen das Verhalten eines Objekts wird definiert, und NEINE generiert ein Menüelement, für den Benutzer auf/für jede Aktion aufrufen, die automatisch erstellt werden.

Eine solche Aktion, die problemlos Gedanke ist die grundlegende CRUD-Verhalten für einen angegebenen sprechen (oder Redner, eigentlich) ausführen, aber denken Sie daran, dass die als Teil das Kernverhalten der Benutzeroberfläche als Ganzes bereits NEINE behandelt. Ein Menüelement, deaktivieren Sie im Hauptmenü können Sie zum Erstellen eines neuen Speaker, beachten Sie, dass, für die SpeakerRepository definiert ist, im zweiten Artikel dieser Reihe haben Sie gesehen (msdn.com/magazine/mt833268). Bearbeiten, Redner erfolgt, nachdem ein Redner ausgewählt ist, und der Benutzer wählt die "Bearbeiten" im Menü-Element, das angezeigt wird. In der Tat ist das einzige, was in der Liste fehlen die Möglichkeit, Redner, löschen, ist eine einfache Möglichkeit zum – ich füge nun eine Aktion, die mir ermöglicht, der derzeit sichtbaren Sprecher zu löschen.

(Ich weiß, ich weiß – je wen Redner löschen? Wir haben alle also lovable, es ist kaum vorstellbar, dass jeder Benutzer jemals einen Redner aus dem System entfernen möchten. Doch für mich auf diese Klasse, für Zwecke pädagogischer Natur, wenn gar nichts. Angenommen Sie, sie abkoppeln. Oder ähnlich.)

Um eine neue Aktion hinzuzufügen, muss ich nur die Sprechererkennungs-Typ eine neue Methode hinzugefügt werden. Standardmäßig wird jeder öffentlichen Methode Domain-Objekt verfügbar gemacht werden als eine Aktion im Menü "Aktionen" der Benutzeroberfläche, damit recht einfach das Hinzufügen dieser ist:

public void Delete()
{
  Container.DisposeInstance(this);
}

Denken Sie daran, dass die Container-Eigenschaft einer Instanz von der IDomainObjectContainer, Abhängigkeit, die auf jeden Redner eingefügt werden ist, nachdem sie erstellt oder von der SpeakerRepository zurückgegeben. Zum Entfernen eines persistenten Objekts (z. B. einen Redner, die mit der Aktion CreateNewSpeaker auf die SpeakerRepository hinzugefügt wurde), muss der Container ", wie diese Instanz löschen".

Allerdings auf, wenn ich dies für die Sprechererkennungs-Klasse hinzufügen und ausführen, die etwas schief – insbesondere nach dem Löschen des Sprechers, erhalte ich eine Fehlermeldung über ein fehlendes Objekt. Ist der Client NEINE Begründung aus, dass das Domain-Objekt, das war es nur die Anzeige von – des Sprechers, die gerade gelöscht wurde, nicht mehr vorhanden ist. Dadurch viel Sinn, wenn Sie denken, und die Antwort lautet, geben Sie der Benutzeroberfläche etwas anderes, z. B. die Liste aller verbleibenden Sprecher Anzeige im System angezeigt werden, die ich einfach genug aus dem Container erneut abrufen können , wie folgt:

public IQueryable<Speaker> Delete()
{
  Container.DisposeInstance(this);
  return Container.Instances<Speaker>();
}

Nun, wenn der Benutzer wählt ein Sprecher zu löschen, die Benutzeroberfläche entfernt, zeigt den Rest der Liste der Referenten und Leben wechselt auf. (Lebe wohl, einfach Redner. Wir speichern Sie gerne.)

Ein Problem, das entsteht, jedoch ist, dass bestimmte Domänenobjekte haben eine klare Abhängigkeit auf andere innerhalb des Systems, nach dem Zufallsprinzip Zerstören von diesen Objekten ohne Gedanken über die entsprechenden Verknüpfungen wird die Chaos. (In der Tat NEINE Löschen eines Objekts, das alle zugeordneten Objekte verfügt, bis die zugeordneten Objekte zuerst gelöscht werden verhindert.) Praktisch bedeutet dies, wenn Sprechers finden, die Sie erstellt hat, das Löschen des Sprechers die Vorträge zu einem verwaisten hinterlässt. Im Idealfall wäre nicht Sie Referenten zulassen, die erstellt, gelöscht werden, finden Sie eine oder mehrere haben. Sie könnten fügen Sie ein Häkchen in der Delete-Methode und bieten folgende Fehlermeldung: Wenn vom Benutzer wird ausgewählt und Sie können nicht über folgen, aber es im Allgemeinen eine bessere Idee ist, einen Benutzer zu unterbinden, die Option auswählen sogar etwas tun nicht zulässig sind, in NEINE genannt , die Aktion vollständig deaktiviert werden soll.

Auch hier verwendet NEINE Benennungskonventionen, um diese Art von Funktionalität bereitzustellen. Durch die Bereitstellung einer Methode, die beginnt mit dem Namen "Deaktivieren" und wird weiterhin mit dem Namen der Aktion, die Sie (in diesem Fall "Löschen") deaktivieren möchten, können Sie die Überprüfung ausführen, lange bevor der Benutzer je auswählt:

public string DisableDelete()
{
  if (Talks.Count > 0)
  {
    return "Speakers cannot be deleted until their Talks are removed.";
  }
  return null;
}

Beachten Sie, dass DisableDelete gibt eine Zeichenfolge, die entweder null, wenn die Aktion genau ausgeführt oder der Benutzer angezeigt werden. (Standardmäßig wird das Menüelement für die Aktion deaktiviert werden, damit es wird nicht vom Benutzer ausgewählt werden, aber denken Sie daran, dass die Aktionen, die auf andere Weise aufgerufen werden können,.)

Was geschieht, wenn Sie die Aktion des Benutzers vollständig ausblenden möchten? Eine andere Frage ist, aber NEINE verwendet den gleichen Ansatz – eine HideDelete-Methode, um anzugeben, ob die Aktion angezeigt werden soll. Die Wahl zwischen ausgeblendet und deaktiviert ist offensichtlich auf, feine ein, und wahrscheinlich eine UX-Debatte, die andere qualifizierten haben als; naja, wählen Sie als Ihren UX-Designer oder Ihrem Geschmack gelangen Sie.

Action-Parameter

Bedenken Sie, dass in vielen Fällen die Aktion zusätzliche Daten benötigen, bevor diese durchgeführt werden kann. Eine Aktion sollten alle Lautsprecher zu finden, die kommuniziert haben, die einen bestimmten Suchbegriff, z. B. "Blockchain" oder "IoT" enthalten (hoffentlich diese vollständig aus dem System entfernen), d. h., die der Benutzer eine Möglichkeit, geben Sie in diesem muss Suchbegriff. In diesem Fall wird NEINE ein Commit ausgeführt, um das Prinzip, das die Benutzeroberfläche aus der Struktur des Codes selbst, was in diesem Fall bedeutet, dass die Benutzeroberfläche wird untersuchen Sie die Parameter der Methode, und stellen ein Element der Benutzeroberfläche, die der Benutzer die Möglichkeit, fügen Sie die erforderlichen Eingaben in erstellt werden soll platzieren. Sie haben bereits, dieser Mechanismus bei der Arbeit gesehen, darin, dass die FindSpeakerByLastName-Methode, der die SpeakerRepository die gleiche Aufgabe ausführt: akzeptiert einen Parameter für den Nachnamen, die nach dem gesucht werden soll, das NEINE interpretiert, es bedeutet ein TextBox-Element nach, die angezeigt muss Aktion wird aufgerufen.

Naked-Beiträge

Wie bereits erwähnt, aus dem früheren Artikel erwähnt, dass die Welt Naked-Objekten besteht aus Domänenobjekte und Dienste, in denen Dienste von Verhaltenssammlungen sind, die nicht unbedingt für das Domänenobjekt angehören. Im Wesentlichen wird, wenn eine Methode für einen Dienst ein Domänenobjekt als einen seiner Parameter verwendet, und dieser Parameter weist ein Attribut "ContributedAction" auf, die NOF UI, die so, dass dadurch das Domänenobjekt-Menü angezeigt werden soll.

Stellen Sie sich für einen Moment, soll den Code, Lautsprecher benachrichtigen, dass es sich bei ihren Vortrag bei der Konferenz außerhalb des Speaker-Objekt akzeptiert wurde. (Dies ist sinnvoll, tatsächlich aus einer Domäne, die Perspektive, modellieren, da benachrichtigen Redner eigentlich nichts mit wird ein Sprecher zu tun hat.) Erstellen Sie einen Dienst, und klicken Sie dann das sieht etwa wie folgt (achten müssen Sie sicherstellen, dass es in der Dienste-Eigenschaft der NakedObjectsRunSettings-Klasse auch NEINE registriert ist):

public class NotificationService
{
  public IDomainObjectContainer Container { set; protected get; }
  public void AcceptTalk([ContributedAction] Talk talk)
  {
    Container.InformUser("Great! The Speaker will be emailed right now");
  }
}

Die Implementierung der Benachrichtigung wird natürlich mit mehr als nur eine Nachricht, die für dem Benutzer benötigt, aber nicht wichtiger ist – hier kommt das ContributedAction-Attribut für den Vortrag-Parameter, der diese Aktion angezeigt werden in der Liste reden, der dazu Aktionen auf. Dies bietet ein hohes Maß an Flexibilität in Bezug auf, in dem Code angezeigt wird, in das System im Vergleich zu, wo sie in der Benutzeroberfläche angezeigt wird.

Beachten Sie, dass es möglich ist, tragen Aktionen für Gruppen von Domänenobjekten, ebenfalls mit dem die gleiche Art von Konvention, die nur auf einen Parameter, die eine Auflistung von Domänenobjekten statt in einer einzigen Datei anwenden. Wenn ich das Senden von Benachrichtigungen an eine Auflistung von Lautsprecher möchte, kann ich dies z. B. aus einer bestimmten Methode wie folgt tun:

public void NotifySpeakers([ContributedAction] IQueryable<Speaker> speakers)
{
  foreach (Speaker s in speakers)
  {
    // Send SMS or email or whatever
  }
}

Vom Standpunkt "Benutzeroberfläche" jede Auflistung von Lautsprecher verfügen jetzt über ein Kontrollkästchen angezeigt werden, vor jeweils (sodass des Benutzers auswählen, welche die Lautsprecher in der Auflistung angezeigt wird), und im Menü "Aktionen" angezeigt, in der Tabelle hat die Aktion "Lautsprecher benachrichtigen" angezeigt. Als mit alle Aktionen erscheint wenn zusätzliche Eingabe seitens des Benutzers erforderlich (z. B. die Nachricht an jeden Redner senden), ist dies als Teil der Benutzeroberfläche vor dem Ausführen der Methode.

Zusammenfassung

Aktionen darstellen einen wichtigen Aspekt der Oberfläche Naked-Objects-Framework, sie sind, in denen die große Mehrheit der "Geschäftsregeln" einer beliebigen Anwendung befinden wird. Dienste bieten eine Möglichkeit, Geschäftslogik hosten, um sicherzustellen, dass, es jedoch innerhalb von Aktionen für ein Domänenobjekt, dass ddd-Entwickler die besten Möglichkeiten, geben Sie den Code, um "die Arbeit machen." finden

Viel Spaß beim Programmieren!


Ted Neward ist ein in Seattle ansässiger Berater, Redner und Mentor für zahlreiche Technologien. Er hat unzählige Artikel geschrieben und als Autor und Mitautor ein Dutzend Bücher verfasst. Er hält weltweit Vorträge. Sie erreichen ihn unter ted@tedneward.com, oder lesen Sie seinen Blog unter blogs.tedneward.com.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Richard Pawson


Diesen Artikel im MSDN Magazine-Forum diskutieren