Standardwerte - sind sie gut oder böse?

12

Die Frage nach Standardwerten im Allgemeinen - Standardwerte für Rückgabefunktionen, Standardparameterwerte, Standardlogik für den Fall, dass etwas fehlt, Standardlogik für die Behandlung von Ausnahmen, Standardlogik für die Behandlung der Randbedingungen usw.

Für eine lange Zeit hielt ich Standardwerte für eine "reine böse" Sache, etwas, das "die Katastrophe verhüllt" und dazu führt, dass es sehr schwer ist, Fehler zu finden. Aber in letzter Zeit habe ich angefangen, mir Standardwerte als eine Art technische Schulden vorzustellen. Das ist keine schlechte Sache, sondern eine Art "kurzfristige Finanzierung", die uns dazu bringt, das Projekt zu überleben (wie viele von uns könnten es sich leisten) ein Haus kaufen, ohne die Hypothek aufzunehmen?).

Wenn ich "kurzfristig" sage, meine ich damit nicht, "mache zuerst etwas schnelles und überarbeite es später, bevor es in die Produktion kommt". Nein, ich spreche davon, mich auf fest codierte Standardwerte in einer Produktionssoftware zu verlassen. Zugegeben - es könnte einige Probleme verursachen, aber was ist, wenn es nur ein einziges Problem in einem ganzen Jahr verursachen würde?

Wiederum - ich spreche hier von der "durchschnittlichen" Mainstream-Software (keine Software für ein Kernkraftwerk) - der durchschnittlichen Website oder einer UI-Anwendung für die Buchhaltungssoftware, was bedeutet, dass Menschenleben nicht auf dem Spiel stehen, noch Millionen von Dollar .

Aus meiner Erfahrung heraus würden Geschäftsanwender lieber mit der Software leben, die "irgendwie funktioniert", als auf eine perfekte zu warten. Die Verwendung von Standardwerten ist sehr hilfreich, wenn Sie eine Software im RAD-Stil entwickeln. Aber wieder - die längsten Debugsitzungen, die ich je verbracht habe, waren wegen der Fehler, die durch einen Standardwert verursacht wurden, der entweder aufgehört hat, "ein Standard" zu sein, oder weil ein kleines Subsystem kürzlich aktualisiert wurde und als Ergebnis dieses Upgrades nicht aktualisiert wurde Behandeln Sie die Standardeinstellung korrekt (z. B. leere Liste gegen Null oder leere Zeichenfolge gegen leere Zeichenfolge).

Also meine Frage ist - sind die Standardwerte gut oder böse. Und wenn es sich um eine technische Verschuldung handelt - wie hoch ist der Betrag, den Sie leihen können, um sich die Rückzahlungen leisten zu können?

Würde mich über jeden Input wirklich freuen.

Prost.

BEARBEITEN:

Wenn ich die Standardwerte verwende, um die Ecken während der Entwicklung zu kürzen, und wenn das Schneiden der Ecken zu Fehlern und Problemen führt, wie kann ich diese Probleme beheben?


quelle

Antworten:

23

Das Konzept der Convention over Configuration ist ohne sinnvolle Standardwerte nicht möglich. Das Schlüsselwort ist hier "sinnvoll". Die Standardwerte müssen für mindestens 80% (wenn nicht mehr) aller Verwendungen einer Bibliothek / eines Dienstes / eines Frameworks sinnvoll sein.

Allgemeine Faustregeln:

  • Wenn ein Wert für mindestens 80% sinnvoll ist, muss er ein Standardwert sein
  • Wenn in den meisten Fällen keine Werte verwendet werden, verwenden Sie keine Standardwerte.
  • Standardwerte verhindern dumme Fehler aus dem Setup-Code. Wenn die Standardeinstellungen in den meisten Fällen angemessen sind, können weniger Benutzer mit der Arbeitskonfiguration herumspielen.
  • Nicht standardmäßige Konfigurationen werden bei Verwendung der Standardeinstellungen besser angezeigt.
  • Schlechte Standardeinstellungen sind schlimmer als keine Standardeinstellungen.

Wenn Sie erst einmal erfahren haben, wie die Standardkonfiguration funktioniert, können Sie fundierte Entscheidungen darüber treffen, wie und wann nicht standardmäßige Konfigurationen vorgenommen werden sollen.

Berin Loritsch
quelle
Vielen Dank, dass Sie mich auf das Konzept "Convention over Configuration" hingewiesen haben. Ich habe es benutzt, ohne zu wissen, dass es einen Namen hat. Können Sie diese Regel erklären: "Nicht-Standard-Konfigurationen sind bei Verwendung von Standardeinstellungen sichtbarer." Bitte.
3
@Andrew: Wenn es ein Dutzend Anrufe Foo()und einen Anruf gibt, Foo("bar")fällt dieser eine Anruf eher auf und ist daher besser sichtbar.
Matthew Scharley
1
Richtig, und wenn die meisten Benutzer einen FTP-Dienst verwenden, wird new FtpService()derjenige auffallen, der einen alternativen Port festlegt ( service.SetPort(12345)).
Berin Loritsch
43

