L'activation et la désactivation des fonctionnalités de l'interface utilisateur (ou d'autres) sont-elles basées sur les dates, une odeur de code?


11

Nous avons un système horrible écrit en ASP.NET 2.0 auquel nous devons ajouter des fonctionnalités. Le problème est qu'un certain produit possède des fonctionnalités d'interface utilisateur qui doivent être activées pour les entreprises lancées après une certaine date (et d'autres désactivées), tandis que la page doit être identique pour les entreprises existantes.

Je pousse à une réécriture de la page pour les nouvelles entreprises car je trouve instinctivement l'idée de commutateurs d'interface utilisateur JavaScript basés sur la date, et le mélange des contrôles Web pour l'ancienne et la nouvelle entreprise est "désordonné" (à défaut d'un meilleur mot) ).

La pratique de disposer d'une interface utilisateur basée sur le temps est-elle une pratique largement acceptée, et sinon, quels sont les risques connus de poursuivre cette ligne de conduite?


13
Si les exigences de votre domaine d'activité spécifient que certaines fonctionnalités ne doivent pas être disponibles pour l'utilisateur, sauf dans un laps de temps particulier, alors c'est "par conception". Si vous n'aimez pas que les contrôles ux apparaissent et disparaissent, désactivez-les au lieu de les masquer. Quoi qu'il en soit, la technique est parfaitement valable.
Robert Harvey

1
Je trouve que l'expression "entreprise lancée après une certaine date" n'est pas claire. Voulez-vous dire des affaires avec votre entreprise (pour les clients s'inscrivant après une certaine date) ou des affaires initiées avec votre client (afin que votre client ne puisse faire certaines choses avec les données de son application que si son client s'est inscrit après une date particulière)? Dans le premier cas, vous parlez des fonctionnalités disponibles à vos clients. Dans ce dernier cas, vous parlez de restreindre les actions non valides sur certaines données (en fonction des conditions dans les données elles-mêmes). La réponse pourrait être très différente dans ces circonstances.
jpmc26

Réponses:


22

Il n'y a rien de mal à modifier une interface utilisateur en fonction des fonctionnalités activées pour un client ou des types de déploiement qu'ils ont choisis, mais le changement devrait

  1. dépendent de drapeaux significatifs, par exemple "HAVE_EXPORT" pour activer / désactiver une option d'exportation, pas de comparaisons de dates étranges. L'interface utilisateur n'a aucune raison de connaître la règle métier sur ce qui a été publié quand, elle doit remplir uniquement sa tâche d'interface utilisateur et obéir aux instructions spécifiques à l'interface utilisateur.
  2. Soyez contrôlé côté serveur, afin qu'un client ne puisse pas activer subrepticement des fonctionnalités pour lesquelles il n'a pas payé.

(Notez que l'opposé - désactiver les fonctionnalités après un certain temps - est un non-non majeur à moins que vous n'ayez clairement indiqué que vous vendez une version d'essai limitée dans le temps. La création de telles bombes à retardement dans toute autre circonstance incitera les gens à la haine vous plus rapidement que presque toute autre chose.)


2
The UI has no business knowing the business rule about what was published when- D'accord, mais même Stack Exchange a de telles règles d'interface utilisateur. Par exemple, le lien "supprimer" n'apparaît pas pour les autres utilisateurs sur les questions fermées avant que deux jours ne se soient écoulés et l'option de migration est désactivée après 60 jours.
Robert Harvey

J'ai clarifié la question sur la base de cette réponse: certains contrôles vont être supprimés, et d'autres seront ajoutés, selon la date.
NMrt

13
@RobertHarvey, mais comment est-il programmé dans la vue? Est-ce quelque chose comme if (showDelete) { <button>delete</button> }ou if ((post.date - today).days > 2) { <button>delete</button> }?
Arturo Torres Sánchez

@ ArturoTorresSánchez: Le premier - l'idée est de mettre la logique métier (comme le calcul de la date) dans le serveur. Quoi qu'il en soit, cela ferait une bonne question en soi :-).
sleske

11

L'exigence elle-même n'est pas problématique, mais il existe de bonnes et de mauvaises façons de la mettre en œuvre . Si vous avez copié et collé du code partout, cela ressemble à:

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

Cela va être difficile à maintenir, même si cela semble plus rapide pour le moment. Par exemple, à un moment donné, certains clients plus âgés voudront le nouveau look. Peut-être qu'à un moment donné, il y aura une troisième configuration avec sa propre date limite.

Idéalement, vous voulez que cette instruction if apparaisse exactement une fois dans votre code, de préférence côté serveur. Cependant, vous devez également éviter de simplement dupliquer l'application entière et apporter des modifications. Trouvez le code commun et factorisez-le, puis créez de petites fonctions distinctes pour les parties qui sont différentes. Activez ou désactivez ensuite ces fonctions à partir d'un emplacement central.


6

C'est une exigence, et bien qu'il semble malodorant - essentiellement une configuration basée sur une valeur datetime - il n'y a aucune raison pour que le temps ne puisse pas être utilisé pour modifier votre interface utilisateur. Le boîtier classique est un écran de satnav qui passe de couleurs vives pendant la journée à un thème sombre la nuit (et si vous êtes vraiment dédié, une couleur en sourdine entre les deux).

