L'attivazione e la disattivazione delle funzionalità dell'interfaccia utente (o di altre) in base alle date, ha un odore di codice?


11

Abbiamo un terribile sistema scritto in ASP.NET 2.0 al quale dobbiamo aggiungere alcune funzionalità. Il problema è che un determinato prodotto ha funzionalità di interfaccia utente che devono essere attivate per l'attività avviata dopo una certa data (e altre disattivate), mentre la pagina deve apparire uguale per l'attività esistente.

Sto spingendo per una riscrittura della pagina per la nuova attività poiché istintivamente trovo l'idea di switch UI JavaScript basati sulla data e la combinazione di controlli Web per la vecchia e la nuova attività è "disordinata" (per mancanza di una parola migliore ).

La pratica di avere un'interfaccia utente basata sul tempo presenta una pratica ampiamente accettata e, in caso contrario, quali sono i rischi noti di perseguire tale linea d'azione?


13
Se i requisiti del tuo dominio aziendale specificano che alcune funzionalità non devono essere disponibili per l'utente se non entro un determinato intervallo di tempo, allora è "in base alla progettazione". Se non ti piace l'idea che i controlli ux appaiano e scompaiano, disabilitali invece di nasconderli. Indipendentemente da ciò, la tecnica è perfettamente valida.
Robert Harvey,

1
Trovo poco chiara la frase "attività avviata dopo una certa data". Intendi affari con la tua azienda (per i clienti che si iscrivono dopo una certa data) o affari avviati con il tuo cliente (quindi il tuo cliente può fare solo determinate cose con i dati nella sua app se il suo cliente si è registrato dopo una determinata data)? Nel primo caso, stai parlando delle funzionalità disponibili per i tuoi clienti. In quest'ultimo caso, stai parlando di limitare le azioni non valide su determinati dati (in base alle condizioni nei dati stessi). La risposta potrebbe essere molto diversa in quelle circostanze.
jpmc26,

Risposte:


22

Non c'è niente di sbagliato nel modificare un'interfaccia utente in base a quali funzionalità sono abilitate per un cliente o quali tipi di distribuzione hanno scelto, ma la modifica dovrebbe

  1. dipende da flag significativi, ad esempio "HAVE_EXPORT" per abilitare / disabilitare un'opzione di esportazione, non da confronti di date strane. L'interfaccia utente non è in grado di conoscere le regole aziendali su ciò che è stato pubblicato quando, dovrebbe adempiere solo alla sua attività dell'interfaccia utente e seguire le istruzioni specifiche dell'interfaccia utente.
  2. Essere controllati dal lato server, in modo che un cliente non possa abilmente abilitare abilmente le funzionalità per le quali non ha pagato.

(Nota il contrario: disabilitare le funzionalità dopo un certo tempo) è un no-no importante a meno che tu non abbia chiaramente comunicato che stai vendendo una versione di prova a tempo limitato. La creazione di tali bombe a tempo in qualsiasi altra circostanza farà odiare le persone sei più veloce di quasi ogni altra cosa.)


2
The UI has no business knowing the business rule about what was published when- Va bene, ma anche Stack Exchange ha tali regole dell'interfaccia utente. Ad esempio, il collegamento "elimina" non viene visualizzato per gli altri utenti per domande chiuse fino a quando non sono trascorsi due giorni e l'opzione Migrazione è disabilitata dopo 60 giorni.
Robert Harvey,

Ho chiarito la domanda in base a questa risposta: alcuni controlli verranno rimossi e altri verranno aggiunti, a seconda della data.
NM

13
@RobertHarvey, ma come viene programmato nella vista? È qualcosa di simile if (showDelete) { <button>delete</button> }o if ((post.date - today).days > 2) { <button>delete</button> }?
Arturo Torres Sánchez,

@ ArturoTorresSánchez: il primo: l'idea è quella di inserire nel server la logica aziendale (come il calcolo della data). Comunque, questo farebbe una bella domanda a parte :-).
sleske,

11

Il requisito in sé non è problematico, ma ci sono modi buoni e cattivi per implementarlo . Se il codice è stato copiato e incollato in tutto il luogo che appare come:

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

Sarà difficile da mantenere, anche se al momento sembra più veloce. Ad esempio, forse ad un certo punto alcuni clienti più anziani vorranno il nuovo look. Forse ad un certo punto ci sarà una terza configurazione con la sua data limite.

Idealmente, vuoi che questa istruzione appaia esattamente una volta nel tuo codice, preferibilmente sul lato server. Tuttavia, si desidera anche evitare di duplicare l'intera applicazione e apportare modifiche. Trova il codice comune e fattorizzalo, quindi crea piccole funzioni separate solo per le parti diverse. Quindi abilitare o disabilitare quelle funzioni da un posto centrale.


6

È un requisito e sebbene sembri puzzolente - fondamentalmente la configurazione basata su un valore datetime - non c'è motivo per cui il tempo non possa essere usato per modificare l'interfaccia utente. La custodia classica è un display satnav che cambia dai colori vivaci di giorno a un tema scuro di notte (e se sei davvero dedicato, un colore tenue nel mezzo).

