¿La activación y desactivación de las características de la interfaz de usuario (u otras) se basa en las fechas, un olor a código?


11

Tenemos un sistema horrible escrito en ASP.NET 2.0 al que necesitamos agregar algunas funcionalidades. El problema es que un determinado producto tiene características de interfaz de usuario que deben activarse para los negocios iniciados después de una determinada fecha (y otros desactivados), mientras que la página debe aparecer igual para los negocios existentes.

Estoy presionando para que se reescriba la página para nuevos negocios, ya que instintivamente encuentro que la idea de los interruptores de interfaz de usuario de JavaScript basados ​​en fechas, y la combinación de controles web para los negocios antiguos y nuevos son "desordenados" (por falta de una palabra mejor) )

¿La práctica de tener una IU basada en el tiempo presenta una práctica ampliamente aceptada, y si no, cuáles son los riesgos conocidos de seguir ese curso de acción?


13
Si los requisitos de su dominio comercial especifican que alguna característica no estará disponible para el usuario, excepto dentro de un marco de tiempo particular, entonces es "por diseño". Si no le gusta la idea de que los controles ux aparezcan y desaparezcan, desactívelos en lugar de ocultarlos. En cualquier caso, la técnica es perfectamente válida.
Robert Harvey

1
Encuentro que la frase "negocio iniciado después de una fecha determinada" no está clara. ¿Se refiere a negocios con su empresa (para clientes que se registran después de una fecha determinada) o negocios iniciados con su cliente (por lo que su cliente solo puede hacer ciertas cosas con los datos en su aplicación si su cliente se registró después de una fecha en particular)? En el primer caso, estás hablando de las funciones disponibles para tus clientes. En el último caso, está hablando de restringir acciones no válidas en ciertos datos (según las condiciones en los datos mismos). La respuesta podría ser muy diferente en esas circunstancias.
jpmc26

Respuestas:


22

No hay nada de malo en ajustar una interfaz de usuario en función de qué características están habilitadas para un cliente, o qué tipos de implementación han elegido, pero el cambio debería

  1. dependerá de indicadores significativos, por ejemplo, "HAVE_EXPORT" para habilitar / deshabilitar una opción de exportación, no de comparaciones de fechas extrañas. La interfaz de usuario no tiene por qué conocer la regla de negocios sobre lo que se publicó cuando, solo debe cumplir su tarea de interfaz de usuario y obedecer las instrucciones específicas de la interfaz de usuario.
  2. Controle el lado del servidor, de modo que un cliente no pueda habilitar subrepticiamente funciones por las que no ha pagado.

(Tenga en cuenta que todo lo contrario - dis características abling después de un cierto tiempo - es un gran no-no, a menos que haya comunicado claramente que usted está vendiendo una versión de prueba por tiempo limitado creación de tales. Bombas de tiempo en cualquier otra circunstancia hará que la gente odia Eres más rápido que casi cualquier otra cosa.)


2
The UI has no business knowing the business rule about what was published when- De acuerdo, pero incluso Stack Exchange tiene tales reglas de UI. Por ejemplo, el enlace "eliminar" no aparece para otros usuarios en preguntas cerradas hasta que hayan transcurrido dos días, y la opción Migración se deshabilita después de 60 días.
Robert Harvey

Aclaré la pregunta en función de esta respuesta: algunos controles se eliminarán y se agregarán otros, según la fecha.
NMrt

13
@RobertHarvey, pero ¿cómo se programa en la vista? ¿Es algo como if (showDelete) { <button>delete</button> }o if ((post.date - today).days > 2) { <button>delete</button> }?
Arturo Torres Sánchez

@ ArturoTorresSánchez: El primero: la idea es poner la lógica de negocios (como la fecha de cálculo) en el servidor. De todos modos, esto sería una buena pregunta propia :-).
sleske

11

El requisito en sí no es problemático, pero hay formas buenas y malas de implementarlo . Si ha copiado y pegado el código en todo el lugar que se ve así:

if (businessInitiationDate > cutoffDate)
  enableNewControlsForThisOneLittlePiece();
else
  enableOldControlsForThisOneLittlePiece();

Será muy difícil de mantener, incluso si parece más rápido en este momento. Por ejemplo, tal vez en algún momento algunos clientes mayores deseen la nueva apariencia. Tal vez en algún momento habrá una tercera configuración con su propia fecha de corte.

Idealmente, desea que esta instrucción if aparezca exactamente una vez en su código, preferiblemente en el lado del servidor. Sin embargo, también debe evitar duplicar toda la aplicación y realizar cambios. Encuentre el código común y factoréelo, luego cree pequeñas funciones separadas solo para las partes que son diferentes. Luego active o desactive esas funciones desde un lugar central.


6

