In meiner Anwendung gibt es einige vordefinierte Ausdrucksvorlagen, die zum Filtern von Daten verwendet werden können. Einer von ihnen ist " between x and y
". Ein QS-Ingenieur behauptet, dass es einen Defekt in seiner Definition gibt, weil " between 100 and 200
" andere Ergebnisse liefert als " between 200 and 100
". Der Ausdruck wird intern in " value >= x and value <= y
" übersetzt, sodass es offensichtlich keine Ergebnisse gibt, wenn die zweite Grenze niedriger als die erste ist. Ich habe überprüft, dass das gleiche " between x and y
" Verhalten in SQL vorliegt - " " vorausgesetzt, dass y> = x ist oder keine Ergebnisse vorliegen. Dies bedeutet, dass der Operator zumindest in SQL nicht kommutativ ist.
Ist die Qualitätssicherung also richtig, dass " between x and y
" kommutativ sein sollte?
quelle
between
die niedrigeren und höheren Werte eingeschlossen oder ausgeschlossen werden sollen. Die QS-Person mag pedantisch sein, aber solange es Unsicherheiten gibt, muss jemand die User Stories / Anforderungen klären. Es könnte sich herausstellen, dass es so ist, wie es sein soll, aber eine Entscheidung muss getroffen werden.Antworten:
Wenn Ihre aktuelle Spezifikation dies undefiniert lässt, ist das Verhalten völlig willkürlich, es gibt keine "richtige" oder "falsche" Definition. Wenn Ihr QS-Techniker Sie also nicht auf den genauen Absatz in der Spezifikation verweisen kann, in dem dieses Verhalten definiert ist, können Sie seine Anforderung wahrscheinlich ablehnen (obwohl dies keine Anforderung zu sein scheint, deren Implementierung viel Aufwand erfordert). Wenn Sie beide keinen Konsens finden, muss eine Person in Ihrem Team entscheiden, was im Zusammenhang mit der Bewerbung wichtiger ist:
Unabhängig davon, welche Entscheidung Ihr Team trifft, ist es möglicherweise eine gute Idee, das Verhalten und den Grund für die Entscheidung zu dokumentieren.
quelle
Dies ist eine Frage zur Benutzerfreundlichkeit oder Benutzererfahrung. Wie sich SQL oder ein anderes System verhält, ist irrelevant. Die Frage ist, was aus Anwendersicht am sinnvollsten ist.
Das aktuelle Verhalten ist aus Benutzersicht nicht sinnvoll. Entweder sollten x und y austauschbar sein, oder es sollte nicht erlaubt sein, ein x größer als y auszuwählen. Das Zulassen von x größer als y, aber das Zurückgeben eines leeren Satzes führt zu einer unnötigen Möglichkeit von Fehlern, ohne dass dies Vorteile bringt.
Der QS-Techniker hat also Recht, dass ein Defekt vorliegt, aber die vorgeschlagene Lösung ist nicht unbedingt die beste. Sie müssen Usability-Tests durchführen, um dies zu entscheiden, oder zumindest einige repräsentative Benutzer fragen, was für sie am natürlichsten erscheint.
Alternativ können Sie die Frage auch unter https://ux.stackexchange.com/ stellen . Die Leute dort wissen tatsächlich ein oder zwei Dinge über das Benutzererlebnis.
quelle
Es gibt ein paar sinnvolle Entscheidungen, die vom Rest des Systems und den Erwartungen Ihrer Benutzer abhängen.
Sie können, wie der QS-Ingenieur betont, einfach den Ausdruck kommutativ machen, und dann wäre die Übersetzung
between x and y
=>value >= min(x, y) and value <= max(x, y)
Sie können die gültige Verwendung auf beschränken
x <= y
, was eher erfordert, dass Ihre Benutzeroberfläche so früh wie möglich "das ist kein gültiger Ausdruck" anzeigt.Als Abwandlung des oben Gesagten gilt die Einschränkung,
x < y
wenn Sie einen Ausdruck habenequals x
und diesen der Auswertung vorziehenvalue >= x and value <= x
quelle
value >= min(x, y) and value <= max(x, y)
. Berechnen Sie vorab, was Sie können, um Ihrem Datenbankserver die Arbeit zu ersparen, insbesondere wenn sie so redundant ist (Sie können die relevanten Vorgänge einmal ausführen und beide Ergebnisse entsprechend einstellen). Es spielt möglicherweise keine Rolle, abhängig vom Datenbankserver und den von Ihnen eingegebenen spezifischen Werten, aber ein schlecht geschriebener SQL-Server führt möglicherweise dasmin
undmax
für jeden Datensatz aus, wenn Sie sie in daswhere
einfügen und wenn Sie diesen Aufwand reduzieren können Es gibt keinen Grund, dies nicht zu tun.value >= min(x, y) and value <= max(x, y)
so lesbar wievalue >= minXY and value <= maxXY
, wominXY
undmaxXY
sind die vorberechneten grenzen. Für letztere muss man jedoch Code schreiben, um diese beiden neuen Variablen zum System hinzuzufügen. Füllen Sie diese zuvor aus, und vergessen Sie nicht, diese Werte zu aktualisieren, wenn sich x und y ändern, und so weiter. Redundante Daten bergen immer ein gewisses Fehlerrisiko.In einer nicht interaktiven Umgebung, in der Ihre Grenzen durch ein Skript erstellt werden, ist es in der Regel sinnvoll, deren Reihenfolge zu fordern. Dies führt zu einer einzigen Überprüfung, die semantisch sinnvoller und trivial zu handhaben ist.
In einer interaktiven Umgebung möchten Sie dem Benutzer helfen. Erstellen Sie nach Möglichkeit eine GUI, die die Eingabe vertauschter Bereiche nicht zulässt, oder machen Sie die Eingabe von Bereichen in der angegebenen Reihenfolge zumindest so einfach wie möglich. Wenn Sie die Bereiche als Text eingeben, nehmen Sie eine Seite von vim, dem Vorbild für Benutzerfreundlichkeit, und fordern Sie den Benutzer auf, invertierte Bereiche automatisch auszutauschen:
Wenn Ihr QS-Techniker UX nichts im Wege hätte, um ihm einen invertierten Bereich anzuzeigen, wäre dies unerwünscht, und er ging von einer vernünftigen Annahme aus.
quelle
Offen? Verwenden Sie nicht "zwischen". Überhaupt.
Erstens ist der Begriff unglaublich vieldeutig, insbesondere in Englisch. Ist es kommutativ? Sind die Bedingungen exklusiv? Inklusive?
Zweitens: Wenn Sie eine vom Backend getrennte Schnittstelle verwenden, machen Sie sich keine Sorgen über das Verhalten des Backends. und lassen Sie Ihre Benutzer auch kein geerbtes Verhalten annehmen. Sicher, SQL definiert es
BETWEEN
als inklusive, aber dies ist fast nie das gewünschte Verhalten (zum Beispiel - Wenn Sie so etwas tun, werdenrows BETWEEN :start and :start + :stride
Siestride + 1
Zeilen bekommen ).Stattdessen sollten Sie die Vergleiche für die Endpunkte explizit auflisten. Msgstr "Größer als oder gleich x". "Gestern". Dies beseitigt die Mehrdeutigkeit. Es hilft auch dabei, saubereren Code zu schreiben und einige heimtückische Fehler zu vermeiden. Das Beispiel aus früheren Zeilen ist im Wesentlichen der Beitrag von Djikstra zur Indizierung . Wenn Sie SQL erlauben, für einige Typen eine inklusive Obergrenze zu verwenden, werden möglicherweise die falschen Daten ausgewählt .
quelle
Es ist nicht produktiv, mit Ihrer Qualitätssicherung darüber zu streiten, wer "richtig" und wer "falsch" ist. Sie haben die Spezifikation anders interpretiert als sie. Dies bedeutet, dass die Spezifikation so vieldeutig ist, dass eine Klärung erforderlich ist.
Wenn es sich bei der Benutzeroberfläche um die Spezifikation handelt und es sich nicht um das Verhalten handelt, das von der Qualitätssicherung erwartet wird, werden zumindest einige Benutzer dies nicht erwarten. Das deutet auf ein Usability-Problem hin (auch wenn Sie PEBKAC argumentieren möchten). Arbeiten Sie mit Ihrer Qualitätssicherung zusammen, um eine zufriedenstellende Lösung zu finden.
Seien Sie generell vorsichtig mit Worten wie "zwischen", die klar erscheinen, es aber nicht sind. Abgesehen von Ihrer Meinungsverschiedenheit darüber, ob pendeln soll, gibt es Probleme mit der Inklusivität an beiden Enden und möglicherweise intuitiv unterschiedliche Bedeutungen in verschiedenen Bereichen (z. B. bedeutet "zwischen Freitag und Montag" für die meisten Menschen etwas anderes als "zwischen Montag und Montag" Freitag")
quelle
Ich werde ein UNIX-Prinzip aufstellen, das sich mit einfachen Schnittstellen befasst.
Überall dort, wo Sie eine Schnittstelle zur Außenwelt anbieten, halten Sie das Ding so wenig überraschend wie möglich!
Jetzt, da ich die Problemstellung auf eine pragmatischere reduziert habe, werden Sie wahrscheinlich in wenigen Augenblicken feststellen, dass es bei der Angabe von Zahlenbereichen offensichtlich ist, die kleinere als die erstere zu belassen. Wenn es immer noch ein Rätsel ist, denken Sie wie folgt: Wie oft haben Sie die umgekehrte Art der Darstellung von zwei Zahlen verwendet, während Sie den Kindern gesagt haben, wie sie diese vergleichen sollen?
Wenn es sich bei Ihrem QS-Techniker um einen Fehler handelt, sagen Sie ihm höflich, dass Sie einige echte Fehler erwarten und nicht, wie Sie kostspielige Energie auf triviale Dinge übertragen können.
quelle
Lassen Sie Ihren Debug-Code eine Fehlerbedingung auslösen oder eine Warnung protokollieren, wenn die Werte in falscher Reihenfolge übergeben werden. Auf diese Weise kann der aufrufende Code bei Bedarf Parameter überprüfen und austauschen. Auf diese Weise werden Benutzer dieser Funktion darauf aufmerksam und tun das Richtige (was Sie vorher nicht wissen).
quelle