¿Cuándo se prefiere combinar la funcionalidad Agregar / Editar y cuándo mantenerlos separados?

8

Regularmente encuentro situaciones en las que necesito agregar o editar un elemento, y a veces uso métodos separados para agregar y editar, y otras veces los combino en un solo método.

¿Se prefiere un método sobre el otro? Si es así, ¿por qué?

public void AddItem()
{
    ShowEditingPopup(new Item(), "Add Item");
}

public void EditItem(Item item)
{
    ShowEditingPopup(item, "Edit Item");
}

O

public void EditItem(Item item)
{
    ShowEditingPopup(
        (item ?? new Item()), 
        string.format("{0} Item", (item == null ? "Add " : "Edit "))
    );
}

donde ShowEditingPopupse define como

public void ShowEditingPopup(object popupDataContext, string popupTitle)
{
    PopupDataContext = popupDataContext;
    PopupTitle = popupTitle;
    IsPopupVisible = true;
}

Editar: solo para aclarar, no estoy guardando el elemento, lo estoy abriendo para editarlo. Casi siempre implemento un método Save genérico para guardar en la base de datos

Edición n. ° 2: ejemplos de código editados para que reflejen con mayor precisión el tipo de situación a la que me refiero

Rachel
fuente
Pequeñas objeciones: si va a combinar, use un nombre propio para el método EditOrAddItem, en lugar de solo EditItem.
Oded el
@Oded Solo uso SaveItem ... se aplica a ambos.
AJC
@AJC: bastante justo. Sin embargo, el ejemplo todavía tiene EditItem.
Oded el
1
Es más una cuestión de elección que otra cosa ... Sin embargo
Pankaj Upadhyay
1
@FrustratedWithFormsDesigner Hubo uno reciente, pero se ocupó de guardar los cambios en un repositorio, en cuyo caso creo que un Savemétodo es perfectamente válido programmers.stackexchange.com/q/104404/1130
Rachel

Respuestas:

2

Piense en su contexto por un segundo ... No hay distinción entre Agregar un nuevo elemento o editar uno existente. Usted acaba SaveChanges(). El estado del elemento individual le dice al contexto si se está agregando un nuevo elemento o si se está editando uno existente.

EDITAR: Ok ... Bueno, en ese caso, tengo acciones de controlador separadas (MVC3) para cada acción, sin embargo, solo 1 vista ...

AJC
fuente
No estoy guardando el objeto, lo estoy abriendo en una nueva ventana para editar. (Sin Saveembargo , tengo un método genérico para guardar el objeto en la base de datos)
Rachel
@Rachel view edit ...
AJC
Esta pregunta se generó porque el código con el que estoy trabajando generalmente llama ShowPopup(popupContent, popupTitle);, y tenía curiosidad por saber si había una razón para crear llamadas separadas que mostraran un elemento nuevo o un elemento existente, o para hacer ambas cosas con el mismo método.
Rachel
@ Rachel No puedo encontrar una razón para no combinar las llamadas ... Sin embargo, es una elección personal ... Si desea mantenerlas separadas o mezclarlas. Como dije, en mi caso, uso llamadas separadas, pero la misma interfaz de usuario para ambos.
AJC
+1 para diferentes acciones pero la misma vista. Piense en los sitios que visita que tienen la mejor usabilidad ... la mayoría de ellos usan la misma pantalla para crear / editar elementos, a menos que haya condiciones comerciales muy específicas habilitadas / mostradas al realizar cualquiera de las acciones.
silverCORE
0

Digamos que estoy agregando o editando una Personentidad. Casi siempre tendría dos modelos para manejar los procesos de agregar / editar:

  • AddPersonModel
  • EditPersonModel

Casi siempre heredarían de una clase base abstracta común:

  • AddEditPersonModelBase

Por lo tanto, la clase base podría tener un Commitmétodo abstracto , que las clases derivadas anulan para crear una nueva Personentidad o para guardar los cambios en la Personentidad existente .