Es un requisito, y aunque parece maloliente, básicamente una configuración basada en un valor de fecha y hora, no hay razón para que el tiempo no pueda usarse para alterar su IU. El estuche clásico es una pantalla de satélite que cambia de colores brillantes durante el día a un tema oscuro por la noche (y si es realmente dedicado, un color apagado en el medio).

Sin embargo, una cosa que puedo sugerir como una mejora es eliminar el concepto de una fecha que habilita los controles, pero un número de versión. La versión establece la configuración de la interfaz de usuario (es decir, tiene un indicador que, por ejemplo, está configurado para NewCustomer, y en el futuro se puede expandir para satisfacer los controles adicionales que NewNewCustomer desea, etc.). Esto es mucho más fácil de manejar en el código y huele mucho mejor.

Entonces solo tiene 1 problema que establece el número de versión en función de algunos criterios, y esto se puede hacer mediante una verificación de fecha hoy, posiblemente una opción de configuración del lado del servidor más tarde, o incluso una cookie que se establece mediante el inicio de sesión del usuario en algún momento el futuro.


5

Esto parece un caso especial de una pregunta más general: ¿es una mala práctica deshabilitar las características de la interfaz de usuario por razones específicas de acuerdo con reglas predefinidas? La respuesta, entonces, es "por supuesto que no". La entrega de fechas en particular puede ser complicada porque las fechas y las horas son difíciles , pero por principio general no hay una buena razón para no hacerlo si es lo que requieren los requisitos de su negocio.


3

Si los cambios tienen que ver con algún propósito comercial específico que es sensible a la fecha, entonces es un mal necesario.

Si se trata de implementar una revisión en el programa que cambiará el programa permanentemente, y el diseño anterior nunca se volverá a utilizar, entonces es mejor simplemente implementar una actualización en el momento correcto.


1
"Es mejor simplemente implementar una actualización en el momento correcto" Nitpick: No necesariamente ... Por ejemplo, la implementación puede requerir tiempo de inactividad, lo que no es práctico en el momento en que se debe realizar el cambio. O tal vez habrá un período de uso paralelo ... realmente depende.
sleske

O tal vez quieras tener un botón de "tocar cascabeles" el día de Navidad. Es posible que no desee tener que implementar esto cada Navidad.
sixtyfootersdude

2

Suena bien. Es bastante común que las IU se adapten a diferentes usuarios, por ejemplo, aquí en stackoverflow, se habilitan o deshabilitan diferentes características en función del karma de un usuario individual.

La razón por la que no le gusta es que obviamente agrega complejidad en relación con una solución en la que todos ven la misma interfaz de usuario. Sin embargo, la complejidad parece ser una complejidad esencial , es decir. Es un requisito comercial, no un artefacto de una mala decisión arquitectónica. Por supuesto, tendrá un costo (que debe comunicar a la empresa), pero si la empresa decide que vale la pena, debe implementarlo.

Riesgos conocidos: el mayor riesgo es probablemente probar la interfaz de usuario en las diversas configuraciones. Si comienza a habilitar / deshabilitar las características de la interfaz de usuario para varios grupos de usuarios, puede obtener rápidamente una explosión de posibles configuraciones.

También debe asegurarse de implementar las restricciones en la capa de lógica de negocios, de modo que verifique que los clientes no puedan realizar operaciones que no se les permite, incluso si la IU no lo hace posible en primer lugar:


Sí, las pruebas son realmente difíciles si la interfaz de usuario puede cambiar en función de varios factores. Si debe hacerse, debe hacerse, pero ayuda a mantener la variación al mínimo, y proporciona una manera de alternar la interfaz de usuario para la prueba, independientemente de cosas como la fecha actual.
sleske

2

Lo que está describiendo es el concepto de datación efectiva , que de ninguna manera es una idea novedosa y, en esencia, un tipo de problema temporal al que podría aplicar un patrón temporal .

Esencialmente, lo que haría en su base de datos es aplicar una fecha de vigencia a los módulos de formulario o las versiones de formulario (en este documento denominadas componentes), almacenando algunos metadatos sobre esos componentes y sus fechas de inicio / finalización efectivas. Por supuesto, también necesitará algunos datos sobre sus usuarios en la aplicación.

Parece que puede tener otras razones más convincentes para considerar reescribir esta aplicación. Si los problemas de citas efectivas son sus únicos problemas, sugeriría que quizás implementar una cita efectiva sea una mejor opción. Si no, tendrá que evaluar eso en función de su escenario.


1

Es una función que alterna con la activación en función de la fecha, que es perfectamente válida. Imagine si la función fuera solo para usar durante un período promocional, o si tuviera que finalizar cuando una nueva regulación gubernamental entre en vigencia en una fecha determinada.

Estás trabajando en APS.NET y JavaScript, pero el marco de trabajo de alternancia de características de Java Togglz específicamente tiene una regla de activación basada en fecha (¡y hora!) .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.