Ich hatte den Eindruck, dass mittlerweile alle zustimmen, dass diese Maxime ein Fehler war. Aber ich habe kürzlich diese Antwort gesehen, bei der ein Kommentar mit der Überschrift "Sei nachsichtig" 137-mal angehoben wurde (Stand heute).
Meiner Meinung nach war die Milde gegenüber dem, was die Browser akzeptieren, die direkte Ursache für das völlige Durcheinander, das HTML und einige andere Webstandards vor ein paar Jahren angerichtet haben und das sich erst vor kurzem ordnungsgemäß aus diesem Durcheinander herauskristallisiert hat. Die Art und Weise, wie ich es sehe, wird dazu führen , dass Sie nachsichtig mit dem umgehen, was Sie akzeptieren .
Der zweite Teil der Maxime lautet "Fehlerhafte Eingaben stillschweigend verwerfen, ohne eine Fehlermeldung zurückzugeben, sofern dies nicht in der Spezifikation vorgeschrieben ist" , und dies fühlt sich grenzwertig an. Jeder Programmierer, der seinen Kopf an die Wand gestoßen hat, wenn etwas stillschweigend versagt, weiß, was ich meine.
Also, liege ich da völlig falsch? Sollte mein Programm nachsichtig sein, was es akzeptiert und Fehler stillschweigend verschluckt? Oder interpretiere ich falsch, was das bedeuten soll?
Die ursprüngliche Frage lautete "Programm", und ich gehe davon aus, dass dies jedermanns Sache ist. Es kann sinnvoll sein, Programme nachsichtig zu gestalten. Was ich jedoch wirklich gemeint habe, sind APIs: Schnittstellen, die anderen Programmen und nicht Menschen ausgesetzt sind . HTTP ist ein Beispiel. Das Protokoll ist eine Schnittstelle, die nur andere Programme verwenden. Die Daten, die in Überschriften wie "If-Modified-Since" stehen, werden nie direkt angegeben.
Die Frage ist also: Sollte der Server, der einen Standard implementiert, nachsichtig sein und Daten in mehreren anderen Formaten zulassen, zusätzlich zu dem, der vom Standard tatsächlich benötigt wird? Ich bin der Meinung, dass "Nachsicht" eher für diese Situation gelten soll als für menschliche Schnittstellen.
Wenn der Server nachsichtig ist, scheint dies eine allgemeine Verbesserung zu sein, aber in der Praxis führt dies meiner Meinung nach nur dazu, dass Clientimplementierungen auf die Nachsicht angewiesen sind und daher nicht mit einem anderen Server zusammenarbeiten, der auf etwas andere Weise nachsichtig ist.
Sollte ein Server, der eine API zur Verfügung stellt, nachsichtig sein oder ist das eine sehr schlechte Idee?
Nun zum schonenden Umgang mit Benutzereingaben. Betrachten Sie YouTrack (eine Bug-Tracking-Software). Es wird eine Sprache für die Texteingabe verwendet, die an Markdown erinnert. Nur dass es "nachsichtig" ist. Zum Beispiel schreiben
- foo
- bar
- baz
ist keine dokumentierte Methode zum Erstellen einer Liste mit Aufzählungszeichen, und dennoch hat es funktioniert. Folglich wurde es in unserem internen Bugtracker häufig verwendet. Die nächste Version kommt heraus und diese milde Funktion beginnt etwas anders zu funktionieren, was eine Reihe von Listen zerstört, die diese (Nicht-) Funktion (falsch) verwendet haben. Die dokumentierte Möglichkeit, Listen mit Aufzählungszeichen zu erstellen, funktioniert natürlich weiterhin.
Sollte meine Software in Bezug auf die Benutzereingaben, die sie akzeptiert , nachsichtig sein ?
quelle
Antworten:
Natürlich hast du vollkommen recht. Programme sollten niemals „mild“ sein, da dies nur dazu dient, Probleme zu maskieren. Probleme sollten hervorgehoben und nicht unter den Teppich gekehrt werden. Eine informative Fehlermeldung ist ein absolutes Muss, damit ein Programm für den Benutzer hilfreich ist.
In den meisten Fällen, in denen falsche / ungültige Daten angegeben wurden, wusste der Anbieter dieser Daten (unabhängig davon, ob es sich um einen Benutzer oder die Ausgabe eines anderen Programms handelt) wahrscheinlich nicht, dass diese ungültig sind. Das Verschlucken des Fehlers wird sie in der Überzeugung halten, dass er gültig ist (oder sein könnte), was ungültige Daten vermehrt.
Die einzige Möglichkeit für die Interoperation von Systemen besteht darin, dass diese Interoperation vollständig und eindeutig definiert ist. Ein Programm, das Daten außerhalb der Spezifikation akzeptiert, akzeptiert diese Daten de facto , auch wenn sie von der Spezifikation ungültig sind. Dies erschwert nicht nur die Kompatibilität, sondern bedeutet auch, dass sie nicht mehr formal definiert sind. Das Programm selbst ist jetzt der De-facto- Standard. Es ist daher unmöglich, milde Programme weiterzuentwickeln oder zu ersetzen, da Sie nicht die kleinste Änderung an der Funktionsweise vornehmen können.
quelle
Ich denke, dass alles davon abhängt, wer Ihre Zielgruppe ist. Wenn es Programmierer sind, dann absolut nicht. Ihr Programm sollte scheitern und einen blutigen Mord begehen. Wenn Ihre Zielgruppe jedoch keine Programmierer ist, sollte Ihr Programm nachsichtig sein und Ausnahmen angemessen behandeln, andernfalls flüstern Sie einen süßen, blutigen Mord.
Nehmen Sie als Fallstudie den NPAPI Flash Player. Es gibt eine "Release" -Version für diejenigen, denen 99% der auftretenden Fehler egal sind, aber es gibt auch eine "Debug" -Version, die verwendet werden kann, wenn irgendetwas schief geht. Jede Unterstützung spielt offensichtlich Flash-Inhalte ab, zielt jedoch auf zwei völlig unterschiedliche demografische Merkmale ab.
Am Ende denke ich, dass das Wichtigste ist: Was interessiert Ihre Benutzer?
quelle
Es gibt zwei Arten von "Nachsicht": Eine besteht darin, falsche Eingaben zu akzeptieren und einen Sinn daraus zu ziehen, und die andere darin, verschiedene Arten von Eingaben zu akzeptieren.
Im Allgemeinen möchten Sie immer die zweite, wenn es machbar ist. Der erste ist, wenn du schnell und hart stirbst. Ein Beispiel: Termine.
Hier sind einige Beispieleingaben, einschließlich gültiger, ungültiger und mehrdeutiger.
2011-01-02
01/02/2011
Jan 2, 2011
2-Jan-2011
Green
Es gibt nur eine ungültige Eingabe hier:
Green
. Versuchen Sie nicht einmal, es als Datum zu akzeptieren. DaGreen
es sich offensichtlich nicht um ein Datum handelt, ist dies ein Fall, in dem ein stilles Versagen akzeptabel ist.01/02/2011
ist gültig, aber nicht eindeutig. Sie wissen nicht unbedingt, ob es sich um ein US-Datum handelt (2. Januar) oder nicht (1. Februar). Hier ist es wahrscheinlich am besten, laut zu scheitern und den Benutzer nach einem eindeutigen Datum zu fragen.2011-01-02
wird normalerweise als eindeutig angesehen, daher ist es oft in Ordnung, davon auszugehen, dass es sich um das Format "JJJJ-MM-TT" handelt, und erst später zu einem Fehlschlag zu führen. Bei Benutzereingaben ist dies jedoch eine Art Urteilsvermögen.Jan 2, 2011
und2-Jan-2011
gültig und eindeutig sind, sollten sie akzeptiert werden. EsThe Second of January of the year 2011
ist jedoch auch gültig und eindeutig, aber der Nachsicht halber so weit zu gehen , ist übertrieben. Mach weiter und versag es leise, genauso wieGreen
.Kurz gesagt lautet die Antwort "es kommt darauf an". Sehen Sie sich an, was eingegeben werden kann, und vergewissern Sie sich, dass Sie niemals widersprüchliche Eingaben akzeptieren (z. B.
DD/MM/YYYY
vsMM/DD/YYYY
).Im Kontext der verknüpften Frage / des verknüpften Kommentars ist das ein Fall von
2011-01-02
. Die Eingabe sieht wie JSON aus und wird wie JSON validiert, auch wenn der Mimetyp falsch ist. Fahren Sie fort und versuchen Sie, es zu verwenden, auch wenn es irgendwann später nicht mehr funktioniert.quelle
2011-01-02
,Jan 2, 2011
und2-Jan-2011
, wenn es nicht zu schwierig zu implementieren), nicht in dem, was es gibt . Zukünftige Clients für diese API müssen nicht einmal etwas über eine bestimmte API wissen, solange sie eine davon korrekt eingeben. Im Idealfall konvertiert die API-Ebene alle diese Elemente in dieselbe interne Darstellung, die der Code verwendet, bevor er sie weitergibt.2011-01-02
Format vorliegen, und das ist das, was Sie in Ihre Dokumentation aufnehmen würden. Ich sehe überhaupt keine schädlichen Auswirkungen.Stilles Scheitern ist das Schlimmste, was Sie jemals tun konnten. Haben Sie versucht, eine API mit unbeaufsichtigtem Fehler zu debuggen? Es ist unmöglich .
Es gibt "Tun Sie Ihr Bestes, um sich zu erholen, aber senden Sie einen detaillierten Fehler" und es gibt "Stiller Fehler".
quelle
Mir scheint, dass für einen JSON-Service das Gesetz von Postel besprochen wird: "Sei konservativ in dem, was du tust, sei liberal in dem, was du von anderen akzeptierst." Dies gilt normalerweise für Webdienste und nicht für die Benutzeroberfläche.
Für die Benutzeroberfläche ist konstruktives Benutzerfeedback und das Verhindern von Benutzereingaben die Faustregel, die wir verwenden.
quelle
Ich denke, das wird in Kapitel 1, Abschnitt 6 von TAOUP gut behandelt. Insbesondere die Reparaturregel , die besagt, dass ein Programm mit einer Eingabe das tun soll, was es kann, gibt korrekte Daten weiter. Wenn die korrekte Antwort ein Fehler ist, tun Sie dies so schnell wie möglich.
Ein ähnliches Konzept ist die defensive Programmierung . Sie wissen nicht , welche Art von Input Sie erhalten, aber Ihr Programm sollte robust genug sein, um alle Fälle abzudecken . Das heißt , es sollte in Rückforderungsfälle , bekannte Probleme wie verstümmelte Eingang, so programmiert werden , und einen Haken alle Fall handle Unbekannten.
So verwirft leise fehlerhafte Eingabe ist in Ordnung, so lange , wie Sie sind , dass die Eingabe der Handhabung. Sie sollten es niemals einfach so auf den Boden fallen lassen.
Für eine API denke ich, dass es das gleiche ist wie für ein Programm, nachsichtig zu sein. Die Eingabe ist immer noch falsch , aber Sie versuchen, so viel wie möglich zu reparieren. Der Unterschied ist, was als gültige Reparatur angesehen wird . Wie Sie bereits betont haben, kann eine milde API Probleme verursachen, da Benutzer "Funktionen" verwenden, die nicht vorhanden sind.
Natürlich ist eine API nur eine niedrigere Version der Kompositionsregel . Als solches wird es wirklich von der Regel der geringsten Überraschung erfasst , da es sich um eine Schnittstelle handelt.
Vermeiden Sie, wie das Zitat von Spencer feststellt, oberflächliche Ähnlichkeiten, die über "unscharfe" Eingaben diskutiert werden können. Unter diesen Umständen würde ich normalerweise behaupten, dass alles darauf hindeutet , dass das Programm nicht repariert werden kann, da es nicht weiß, was gewünscht wird, und es ist für die Anwenderbasis am wenigsten überraschend.
Sie haben es jedoch mit Daten zu tun , die viele "Standards" haben. Manchmal werden diese sogar in einem einzigen Programm (Kette) gemischt. Da Sie wissen, dass ein Datum erwartet wird, ist der Versuch, das Datum zu erkennen, nur ein gutes Design. Vor allem, wenn das Datum von einem externen Programm stammt und auf dem Weg zu Ihnen eine Sekunde lang unverändert weitergegeben wird.
quelle
Programme, die die meiste Zeit auf dem Server bereitgestellt werden, müssen jede Minute oder manchmal jede Sekunde Tausende von Anforderungen erfüllen. Wenn ein Serverprogramm fehlerhafte Eingaben von Clients akzeptiert und korrigiert, hat es leider zwei Nachteile:
Serverprogramme sollten keine fehlerhaften Eingaben akzeptieren, aber die Server sollten eine Fehlermeldung an den Client zurückgeben, wenn eine fehlerhafte Eingabe vorliegt.
quelle
Konzeptionell ist es ideal, das zu tun, was sicher getan werden kann, und gleichzeitig sicherzustellen, dass jemand, der Probleme beheben kann, auf irgendeine Weise darüber informiert wird. In der Praxis ist es natürlich oft unmöglich, die letztgenannte Einschränkung direkt zu erfüllen, und so wird die Frage am besten, um mit zweifelhaften Eingaben umzugehen.
Eine Sache, die beim Entwerfen eines Protokolls, einer Formatierungsspezifikation oder einer "Sprache" sehr hilfreich sein kann, ist die Möglichkeit, vier Kategorien von potenziellen nicht verstandenen Elementen zu unterscheiden:
Eine genau festgelegte Konvention, mit der Apps, die eine beliebige Version eines Datenformats lesen können, erkennen können, welche Kategorie für etwas geeignet ist, das in Übereinstimmung mit späteren Versionen erstellt wurde, ist ein weitaus besserer Ansatz als der Versuch, Ad-hoc-Kompatibilitätsmaßnahmen zu ergreifen später. Wenn ein Dateiformat beispielsweise Zeilen der Form "Tag: Wert" enthält, kann angegeben werden, dass das erste Zeichen eines Tags die Kategorie angibt, zu der es gehört. Für Tags der Kategorien für unbeaufsichtigtes Ignorieren kann das erste Zeichen auch die Version des Standards angeben, für die das Tag gültig sein soll (wenn also ein Tag für unbeaufsichtigtes Ignorieren in Version 3 von vorhanden sein soll) Standardmäßig würde ein Parser für die Version dies ignorieren, aber ein Parser für die Version 3 oder höher würde quietschen, wenn er es nicht analysieren könnte.
Das Wichtigste ist in jedem Fall, nicht mehrdeutige oder missverstandene Daten in fehlerhafte Daten umzuwandeln. In einigen Fällen ist es möglicherweise besser, die Weitergabe von mehrdeutigen Daten überhaupt nicht zuzulassen, in anderen Fällen ist es möglicherweise besser, sie genau so weiterzugeben, wie sie empfangen wurden, wenn der Empfänger sie als eindeutig ansieht. Was wirklich gefährlich ist, wenn nicht geradezu böse, ist die Konvertierung von Daten mit unterschiedlichen Annahmen, z. B. die Konvertierung einer Liste von Daten wie:
in eine Liste von Daten wie
Selbst wenn man eine Liste mit ein paar falsch eingegebenen Daten hätte, könnte es für einen Menschen möglich sein, anhand einer Liste im Originalformat festzustellen, welches Format korrekt war, und zweifelhafte Werte für die weitere Recherche zu kennzeichnen (Abgleich mit anderen Aufzeichnungen usw.). ) Das Rendern der Daten im letztgenannten Format würde sie jedoch hoffnungslos und unwiederbringlich verfälschen.
quelle
Meine Erfahrungen mit der Benutzeroberfläche stammen hauptsächlich von Desktop-Systemen. Websites sind anders, obwohl ich einige Websites gesehen habe, die ein Desktopsystem herausfordern könnten. Aber wofür es sich lohnt:
Ich habe festgestellt, dass Fehlermeldungen der allerletzte Ausweg sein sollten. Ein ideales System hätte sie überhaupt nicht. Das Beste, was Sie tun können, ist, keine schlechten Eingaben zuzulassen: Der Benutzer kann nicht "grün" eingeben, wenn er aus einer Dropdown-Liste von Monaten auswählt. Er kann keinen ausgegrauten Knopf drücken.
Das nächstbeste ist, die schlechten Daten zu akzeptieren. Angenommen, Sie zeigen ein Histogramm der täglichen Verkäufe für einen Monat an. Nach Benutzereingabe deckt das Diagramm ein Jahrhundert ab und der Balken, der ein Jahrhundert nach außen zeigt, ist zehnmal höher als die anderen. Der Benutzer weiß jetzt, dass er etwas falsch gemacht hat, und weiß außerdem viel mehr darüber, was er falsch gemacht hat, als jede Nachricht ihm sagen könnte. Wenn die Eingabe grafisch ist - zum Beispiel durch Ziehen einer Maus -, funktioniert diese Art von Feedback weiterhin und ist von unschätzbarem Wert. Eine Reihe von Eingaben ist möglicherweise ungültig. Mit dieser Methode erhält der Benutzer jedoch sofort ein detailliertes Feedback zu den Ergebnissen der einzelnen Mauspositionen.
Trotzdem muss der Benutzer manchmal wissen, warum die Schaltfläche abgeblendet ist, damit er sie nicht drücken kann. Dann gibt es keine Hilfe für sie (wenn es ist , lassen Sie mich wissen) , aber auf den Knopf ungray und, wenn er darauf klickt, geben Sie ihm eine gute Erklärung, warum die Taste zur Zeit nicht arbeiten.
quelle
In der Erklärung geht es um das Versenden von Informationen über das Internet. Eins der Dinge, die beim Senden von Informationen über das Internet auftreten, ist, dass diese nicht immer oder nur fragmentiert zum Ziel gelangen.
quelle
Etwas, das hier vermisst zu werden scheint - was sind die Folgen eines Scheiterns?
Webseite anzeigen? Sie sollten alles tun, um schlechte Eingaben zu tolerieren. Sie können entweder anzeigen, was Sie können, oder einen Fehler auslösen. Der letztere Kurs gibt dem Benutzer nichts und sollte daher nur ein letzter Ausweg sein, da er dem Benutzer ein völlig unbrauchbares Ergebnis liefert. Es wäre ziemlich schwierig, einen Fehler schlechter als diesen zu machen.
Wenn Sie dagegen nach dem Ziel eines Minuteman III fragen, lehnen Sie "Moskau" als Eingabe ab, da es möglicherweise nicht eindeutig ist.
quelle