La lógica de negocios que es común tanto para agregar como para editar va en la clase base (por ejemplo, para editar direcciones), pero siempre hay un poco de lógica de negocios que es diferente si está agregando o editando, y esas van en las subclases. Por ejemplo, es posible que desee asignarles un número de identificación incremental único, pero en realidad no lo crea hasta que guarda la entidad. En ese caso, solo tu EditPersonModeltiene esa propiedad.

Del mismo modo, tendría Vistas (y ViewModels) separadas para agregar o editar un Person, pero tendría sentido que las variantes de agregar y editar hereden de la misma clase base porque muchas de ellas serían comunes.

Scott Whitlock
fuente
En este caso, y en la mayoría de los casos que he hecho recientemente, tanto Agregar como Editar utilizan exactamente la misma forma. Estoy usando WPF/ MVVM, y la interfaz de usuario es un DataTemplate genérico para el objeto, mientras que ViewModel para el objeto sabe cómo manejarlo en función de su estado.
Rachel
@Rachel: en el lenguaje MVVM, puedes renovar un AddPersonViewModel(que no toma un Personen el constructor) o un EditPersonViewModel(que toma un existente Personen el constructor). Cualquiera que sea creado se establece como Window's DataContext. Cuando WPF ve a uno de esos en el diseño, va en busca DataTemplatede eso ViewModely lo aplica automáticamente. Ambos AddPersonViewModely EditPersonViewModelheredan de una clase base común con la lógica común entre ellos en ella. Por ejemplo, un ICommandpara guardar. El botón Guardar se une a eso.
Scott Whitlock
@Rachel: puede tener un elemento común DataTemplateque se una a la adición o edición ViewModel(al vincular a la clase base), o puede agregar una nueva DataTemplateque se una a una clase secundaria, si una o ambas necesitan tener Vistas diferentes.
Scott Whitlock el
Por lo general, solo tengo un PersonViewModelque acepta un Personobjeto en el constructor. Por lo general, creo aplicaciones pequeñas y, a menudo, no veo la necesidad de separar Views/ a ViewModelsmenos que haya una gran diferencia entre un objeto nuevo y uno existente. Es ese tipo de situación lo que provocó mi pregunta.
Rachel
0

Personalmente, tiendo a seguir los principios de ser semántico . Esto significa que generalmente no proporciono un formulario de edición todo en uno. En otras palabras, los usuarios generalmente no desean editar toda la información de una entidad . Más bien, su proceso de edición es más semántico y puede clasificarse. Por ejemplo, para una entidad de usuario , las personas generalmente editan contraseñas y editan el perfil . Por lo tanto, hago dos funciones para editar como:

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

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

O, por lo general, los usuarios editan un artículo de estas formas:

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

}

public bool EditArticleSummary(int articleId, string newSummary)
{

}

En resumen, generalmente creo un formulario de creación todo en uno, pero tiendo a usar formularios de edición pequeños y fragmentados para cada operación de edición semántica. Por lo tanto, generalmente no los combino. Sin embargo, esto no significa que no pueda fusionarlos. Siempre que desee proporcionar un formulario de edición grande y grueso que se parezca al formulario de creación, creo que la fusión puede funcionar mejor.

Saeed Neamati
fuente
0

Esta es una cuestión de qué tan bien entiendes el Principio de responsabilidad única . Sería más limpio y fácil de leer, comprender y mantener si las responsabilidades se desacoplan para separar los métodos / acciones. Sin embargo, esto desde la perspectiva de la codificación.

Si tuviera que elegir un enfoque de sus ejemplos, elegiría el primer enfoque.

La perspectiva del usuario depende de lo fácil que sea agregar un nuevo elemento o editar un elemento existente (el número de clics es una forma de medir) y probablemente seguir algunas reglas de oro.

Si tuviera que implementar la funcionalidad (UI / Formulario), tendría un solo formulario cuando agregar y editar ambos tengan las mismas características, y dos formularios separados cuando difieren.

Kosala Nuwan Perera
fuente