Ich stoße regelmäßig auf Situationen, in denen ich ein Element hinzufügen oder bearbeiten muss, und manchmal verwende ich separate Methoden zum Hinzufügen und Bearbeiten, und manchmal kombiniere ich sie zu einer einzigen Methode.
Wird eine Methode der anderen vorgezogen? Wenn ja warum?
public void AddItem()
{
ShowEditingPopup(new Item(), "Add Item");
}
public void EditItem(Item item)
{
ShowEditingPopup(item, "Edit Item");
}
ODER
public void EditItem(Item item)
{
ShowEditingPopup(
(item ?? new Item()),
string.format("{0} Item", (item == null ? "Add " : "Edit "))
);
}
wo ShowEditingPopup
ist definiert als
public void ShowEditingPopup(object popupDataContext, string popupTitle)
{
PopupDataContext = popupDataContext;
PopupTitle = popupTitle;
IsPopupVisible = true;
}
Bearbeiten: Nur um zu verdeutlichen, ich speichere das Element nicht, ich öffne es zum Bearbeiten. Ich implementiere fast immer eine generische Speichermethode zum Speichern in der Datenbank
Bearbeiten Nr. 2: Bearbeitete Codebeispiele, damit sie die Situation, auf die ich mich beziehe, genauer wiedergeben
coding-style
Rachel
quelle
quelle
EditOrAddItem
, anstatt nurEditItem
.EditItem
.Save
Methode vollkommen gültig ist. Programmers.stackexchange.com/q/104404/1130Antworten:
Denken Sie eine Sekunde über Ihren Kontext nach ... Es gibt keinen Unterschied zwischen dem Hinzufügen eines neuen Elements oder dem Bearbeiten eines vorhandenen Elements. Du nur
SaveChanges()
. Der Status der einzelnen Elemente teilt dem Kontext mit, ob ein neues Element hinzugefügt oder ein vorhandenes bearbeitet wird.EDIT: Ok ... Nun, in diesem Fall habe ich separate Controller-Aktionen (MVC3) für jede Aktion, jedoch nur 1 Ansicht ...
quelle
Save
Methode zum Speichern des Objekts in der Datenbank)ShowPopup(popupContent, popupTitle);
, und ich war neugierig, ob es einen Grund gab, separate Aufrufe zu erstellen, die ein neues Element oder ein vorhandenes Element anzeigen, oder beides auf dieselbe Weise auszuführen.Angenommen, ich füge eine
Person
Entität hinzu oder bearbeite sie . Ich hätte fast immer zwei Modelle, um die Add / Edit-Prozesse zu handhaben:AddPersonModel
EditPersonModel
Sie würden fast immer von einer gemeinsamen abstrakten Basisklasse erben:
AddEditPersonModelBase
Die Basisklasse verfügt möglicherweise über eine abstrakte
Commit
Methode, die von den abgeleiteten Klassen überschrieben wird, um entweder eine neuePerson
Entität neu zu erstellen oder die Änderungen an der vorhandenenPerson
Entität zu speichern .Die Geschäftslogik, die sowohl dem Hinzufügen als auch dem Bearbeiten gemeinsam ist, gehört zur Basisklasse (z. B. zum Bearbeiten von Adressen), aber es gibt immer ein bisschen Geschäftslogik, die sich beim Hinzufügen oder Bearbeiten unterscheidet, und diese gehören zu den Unterklassen. Beispielsweise möchten Sie ihnen möglicherweise eine eindeutige inkrementierende ID-Nummer zuweisen, diese erstellen Sie jedoch erst, wenn Sie die Entität speichern. In diesem Fall hat nur Ihr
EditPersonModel
diese Eigenschaft.In ähnlicher Weise hätten Sie separate Ansichten (und ViewModels) zum Hinzufügen oder Bearbeiten von a
Person
, aber es wäre sinnvoll, wenn sowohl Hinzufügen- als auch Bearbeitungsvarianten von derselben Basisklasse erben würden, da viele davon häufig vorkommen würden.quelle
WPF
/MVVM
und die Benutzeroberfläche ist eine generische DataTemplate für das Objekt, während das ViewModel für das Objekt weiß, wie es basierend auf seinem Status behandelt wird.AddPersonViewModel
(diePerson
im Konstruktor keine nimmt ) oder eineEditPersonViewModel
(diePerson
im Konstruktor vorhandene nimmt). Was auch immer erstellt wird, wird alsWindow
's festgelegtDataContext
. Wenn WPF denen eines im Layout sieht, geht es für eine SucheDataTemplate
für dasViewModel
und wendet sie automatisch. BeideAddPersonViewModel
undEditPersonViewModel
erben von einer gemeinsamen Basisklasse mit der gemeinsamen Logik zwischen ihnen. Zum Beispiel einICommand
zu speichern. Die Schaltfläche Speichern wird daran gebunden.DataTemplate
, die entweder an das Hinzufügen oder BearbeitenViewModel
gebunden ist (indem Sie an die Basisklasse binden), oder Sie können eine neue hinzufügenDataTemplate
, die an eine untergeordnete Klasse bindet, wenn eine oder beide unterschiedliche Ansichten benötigen.PersonViewModel
die einPerson
Objekt im Konstruktor akzeptiert . Ich schaffe in der Regel kleine Anwendungen und oft keine Notwendigkeit für separate sehenViews
/ViewModels
es sei denn es einen großen Unterschied zwischen einem neuen Objekt ist und eine bestehende. Es ist diese Art von Situation, die meine Frage aufgeworfen hat.Ich persönlich neige dazu, den Prinzipien der Semantik zu folgen . Dies bedeutet, dass ich normalerweise kein All-in-One-Bearbeitungsformular zur Verfügung stelle. Mit anderen Worten, Benutzer möchten normalerweise nicht die gesamten Informationen einer Entität bearbeiten . Ihr Bearbeitungsprozess ist eher semantisch und kann klassifiziert werden. Beispielsweise bearbeiten Benutzer für Benutzerentitäten normalerweise Kennwörter und bearbeiten Profile . Daher mache ich zwei Funktionen zum Bearbeiten wie:
Normalerweise bearbeiten Benutzer einen Artikel folgendermaßen:
Kurz gesagt, ich erstelle normalerweise ein All-in-One-Erstellungsformular, verwende jedoch für jede semantische Bearbeitungsoperation kleine, zerlegte Bearbeitungsformulare. Daher füge ich sie normalerweise nicht zusammen. Dies bedeutet jedoch nicht, dass Sie sie nicht zusammenführen können. Wann immer Sie ein dickes, großes Bearbeitungsformular bereitstellen möchten, das dem Erstellungsformular ähnelt, kann das Zusammenführen meiner Meinung nach besser funktionieren.
quelle
Dies hängt davon ab, wie gut Sie das Prinzip der Einzelverantwortung verstehen . Es wäre sauberer und einfacher zu lesen, zu verstehen und zu warten, wenn die Verantwortlichkeiten in getrennte Methoden / Maßnahmen entkoppelt würden. Dies jedoch aus Sicht der Codierung.
Wenn ich einen Ansatz aus Ihren Beispielen auswählen müsste, würde ich mich für den ersten Ansatz entscheiden.
Die Perspektive des Benutzers hängt davon ab, wie einfach es ist, ein neues Element hinzuzufügen oder ein vorhandenes Element zu bearbeiten (die Anzahl der Klicks ist eine Möglichkeit, die ich messe) und wahrscheinlich einige goldene Regeln zu befolgen.
Wenn ich die Funktionalität (Benutzeroberfläche / Formular) implementieren müsste, hätte ich beim Hinzufügen und Bearbeiten ein einziges Formular, beide haben dieselben Funktionen und zwei separate Formulare, wenn sie sich unterscheiden.
quelle