Nehmen Sie zum Beispiel eine Bibliothek, die das FTP-Protokoll implementiert. Standardmäßig wird erwartet, dass FTP auf Port 21 ausgeführt wird. Jetzt wäre ich sehr irritiert, wenn ich festlegen müsste, dass Port 21 jedes Mal verwendet wird, wenn ich ein Objekt einer zufälligen FTP-Klasse konstruiere. Wenn ich einen anderen Port benötige, lass es mich spezifizieren.

Standardeinstellungen sind vollkommen in Ordnung, wenn es sich um vernünftige Standardeinstellungen handelt.

Htbaa
quelle
21
+1. Wann haben Sie das letzte Mal http://programmers.stackexchange.com:80/questions/?sort=newest&pagesize=50in eine Adressleiste getippt ?
Jörg W Mittag
1
Also, wie misst / schätzt / wirkt man einen Vernunftsgrad der Standardvariablen?
5
Wie lange dauert es, sich einen vernünftigen Standardwert auszudenken?
Alexander Gessler
1
@ Andrew, siehe meine Antwort unten. Wenn ein Wert für 80% oder mehr Verwendungszwecke geeignet ist, ist dies eine gute Standardeinstellung.
Berin Loritsch
2
@Berin Loritsch: Wenn der Standardwert für ein sicheres Versagen verwendet wird, könnte man argumentieren, dass es gut ist, auch wenn es nur 1% der Zeit verwendet wird.
Osterwal
18

Sie verwenden wahrscheinlich ein Standardtastaturlayout mit Standardtastenzuordnungen, Standardtastenzuordnungen für die Maus, den Standardbrowser, die Eingabe der Systemstandardsprache, das Booten vom Standardbetriebssystem im Bootloader, standardmäßig positionierte Menüs, das Standardfarbschema und die Standardschrift Breite / Höhe / Gesicht / Stil, Standardzeichensatz, Standardmonitorauflösung, Standard ... Sie bekommen die Idee.

Aber im Ernst, ich denke, die Sorge, die Sie haben, ist nicht mit Standardwerten, sondern mit etwas anderem. Durch das Standardverhalten werden Fehler nicht automatisch maskiert. In den meisten Fällen wird Ihr Code ohnehin unter normalen Bedingungen ausgeführt, unabhängig davon, ob Sie Standardeinstellungen festgelegt haben oder nicht. Unbearbeitete Randfälle sind Dinge, die Sie unbedingt vermeiden sollten (vermutlich durch angemessene und ordnungsgemäße Tests), wenn die Standardeinstellungen geändert werden oder ein ungewöhnliches Szenario eintritt.

Die Behandlung von "Catch-All" -Ausnahmen ist wahrscheinlich eher ein Konstruktionsfehler als alles, was man als "Standard" bezeichnen könnte.

Rei Miyasaka
quelle
OK, "catch-all" ist eigentlich ein gutes Beispiel. Ja - es ist sehr traurig, wenn eines Tages aus einem unbekannten Grund etwas schief geht, und diese "some-s" sind größtenteils unbekannt, da die eigentliche Ausnahme in einem Sammelblock verloren gegangen ist. Also ist es eine schlechte Sache - richtig? Andererseits - ohne einen Catch-All-Block könnte die Software entweder vollständig abstürzen (wenn die Ausnahme nicht behandelt wird) oder eine komplizierte Fehlerbehandlungslogik erfordern (zumindest müsste sie die Ausnahme protokollieren und einige Daten mit einem initialisieren Standardwerte).
Fügen Sie meiner ursprünglichen Frage hinzu: Wenn ich die Standardwerte verwende, um die Ecken während der Entwicklung zu kürzen, und wenn die Ecken zu Fehlern und Problemen führen, wie können Sie diese Probleme am besten beheben?
1
In Bezug auf Ausnahmen gibt es einen Artikel, der besagt, dass es eine Catch-All-Ausnahme pro Thread geben sollte , wenn überhaupt. Es wird für die Fehlerberichterstattung verwendet, sodass Sie das Programm als eine einzige "Sache" betrachten, genau wie das Betriebssystem einen Prozess betrachtet. Da Sie den Endbenutzer (und hoffentlich die Entwickler) in der Schleife haben, "schlucken" Sie die Ausnahme nicht wirklich - es ist also alles gut. Artikel hier: codeproject.com/KB/architecture/exceptionbestpractices.aspx
Rei Miyasaka
1
Was die Verwendung von Standardeinstellungen zur Vermeidung von Fehlern angeht - wie wäre es mit der Verwendung eines konsistenten Kommentars, für den Sie + f / mac + f steuern können? Beispielsweise zeigt Visual Studio tatsächlich alle Kommentare an, die mit TODO: or TEMP:in der Aufgabenliste beginnen. Wenn ich jemals der Entwicklung zuliebe eine Ecke abschneide, versuche ich äußerst vorsichtig zu sein, um sicherzustellen, dass ich ein TODO dort ablege. Hin und wieder mache ich dann ein "Alles finden", um zurückzugehen und mich zu vergewissern nichts davon kommt in irgendwelche wichtigen Builds.
Rei Miyasaka
Hoppla, ich wollte fest codierte Werte verwenden, um die Entwicklung zu unterstützen. Übrigens habe ich gerade festgestellt, dass "fest codierte Werte" wahrscheinlich das gesuchte Wort sind und nicht "Standardwerte".
Rei Miyasaka
3