Tuttavia, una cosa che posso suggerire come miglioramento è rimuovere il concetto di una data che abilita i controlli, ma un numero di versione. La versione imposta la configurazione dell'interfaccia utente (vale a dire che hai un flag per dire configurato per NewCustomer, e in futuro può essere espanso per soddisfare i controlli aggiuntivi che NewNewCustomer desidera e così via). Questo è molto più facile da gestire nel codice e ha un profumo molto più gradevole.

Quindi hai solo 1 problema che sta impostando il numero di versione in base ad alcuni criteri, e questo può essere fatto oggi tramite un controllo della data, possibilmente un'opzione di configurazione sul lato server in seguito, o anche un cookie che è stato impostato dall'accesso utente qualche volta in il futuro.


5

Questo sembra un caso speciale di una domanda più generale: è una cattiva pratica disabilitare le funzionalità dell'interfaccia utente per motivi specifici in base a regole predefinite? La risposta, quindi, è "certo che no". La gestione delle date, in particolare, può essere complicata perché le date e gli orari sono difficili , ma in linea di principio non c'è motivo di non farlo se è ciò che richiedono i requisiti aziendali.


3

Se i cambiamenti hanno a che fare con uno scopo commerciale specifico sensibile alla data, è un male necessario.

Se si tratta di distribuire una revisione al programma che cambierà il programma in modo permanente e il vecchio design non verrà mai più usato, allora è meglio semplicemente distribuire un aggiornamento al momento giusto.


1
"è meglio semplicemente distribuire un aggiornamento al momento giusto" Nitpick: Non necessariamente .... Ad esempio, l'implementazione potrebbe richiedere tempi di inattività, il che non è pratico nel momento in cui è necessario effettuare il passaggio. O forse ci sarà un periodo di uso parallelo ... dipende davvero.
sleske,

O forse vuoi avere un pulsante "suonare jingle bells" il giorno di Natale. Potrebbe non essere necessario distribuire questo ogni Natale.
sixtyfootersdude,

2

Suona bene. È abbastanza comune avere l'interfaccia utente adattarsi a diversi utenti, ad esempio qui su StackOverflow diverse funzionalità sono abilitate o disabilitate in base al karma di un singolo utente.

Il motivo per cui non ti piace è che ovviamente aggiunge complessità rispetto a una soluzione in cui tutti vedono la stessa UI. Tuttavia, la complessità sembra essere una complessità essenziale , vale a dire. è un requisito aziendale, non un artefatto di una cattiva decisione architettonica. Ovviamente avrà un costo (che dovresti comunicare all'azienda), ma se l'azienda decide che vale il costo, vai avanti e implementalo.

Rischi noti: il rischio maggiore è probabilmente quello di testare l'interfaccia utente nelle varie configurazioni. Se si inizia a abilitare / disabilitare le funzionalità dell'interfaccia utente per vari gruppi di utenti, è possibile ottenere rapidamente un'esplosione di possibili configurazioni.

È inoltre necessario assicurarsi di implementare le restrizioni nel livello di logica aziendale, in modo da verificare che i clienti non possano eseguire operazioni a cui non sono autorizzati, anche se l'interfaccia utente non dovrebbe renderlo possibile in primo luogo:


Sì, il test è davvero complicato se l'interfaccia utente può cambiare in base a vari fattori. Se deve essere fatto, deve essere fatto, ma aiuta a ridurre al minimo le variazioni e a fornire un modo per attivare l'interfaccia utente per i test, indipendentemente da cose come la data corrente.
sleske,

2

Quello che stai descrivendo è il concetto di datazione efficace , che non è affatto una nuova idea e al suo interno un tipo di problema temporale al quale potresti applicare un modello temporale .

In sostanza, ciò che si farebbe nel database è applicare una data di validità a entrambi i moduli del modulo o le versioni del modulo (di seguito denominati componenti), memorizzando alcuni metadati su tali componenti e le relative date di inizio / fine effettive. Ovviamente avrai bisogno anche di alcuni dati sui tuoi utenti nell'applicazione.

Sembra che potresti avere altri motivi più convincenti per considerare di riscrivere questa applicazione. Se i tuoi problemi di datazione efficaci sono i tuoi unici problemi, suggerirei che forse implementare una datazione efficace è un'opzione migliore. In caso contrario, dovrai valutarlo in base al tuo scenario.


1

È una funzione attiva / disattiva in base alla data, che è perfettamente valida. Immagina se la funzione dovesse essere utilizzata solo durante un periodo promozionale o se dovesse terminare quando una nuova regolamentazione del governo entrasse in vigore a una determinata data.

Stai lavorando in APS.NET e JavaScript, ma il funzionamento del frame di attivazione / disattivazione Java Togglz ha specificamente una regola di attivazione basata su data (e ora!) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.