Wann wird die Funktion Hinzufügen / Bearbeiten bevorzugt kombiniert und wann werden sie getrennt gehalten?

8

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 ShowEditingPopupist 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

Rachel
quelle
Kleine Wortklauberei - wenn Sie kombinieren wollen, einen geeigneten Namen für die Methode verwenden EditOrAddItem, anstatt nur EditItem.
Oded
@Oded Ich benutze nur SaveItem ... es gilt für beide.
AJC
@ Ajc - fair genug. Das Beispiel hat jedoch noch EditItem.
Oded
1
Mehr eine Frage der Wahl als alles andere ... Ich werde die Antworten gerne sehen
Pankaj Upadhyay
1
@FrustratedWithFormsDesigner Es gab eine neue, aber es ging um das Speichern von Änderungen in einem Repository. In diesem Fall denke ich, dass eine SaveMethode vollkommen gültig ist. Programmers.stackexchange.com/q/104404/1130
Rachel

Antworten:

2

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 ...

AJC
quelle
Ich speichere das Objekt nicht, ich öffne es in einem neuen Fenster zum Bearbeiten. (Ich habe jedoch eine generische SaveMethode zum Speichern des Objekts in der Datenbank)
Rachel
@ Rachel Ansicht bearbeiten ...
AJC
Diese Frage wurde gestellt, weil der Code, mit dem ich normalerweise arbeite, aufgerufen wird 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.
Rachel
@Rachel Ich kann keinen Grund finden, die Anrufe nicht zu kombinieren ... Es ist jedoch eine persönliche Entscheidung ... Wenn Sie sie getrennt halten oder mischen möchten. Wie gesagt, in meinem Fall verwende ich separate Anrufe, aber für beide dieselbe Benutzeroberfläche.
AJC
+1 für verschiedene Aktionen bei gleicher Ansicht. Denken Sie an die Websites, die Sie besuchen und die die beste Benutzerfreundlichkeit aufweisen. Die meisten von ihnen verwenden denselben Bildschirm zum Erstellen / Bearbeiten von Elementen, es sei denn, bei beiden Aktionen sind ganz bestimmte Geschäftsbedingungen aktiviert / angezeigt.
SilverCORE
0

Angenommen, ich füge eine PersonEntitä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 CommitMethode, die von den abgeleiteten Klassen überschrieben wird, um entweder eine neue PersonEntität neu zu erstellen oder die Änderungen an der vorhandenen PersonEntitä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 EditPersonModeldiese 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.

Scott Whitlock
quelle
In diesem Fall und in den meisten Fällen, die ich kürzlich durchgeführt habe, verwenden sowohl das Hinzufügen als auch das Bearbeiten genau dasselbe Formular. Ich verwende WPF/ MVVMund 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.
Rachel
@Rachel - In der MVVM-Sprache haben Sie entweder eine neue AddPersonViewModel(die Personim Konstruktor keine nimmt ) oder eine EditPersonViewModel(die Personim Konstruktor vorhandene nimmt). Was auch immer erstellt wird, wird als Window's festgelegt DataContext. Wenn WPF denen eines im Layout sieht, geht es für eine Suche DataTemplatefür das ViewModelund wendet sie automatisch. Beide AddPersonViewModelund EditPersonViewModelerben von einer gemeinsamen Basisklasse mit der gemeinsamen Logik zwischen ihnen. Zum Beispiel ein ICommandzu speichern. Die Schaltfläche Speichern wird daran gebunden.
Scott Whitlock
@Rachel - Sie können eine gemeinsame Datei haben DataTemplate, die entweder an das Hinzufügen oder Bearbeiten ViewModelgebunden ist (indem Sie an die Basisklasse binden), oder Sie können eine neue hinzufügen DataTemplate, die an eine untergeordnete Klasse bindet, wenn eine oder beide unterschiedliche Ansichten benötigen.
Scott Whitlock
Normalerweise habe ich nur eine, PersonViewModeldie ein PersonObjekt im Konstruktor akzeptiert . Ich schaffe in der Regel kleine Anwendungen und oft keine Notwendigkeit für separate sehen Views/ ViewModelses 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.
Rachel
0

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:

public bool EditPassword(string userName)
{
    // code here
}

public bool EditProfile(Profile newProfile)
{
    // code here    
}

Normalerweise bearbeiten Benutzer einen Artikel folgendermaßen:

public bool PutArticleIntoCategories(int articleId, List<Category> categories)
{

}

public bool EditArticleSummary(int articleId, string newSummary)
{

}

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.

Saeed Neamati
quelle
0

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.

Kosala Nuwan Perera
quelle