Ist das Ein- und Ausschalten von UI-Funktionen (oder anderen Funktionen) basierend auf Datumsangaben ein Codegeruch?

11

Wir haben ein schreckliches System in ASP.NET 2.0 geschrieben, dem wir einige Funktionen hinzufügen müssen. Das Problem besteht darin, dass ein bestimmtes Produkt über UI-Funktionen verfügt, die für Unternehmen aktiviert werden müssen, die nach einem bestimmten Datum gestartet wurden (und andere deaktiviert wurden), während die Seite für bestehende Unternehmen gleich angezeigt werden muss.

Ich dränge auf eine Neufassung der Seite für neue Unternehmen, da ich instinktiv die Idee datumsbasierter JavaScript-UI-Schalter und das Mischen von Websteuerelementen für alte und neue Unternehmen als "unordentlich" empfinde (aus Mangel an einem besseren Wort) ).

Ist die Praxis der zeitbasierten Benutzeroberfläche eine allgemein akzeptierte Praxis, und wenn nicht, welche Risiken sind bekannt, wenn diese Vorgehensweise verfolgt wird?

NMrt
quelle
13
Wenn in Ihren Geschäftsdomänenanforderungen festgelegt ist, dass einige Funktionen dem Benutzer nur innerhalb eines bestimmten Zeitraums zur Verfügung stehen sollen, handelt es sich um "beabsichtigt". Wenn Ihnen die Idee, dass UX-Steuerelemente angezeigt und ausgeblendet werden, nicht gefällt, deaktivieren Sie sie, anstatt sie auszublenden. Unabhängig davon ist die Technik vollkommen gültig.
Robert Harvey
1
Ich finde den Ausdruck "Geschäft nach einem bestimmten Datum begonnen" unklar. Meinen Sie das Geschäft mit Ihrem Unternehmen (für Kunden, die sich nach einem bestimmten Datum anmelden) oder das Geschäft mit Ihrem Kunden (damit Ihr Kunde bestimmte Dinge mit den Daten in seiner App nur tun kann, wenn sich sein Kunde nach einem bestimmten Datum angemeldet hat)? Im ersteren Fall sprechen Sie Ihren Kunden über verfügbare Funktionen. Im letzteren Fall geht es darum, ungültige Aktionen für bestimmte Daten einzuschränken (basierend auf den Bedingungen in den Daten selbst). Die Antwort könnte unter diesen Umständen sehr unterschiedlich sein.
jpmc26

Antworten:

22

Es ist nichts Falsches daran, eine Benutzeroberfläche basierend darauf zu optimieren, welche Funktionen für einen Kunden aktiviert sind oder welche Bereitstellungstypen er ausgewählt hat, aber die Änderung sollte

  1. hängen von aussagekräftigen Flags ab, z. B. "HAVE_EXPORT", um eine Exportoption zu aktivieren / deaktivieren, nicht von seltsamen Datumsvergleichen. Die Benutzeroberfläche kennt die Geschäftsregel nicht, was wann veröffentlicht wurde. Sie sollte nur ihre Benutzeroberflächenaufgabe erfüllen und UI-spezifische Anweisungen befolgen.
  2. Serverseitig gesteuert werden, damit ein Kunde Funktionen, für die er nicht bezahlt hat, nicht heimlich aktivieren kann.

(Beachten Sie, dass das Gegenteil - dis abling Funktionen nach einer gewissen Zeit - ist eine große no-no , wenn Sie klar kommuniziert haben , dass Sie eine zeitlich begrenzte Testversion verkaufst solche Erstellen. Zeitbomben unter anderen Umständen werden die Menschen hassen Sie schneller als fast alles andere.)

Kilian Foth
quelle
2
The UI has no business knowing the business rule about what was published when- Okay, aber selbst Stack Exchange hat solche UI-Regeln. Beispielsweise wird der Link "Löschen" für andere Benutzer bei geschlossenen Fragen erst nach Ablauf von zwei Tagen angezeigt, und die Migrationsoption wird nach 60 Tagen deaktiviert.
Robert Harvey
Ich habe die Frage anhand dieser Antwort geklärt: Einige Steuerelemente werden entfernt, andere werden je nach Datum hinzugefügt.
NMrt
13
@ RobertHarvey, aber wie ist es in der Ansicht programmiert? Ist es so etwas wie if (showDelete) { <button>delete</button> }oder if ((post.date - today).days > 2) { <button>delete</button> }?
Arturo Torres Sánchez
@ ArturoTorresSánchez: Ersteres - die ganze Idee ist, die Geschäftslogik (wie die Datumsberechnung) in den Server zu integrieren. Jedenfalls wäre das eine gute Frage für sich :-).
Sleske
11