Cependant, une chose que je peux suggérer comme amélioration est de supprimer le concept d'une date qui active les contrôles, mais un numéro de version. La version définit la configuration de l'interface utilisateur (c'est-à-dire que vous avez un indicateur à dire configuré pour NewCustomer, et à l'avenir peut être étendu pour répondre aux contrôles supplémentaires que NewNewCustomer veut, et ainsi de suite). Ceci est beaucoup plus facile à gérer dans le code et sent beaucoup plus agréable.

Ensuite, vous n'avez qu'un seul problème qui définit le numéro de version en fonction de certains critères, et cela peut être fait par une vérification de la date aujourd'hui, peut-être une option de configuration côté serveur plus tard, ou même un cookie qui est défini par la connexion de l'utilisateur à un moment donné dans l'avenir.


5

Cela ressemble à un cas particulier d'une question plus générale: est-ce une mauvaise pratique de désactiver les fonctionnalités de l'interface utilisateur pour des raisons spécifiques selon des règles prédéfinies? La réponse est donc «bien sûr que non». La remise des dates en particulier peut être délicate car les dates et les heures sont difficiles , mais en principe, il n'y a aucune bonne raison de ne pas le faire si c'est ce que vos besoins commerciaux exigent.


3

Si les changements ont à voir avec un objectif commercial spécifique qui est sensible à la date, alors c'est un mal nécessaire.

S'il s'agit de déployer une révision du programme qui modifiera le programme de façon permanente et que l'ancienne conception ne sera plus jamais utilisée, il est préférable de simplement déployer une mise à jour au bon moment.


1
"il vaut mieux simplement déployer une mise à jour au bon moment" Nitpick: Pas nécessairement .... Par exemple, le déploiement peut nécessiter un temps d'arrêt, ce qui n'est pas pratique au moment où le changement doit être effectué. Ou peut-être qu'il y aura une certaine période d'utilisation parallèle ... cela dépend vraiment.
sleske

Ou peut-être que vous voulez avoir un bouton "jouer aux cloches" le jour de Noël. Vous ne voudrez peut-être pas avoir à déployer cela à chaque Noël.
sixtyfootersdude

2

Sonne bien. Il est assez courant que l'interface utilisateur s'adapte à différents utilisateurs, par exemple ici sur stackoverflow, différentes fonctionnalités sont activées ou désactivées en fonction du karma d'un utilisateur individuel.

La raison pour laquelle vous ne l'aimez pas est qu'elle ajoute évidemment de la complexité par rapport à une solution où tout le monde voit la même interface utilisateur. Cependant, la complexité semble être une complexité essentielle , à savoir. c'est une exigence commerciale, pas un artefact d'une mauvaise décision architecturale. Bien sûr, cela aura un coût (que vous devez communiquer à l'entreprise), mais si l'entreprise décide que cela en vaut la peine, vous allez le mettre en œuvre.

Risques connus: Le plus grand risque est probablement de faire tester l'interface utilisateur dans les différentes configurations. Si vous commencez à activer / désactiver les fonctionnalités de l'interface utilisateur pour différents groupes d'utilisateurs, vous pouvez rapidement obtenir une explosion de configurations possibles.

Vous devez également vous assurer d'implémenter les restrictions dans la couche logique métier, afin de vérifier que les clients ne peuvent pas effectuer des opérations auxquelles ils ne sont pas autorisés, même si l'interface utilisateur ne doit pas le permettre en premier lieu:


Oui, les tests sont vraiment difficiles si l'interface utilisateur peut changer en fonction de divers facteurs. Si cela doit être fait, cela doit être fait, mais cela aide à garder la variation au minimum - et à fournir un moyen de basculer l'interface utilisateur pour les tests, indépendamment de choses comme la date actuelle.
sleske

2

Ce que vous décrivez est le concept de datation efficace , qui n'est en aucun cas une idée nouvelle et à la base un type de problème temporel auquel vous pourriez appliquer un modèle temporel .

Essentiellement, ce que vous feriez dans votre base de données est d'appliquer une date d'entrée en vigueur aux modules de formulaire ou aux versions de formulaire (appelés ici composants), en stockant certaines métadonnées sur ces composants et leurs dates de début / fin effectives. Vous aurez bien sûr également besoin de données sur vos utilisateurs dans l'application.

Il semble que vous ayez d'autres raisons plus convaincantes d'envisager de réécrire cette application. Si les problèmes de rencontres efficaces sont vos seuls problèmes, je dirais que peut-être la mise en œuvre de rencontres efficaces est une meilleure option. Sinon, vous devrez évaluer cela en fonction de votre scénario.


1

C'est une fonction qui bascule avec l'activation en fonction de la date - ce qui est parfaitement valable. Imaginez si la fonctionnalité était uniquement destinée à être utilisée pendant une période promotionnelle, ou devait se terminer lorsqu'un nouveau règlement gouvernemental entre en vigueur à une certaine date.

Vous travaillez dans APS.NET et JavaScript, mais le cadre de basculement des fonctionnalités Java Togglz a spécifiquement une règle d'activation basée sur la date (et l'heure!) .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.