Die Standardeinstellungen sollten verwendet werden, wenn der Benutzer oder Entwickler keine sich wiederholenden Aufgaben ausführen muss. Sie sollten niemals verwendet werden, um Fehler oder Ausnahmen zu maskieren. Es ist keine schlechte Praxis, sie zu verwenden, um Fehler zu verhindern, sondern nur, solange die Prävention nichts Schlechtes verdeckt. Standardwerte sind wie alles andere ein Werkzeug. Bei sachgemäßer Anwendung sparen Sie viel Kopfschmerzen und Zeit. Bei unsachgemäßer Anwendung können sie das ganze Haus zum Einsturz bringen.

Joel Etherton
quelle
Ein bisschen wie C ++, das dir das ganze Bein
wegbläst
1
@muntoo: Hey, Lisp hat mich in '03 gehumpelt.
Joel Etherton
2

Die Hauptursache für die von Ihnen genannten Probleme sind nicht die Standardwerte an sich, sondern Integrationsprobleme aufgrund sich ändernder Schnittstellenverträge, Interpretationsmissverständnissen und / oder ungültigen Annahmen. Grundsätzlich scheinen alle diese (spezifischen Beispiele) das Ergebnis einer unsachgemäßen Kommunikation zu sein - zwischen Client und Entwickler oder zwischen verschiedenen Entwicklern / Teams. Diese Probleme können sich als ungültige Standardwerte, aber auch in unzähligen anderen Formen manifestieren.

Behandeln Sie die Grundursache, nicht das Symptom.

Beachten Sie auch, dass - wie andere mit hervorragenden Beispielen hervorgehoben haben - Standardwerte das Leben der Benutzer erheblich erleichtern können, wenn sie mit Bedacht verwendet werden. Und das ist letztendlich unser Ziel, nicht wahr?

Péter Török
quelle
"Unsachgemäße Kommunikation" könnte die Hauptursache sein, ist es aber keine Hauptursache für so ziemlich alles? Und da "mein ultimatives Ziel" darin besteht, eine "gut genug" Software rechtzeitig in einem kostenbeschränkten Umfeld bereitzustellen, wollte ich wissen, wie man die schlechten / bösen Standardeinstellungen von den guten unterscheidet.
@Andrew, Kommunikation (oder deren Fehlen) ist ein wichtiger Faktor für den Erfolg / Misserfolg eines Projekts, aber bei weitem nicht der einzige. Wenn es jedoch der Täter ist, sollte es richtig gehandhabt werden, sonst ist Ihr Projekt mit ziemlicher Sicherheit zum Scheitern verurteilt. Ich kenne kein magisches Werkzeug, um schlechte von guten Standardeinstellungen zu trennen: IMHO erfordert eine sorgfältige Analyse der Problemdomäne, Anwendungsfälle usw. und eine Menge Kommunikation.
Péter Török
0

Standardwerte, die nicht Teil des Kommunikationsprotokolls / der Kommunikationskonvention sind, sind böse. Mit "kein Teil" meine ich, sie sind nicht dokumentiert, wo das Protokoll streng ist, oder sie werden einfach nicht erwartet, wo das Protokoll lose ist.

Wenn der Standardwert dokumentiert / erwartet wird, kann er immer noch böse sein, aber auch Leben retten. Es kommt auf den Domainbereich an. Es ist sehr häufig, wenn sie sehr gefährlich sein können (z. B. Standardmedikamentendosis, Standardaufzugsebene, Standardbewegungsrichtung des Autos), und manchmal kann es gefährlich sein, sie nicht zu haben (z. B. Standardbewegungsrichtung des Autos, Standardbesprechungszeit).

astef
quelle