Die Anforderung selbst ist nicht problematisch, aber es gibt gute und schlechte Möglichkeiten, sie umzusetzen . Wenn Sie Code kopiert und überall eingefügt haben, sieht es so aus:

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

Das wird verrückt schwer zu pflegen sein, auch wenn es im Moment schneller zu sein scheint. Zum Beispiel möchten einige ältere Kunden vielleicht irgendwann den neuen Look. Vielleicht gibt es irgendwann eine dritte Konfiguration mit einem eigenen Stichtag.

Idealerweise soll diese if-Anweisung genau einmal in Ihrem Code erscheinen, vorzugsweise auf der Serverseite. Sie möchten jedoch auch vermeiden, nur die gesamte Anwendung zu duplizieren und Änderungen vorzunehmen. Finden Sie den gemeinsamen Code und faktorisieren Sie ihn. Erstellen Sie dann kleine separate Funktionen nur für die Teile, die unterschiedlich sind. Aktivieren oder deaktivieren Sie diese Funktionen dann von einem zentralen Ort aus.

Karl Bielefeldt
quelle
6

Dies ist eine Anforderung, und obwohl es stinkend zu sein scheint - im Grunde genommen basiert die Konfiguration auf einem Datum / Uhrzeit-Wert -, gibt es keinen Grund, warum die Zeit nicht zum Ändern Ihrer Benutzeroberfläche verwendet werden kann. Das klassische Gehäuse ist ein Navigationsdisplay, das tagsüber von hellen Farben zu nachts zu einem dunklen Thema wechselt (und wenn Sie wirklich engagiert sind, zwischendurch zu einer gedämpften Farbe).

Als Verbesserung kann ich jedoch vorschlagen, das Konzept eines Datums zu entfernen, das die Steuerelemente aktiviert, jedoch eine Versionsnummer. Die Version legt die UI-Konfiguration fest (dh Sie haben ein Flag, das für NewCustomer konfiguriert ist, und können in Zukunft erweitert werden, um die zusätzlichen Steuerelemente zu berücksichtigen, die NewNewCustomer benötigt, und so weiter). Dies ist im Code viel einfacher zu handhaben und riecht viel besser.

Dann haben Sie nur ein Problem, bei dem die Versionsnummer anhand einiger Kriterien festgelegt wird. Dies kann durch eine heutige Datumsprüfung, möglicherweise eine serverseitige Konfigurationsoption später oder sogar durch ein Cookie erfolgen, das durch die Benutzeranmeldung festgelegt wird die Zukunft.

gbjbaanb
quelle
5

Dies scheint ein Sonderfall einer allgemeineren Frage zu sein: Ist es eine schlechte Praxis, Benutzeroberflächenfunktionen aus bestimmten Gründen gemäß vordefinierten Regeln zu deaktivieren? Die Antwort lautet also "natürlich nicht". Insbesondere die Übergabe von Daten kann schwierig sein, da Daten und Zeiten schwierig sind. Grundsätzlich gibt es jedoch keinen guten Grund, dies nicht zu tun, wenn dies Ihren geschäftlichen Anforderungen entspricht.

Mason Wheeler
quelle
3

Wenn die Änderungen mit einem bestimmten Geschäftszweck zu tun haben, der datumsabhängig ist, ist dies ein notwendiges Übel.

Wenn es darum geht, eine Revision des Programms bereitzustellen, die das Programm dauerhaft ändert, und das alte Design nie wieder verwendet wird, ist es besser, einfach ein Update zum richtigen Zeitpunkt bereitzustellen.

Robert Harvey
quelle
1
"Es ist besser, einfach ein Update zum richtigen Zeitpunkt bereitzustellen" Nitpick: Nicht unbedingt .... Beispielsweise kann die Bereitstellung Ausfallzeiten erfordern, was zum Zeitpunkt des Wechsels nicht praktikabel ist. Oder vielleicht wird es eine gewisse Zeit der parallelen Nutzung geben ... es kommt wirklich darauf an.
Sleske
Oder vielleicht möchten Sie am Weihnachtstag einen "Jingle Bells spielen" -Button haben. Möglicherweise möchten Sie dies nicht jedes Jahr zu Weihnachten bereitstellen müssen.
Sixtyfootersdude
2

Klingt gut. Es ist durchaus üblich, dass Benutzeroberflächen an unterschiedliche Benutzer angepasst werden, z. B. werden beim Stackoverflow verschiedene Funktionen basierend auf dem Karma eines einzelnen Benutzers aktiviert oder deaktiviert.

Der Grund, warum Sie es nicht mögen, ist, dass es offensichtlich die Komplexität einer Lösung erhöht, bei der jeder die gleiche Benutzeroberfläche sieht. Die Komplexität scheint jedoch eine wesentliche Komplexität zu sein , d. H. Es ist eine Geschäftsanforderung, kein Artefakt einer schlechten architektonischen Entscheidung. Natürlich hat es Kosten (die Sie dem Unternehmen mitteilen sollten), aber wenn das Unternehmen entscheidet, dass es die Kosten wert ist, setzen Sie es um.

Bekannte Risiken: Das größte Risiko besteht wahrscheinlich darin, die Benutzeroberfläche in den verschiedenen Konfigurationen testen zu lassen. Wenn Sie anfangen, UI-Funktionen für verschiedene Benutzergruppen zu aktivieren / deaktivieren, können Sie schnell eine Explosion möglicher Konfigurationen erhalten.

Sie sollten auch sicherstellen, dass die Einschränkungen in der Geschäftslogikschicht implementiert sind, damit Sie sicherstellen, dass Kunden keine Vorgänge ausführen können, die sie nicht ausführen dürfen, auch wenn die Benutzeroberfläche dies überhaupt nicht ermöglichen sollte:

JacquesB
quelle
Ja, das Testen ist wirklich schwierig, wenn sich die Benutzeroberfläche aufgrund verschiedener Faktoren ändern kann. Wenn es gemacht werden muss, muss es gemacht werden, aber es hilft, die Variation auf ein Minimum zu beschränken - und eine Möglichkeit zu bieten, die Benutzeroberfläche zum Testen umzuschalten, unabhängig von Dingen wie dem aktuellen Datum.
Sleske
2

Was Sie beschreiben, ist das Konzept der effektiven Datierung , das keineswegs eine neuartige Idee ist und im Kern eine Art zeitliches Problem darstellt, auf das Sie ein zeitliches Muster anwenden können .

Im Wesentlichen , was würden Sie in Ihrer Datenbank zu tun ist , ein Datum des Inkrafttretens gelten entweder Form Module oder Form Versionen (hier als Komponenten), die Speicherung einige Metadaten über diese Komponenten und deren effektive Start- / Enddaten. Natürlich benötigen Sie auch einige Daten zu Ihren Benutzern in der Anwendung.

Es hört sich so an, als hätten Sie andere zwingende Gründe, diese Anwendung neu zu schreiben. Wenn effektive Dating-Probleme Ihre einzigen Probleme sind, würde ich vorschlagen, dass die Implementierung von effektivem Dating möglicherweise eine bessere Option ist. Wenn nicht, müssen Sie dies anhand Ihres Szenarios bewerten.

Ravibhagw
quelle
1

Es ist eine Funktion, bei der die Aktivierung basierend auf dem Datum umgeschaltet wird - was vollkommen gültig ist. Stellen Sie sich vor, die Funktion würde nur während eines Werbezeitraums verwendet oder müsste beendet werden, wenn zu einem bestimmten Zeitpunkt eine neue Regierungsverordnung in Kraft tritt.

Sie arbeiten in APS.NET und JavaScript, aber das Java-Feature-Toggle-Frame-Werk Togglz verfügt speziell über eine auf Datum (und Uhrzeit!) Basierte Aktivierungsregel .

user11393
quelle