Ich habe einen Bekannten, einen erfahreneren Entwickler als ich. Wir sprachen über Programmierpraktiken und ich war überrascht von seiner Herangehensweise an Wenn-Aussagen. Er beharrt auf einigen Praktiken in Bezug auf Aussagen, die ich eher seltsam finde.
Zunächst sollte auf eine if-Anweisung eine else-Anweisung folgen, unabhängig davon, ob etwas darin enthalten ist oder nicht. Was dazu führt, dass der Code so aussieht:
if(condition)
{
doStuff();
return whatever;
}
else
{
}
Zweitens ist es besser, auf wahre Werte zu prüfen, als auf falsche. Das bedeutet, dass es besser ist, eine 'doorClosed'-Variable zu testen, als eine'! DoorOpened'-Variable
Sein Argument ist, dass es klarer macht, was der Code tut.
Was mich ziemlich verwirrt, da eine Kombination dieser beiden Regeln dazu führen kann, dass er diese Art von Code schreibt, wenn er etwas tun möchte, wenn die Bedingung nicht erfüllt ist.
if(condition)
{
}
else
{
doStuff();
return whatever;
}
Mein Gefühl dabei ist, dass es in der Tat sehr hässlich ist und / oder dass die Qualitätsverbesserung, falls vorhanden, vernachlässigbar ist. Aber als Junior neige ich dazu, an meinem Instinkt zu zweifeln.
Meine Fragen lauten also: Ist es eine gute / schlechte / "egal" Übung? Ist es üblich?
quelle
Antworten:
Expliziter
else
BlockDie erste Regel verschmutzt nur den Code und macht ihn weder lesbarer noch weniger fehleranfällig. Ich nehme an, Ihr Kollege hat das Ziel, explizit zu zeigen, dass sich der Entwickler voll und ganz bewusst war, dass die Bedingung möglicherweise als positiv bewertet wird
false
. Es ist zwar eine gute Sache, explizit zu sein, aber eine solche Aussage sollte nicht mit drei zusätzlichen Codezeilen verbunden sein .Ich erwähne nicht einmal die Tatsache, dass auf eine
if
Aussage nicht unbedingt einelse
oder nichts folgt: Es können auch ein oder mehrereelif
s folgen .Das Vorhandensein der
return
Aussage macht die Sache noch schlimmer. Selbst wenn Sie tatsächlich Code zur Ausführung innerhalb deselse
Blocks hätten, wäre es besser, dies so zu tun:Dies führt dazu, dass der Code zwei Zeilen weniger benötigt und den
else
Block rückgängig macht . In Guard-Klauseln geht es darum.Beachten Sie jedoch, dass die Technik Ihres Kollegen ein sehr unangenehmes Muster aus gestapelten bedingten Blöcken ohne Leerzeichen teilweise lösen kann:
Im vorherigen Code
if
macht es das Fehlen eines vernünftigen Zeilenumbruchs nach dem ersten Block sehr leicht, den Code falsch zu interpretieren. Während die Regel Ihres Kollegen es schwieriger machen würde, den Code falsch zu lesen, besteht eine einfachere Lösung darin, eine neue Zeile hinzuzufügen.Testen Sie für
true
, nicht fürfalse
Die zweite Regel mag sinnvoll sein, aber nicht in der aktuellen Form.
Es ist nicht falsch, dass das Prüfen auf eine geschlossene Tür intuitiver ist als das Prüfen auf eine nicht geöffnete Tür . Negationen und insbesondere verschachtelte Negationen sind normalerweise schwer zu verstehen:
Um dies zu lösen, erstellen Sie , anstatt leere Blöcke hinzuzufügen, gegebenenfalls zusätzliche Eigenschaften oder lokale Variablen .
Die obige Bedingung könnte ziemlich leicht lesbar gemacht werden:
quelle
JZ
(Jump if Zero)if (foo)
nachJNZ
(Jump if Not Zero) nach tauschenif (!foo)
.if
wird bereits explizit darauf hingewiesen, dass die Bedingung falsch sein könnte oder dass Sie nicht darauf testen würden. Ein leerer Block macht die Dinge weniger klar, nicht mehr, weil kein Leser darauf vorbereitet ist, und jetzt müssen sie innehalten und darüber nachdenken, wie es dort hingekommen sein könnte.if (!commonCase) { handle the uncommon case },
.In Bezug auf die erste Regel ist dies ein Beispiel für nutzloses Tippen. Das Schreiben dauert nicht nur länger, es führt auch zu großer Verwirrung bei jedem, der den Code liest. Wenn der Code nicht benötigt wird, schreiben Sie ihn nicht. Dies würde sogar dazu führen, dass
else
in Ihrem Fall kein Eintrag vorhanden ist, da der Code vomif
Block zurückgegeben wird:In Bezug auf den zweiten Punkt ist es ratsam, boolesche Namen zu vermeiden, die ein Negativ enthalten:
Wenn Sie dies jedoch erweitern, um nicht erneut auf ein Negativ zu testen, führt dies, wie Sie betonen, zu einer unnötigeren Eingabe. Folgendes ist viel klarer als ein leerer
if
Block:quelle
if (!doorNotOpen)
ist schrecklich. Daher sollten die Namen so positiv wie möglich sein.if (! doorClosed)
ist vollkommen in Ordnung.doorNotOpen
ist es nicht dasselbe wiedoorClosed
in einem Übergangszustand zwischen Offenheit und Geschlossenheit. Ich sehe dies die ganze Zeit in meinen industriellen Anwendungen, in denen boolesche Zustände durch physikalische Sensoren bestimmt werden. Wenn Sie einen einzelnen Sensor auf der offenen Seite der Tür haben, können Sie nur sagen, dass die Tür offen oder nicht offen ist. Befindet sich der Sensor ebenfalls auf der geschlossenen Seite, können Sie nur "geschlossen" oder "nicht geschlossen" sagen. Der Sensor bestimmt auch selbst, wie der logische Zustand bestätigt wird.1. Ein Argument für leere
else
Aussagen.Ich benutze (und argumentiere) oft etwas Ähnliches wie dieses erste Konstrukt, ein leeres Anderes. Es signalisiert den Lesern des Codes (sowohl menschliche als auch automatisierte Analysewerkzeuge), dass der Programmierer über die Situation nachgedacht hat. Fehlende
else
Aussagen, die hätten vorliegen müssen, haben Menschen getötet, Fahrzeuge abgestürzt und Millionen von Dollar gekostet. Beispielsweise schreibt MISRA-C mindestens einen Kommentar vor, der besagt, dass das fehlende Finale else in einerif (condition_1) {do_this;} else if (condition_2) {do_that;} ... else if (condition_n) {do_something_else;}
Sequenz beabsichtigt ist. Andere hohe Zuverlässigkeitsstandards gehen sogar noch weiter: Mit wenigen Ausnahmen sind fehlende else-Aussagen verboten.Eine Ausnahme ist ein einfacher Kommentar, etwas in der Art von
/* Else not required */
. Dies signalisiert die gleiche Absicht wie die drei Zeilen, die sonst leer sind. Eine weitere Ausnahme, bei der dieses leere Element nicht benötigt wird, ist die Tatsache, dass es sowohl für Codeleser als auch für automatisierte Analysewerkzeuge offensichtlich ist, dass dieses leere Element überflüssig ist. Beispiel:if (condition) { do_stuff; return; }
In ähnlicher Weise wird im Fall vonthrow something
odergoto some_label
1 anstelle von kein Leerzeichen "else" benötigtreturn
.2. Ein Argument für den Vorzug
if (condition)
vorif (!condition)
.Dies ist ein menschlicher Faktor. Komplexe boolesche Logik stürzt viele Menschen in die Irre. Auch ein erfahrener Programmierer muss darüber nachdenken
if (!(complex || (boolean && condition))) do_that; else do_this;
. Schreiben Sie dies mindestens wie folgt umif (complex || (boolean && condition)) do_this; else do_that;
.3. Das heißt nicht, dass man leere
then
Aussagen bevorzugen sollte .Der zweite Abschnitt sagt "lieber" als "du sollst". Es ist eher eine Richtlinie als eine Regel. Der Grund dafür, dass diese Richtlinie positive
if
Bedingungen bevorzugt , ist, dass Code klar und offensichtlich sein sollte. Eine leere then-Klausel (zBif (condition) ; else do_something;
) verletzt dies. Es ist eine verschleierte Programmierung, die selbst die erfahrensten Programmierer dazu veranlasst, dieif
Bedingung in ihrer negierten Form zu sichern und erneut zu lesen . Schreiben Sie es also zunächst in negierter Form und lassen Sie die else-Anweisung weg (oder geben Sie ein leeres else oder einen Kommentar dazu, wenn Sie dazu aufgefordert werden).1 Ich schrieb , dass dann Klauseln , die am Ende mit
return
,throw
odergoto
nicht ein leeres sonst erfordern. Es ist offensichtlich, dass die else-Klausel nicht benötigt wird. Aber was ist mitgoto
? Abgesehen davon verbieten sicherheitskritische Programmierregeln manchmal eine vorzeitige Rückkehr und verbieten fast immer das Auslösen von Ausnahmen. Sie erlauben jedochgoto
in eingeschränkter Form (zBgoto cleanup1;
). Diese eingeschränkte Verwendunggoto
ist an einigen Stellen die bevorzugte Praxis. Der Linux-Kernel zum Beispiel ist voll von solchengoto
Aussagen.quelle
!
wird auch leicht übersehen. Es ist zu knapp.else { /* Intentionally empty */ }
oder etwas in diese Richtung. Das leere Sonst erfüllt den statischen Analysator, der sinnlos nach Regelverstößen sucht. Der Kommentar informiert den Leser darüber, dass das Leerzeichen "else" beabsichtigt ist. Andererseits lassen erfahrene Programmierer den Kommentar normalerweise als unnötig aus - aber nicht das leere Sonst. Hochzuverlässige Programmierung ist eine Domäne für sich. Die Konstrukte sehen für Außenstehende eher seltsam aus. Diese Konstrukte werden aufgrund von Lektionen aus der Schule der harten Schläge verwendet, Schläge, die sehr hart sind, wenn Leben und Tod oder $$$$$$$$$ zur Hand sind.if (target == source) then /* we need to do nothing */ else updateTarget(source)
not
ist ein Schlüsselwort in C ++, ebenso wie andere bitweise und logische Operatoren. Siehe alternative Operatordarstellungen .In sehr seltenen Fällen verwende ich einen leeren else-Zweig (und manchmal einen leeren if-Zweig): Wenn es offensichtlich ist, dass sowohl der if- als auch der else-Teil irgendwie behandelt werden sollten, der Fall jedoch aus nicht trivialen Gründen von behandelt werden kann nichts tun. Und deshalb würde jeder, der den Code mit der sonst erforderlichen Aktion liest, sofort den Verdacht haben, dass etwas fehlt, und seine Zeit verschwenden.
Aber nicht:
quelle
if test succeeds -> no action needed -> else -> action needed
semantisch sehr unterschiedlich zur Aussageif it applies that the opposite of a test outcome is true then an action is needed
. Ich erinnere mich an Martin Fowlers Zitat: "Jeder kann Code schreiben, den Computer verstehen können. Gute Programmierer schreiben Code, den Menschen verstehen können."if ((missing || corrupt) && !backup) -> skip -> else do stuff
ist viel klarer (+ andere implizite Absichten) alsif ((!missing && !corrupt) || backup) -> do stuff
if(!((missing || corrupt) && !backup)) -> do stuff
oder besserif((aviable && valid) || backup) -> do stuff
. (In einem realen Beispiel müssen Sie jedoch überprüfen, ob das Backup gültig ist, bevor Sie es verwenden.)if
:file_ok = !missing && !corrupt; if(file_ok || backup) do_stuff();
was ich persönlich das Gefühl , macht es noch deutlicher.Wenn alles andere gleich ist, bevorzugen Sie die Kürze.
Was Sie nicht schreiben, muss niemand lesen und verstehen.
Obwohl es nützlich sein kann, explizit zu sein, ist dies nur dann der Fall, wenn ohne übermäßige Ausführlichkeit klar wird, dass das, was Sie geschrieben haben, wirklich das ist, was Sie schreiben wollten.
Vermeiden Sie leere Äste, sie sind nicht nur nutzlos, sondern auch ungewöhnlich und führen zu Verwirrung.
Vermeiden Sie es auch, einen else-Zweig zu schreiben, wenn Sie den if-Zweig direkt verlassen.
Eine nützliche Anwendung des expliziten Denkens wäre, einen Kommentar zu hinterlassen, wenn Sie durch Schalterfälle fallen
// FALLTHRU
, und einen Kommentar oder einen leeren Block zu verwenden, wenn Sie eine leere Aussage benötigenfor(a;b;c) /**/;
.quelle
// FALLTHRU
Ugh, nicht in SCREAMING CAPS oder mit txtspk Abkürzungen. Ansonsten stimme ich zu und folge dieser Praxis selbst.break
. Wenn dies nicht der Fallbreak
ist, sind einige spektakuläre Softwarefehler aufgetreten. Ein Kommentar, der den Lesern des Codes mitteilt, dass das Durchfallen beabsichtigt ist, ist eine gute Sache. Dass statische Analysewerkzeuge nach diesem bestimmten Muster suchen und sich nicht über einen Sturz beschweren können, macht es noch besser.vim
, und es erkennt keine Variation vonFALLTHRU
. Und ich denke, aus gutem Grund:TODO
undFIXME
Kommentare sind Kommentare, die griffbereit sein müssen, weil Sie in der Lage sein möchten, zu fragen,git grep
welche bekannten Fehler Sie in Ihrem Code haben und wo sie sich befinden. Ein Fallthrough ist kein Defekt, und es gibt keinen Grund, dafür zu greifen, was auch immer.FALLTHRU
heißt das nicht, dass andere Benutzer vim nicht dafür konfiguriert haben.Es gibt keine feste Regel über positive oder negative Bedingungen für eine IF-Anweisung, meines Wissens nicht. Ich persönlich bevorzuge die Codierung für einen positiven Fall anstelle eines negativen Falls. Ich werde dies jedoch mit Sicherheit nicht tun, wenn es mich dazu bringt, einen leeren IF-Block zu erstellen, gefolgt von einem ELSE-Block voller Logik. In einem solchen Fall würde es ungefähr 3 Sekunden dauern, bis der Test auf einen positiven Fall zurückgeführt wurde.
Was mir an Ihren Beispielen allerdings nicht gefällt, ist der völlig unnötige vertikale Platz, den das leere ELSE einnimmt. Es gibt ganz einfach keinen Grund, dies zu tun. Es fügt der Logik nichts hinzu, es hilft nicht, zu dokumentieren, was der Code tut, und es verbessert die Lesbarkeit überhaupt nicht. Tatsächlich würde ich argumentieren, dass der hinzugefügte vertikale Raum möglicherweise die Lesbarkeit beeinträchtigen könnte.
quelle
if(hasWriteAccess(user,file))
könnte darunter komplex sein, aber auf einen Blick wissen Sie genau, was das Ergebnis sein sollte. Auch wenn es sich nur um ein paar Bedingungen handelt, z. B.if(user.hasPermission() && !file.isLocked())
ein Methodenaufruf mit einem geeigneten Namen, wird der Punkt deutlich, sodass Negative weniger von Bedeutung sind.Expliziter
else
BlockIch bin damit nicht einverstanden, da dies eine pauschale Aussage ist, die alle Aussagen abdeckt
if
, aber es gibt Zeiten, in denen es gut ist, einenelse
Block aus Gewohnheit hinzuzufügen .Eine
if
Aussage deckt meines Erachtens tatsächlich zwei unterschiedliche Funktionen ab.Wenn wir etwas tun sollen, tun Sie es hier.
Sachen wie diese offensichtlich nicht nicht einen benötigen
else
Teil.und in einigen Fällen darauf bestehen, eine
else
mögliche Irreführung hinzuzufügen .ist nicht dasselbe wie
obwohl es funktional das gleiche ist. Wenn Sie das erste
if
mit einem Leerzeichen schreiben, erhaltenelse
Sie möglicherweise das zweite Ergebnis, das unnötig hässlich ist.Wenn wir nach einem bestimmten Zustand suchen, ist es oft eine gute Idee, ein Leerzeichen hinzuzufügen
else
, um Sie daran zu erinnern, dass diese Möglichkeit bestehtDenken Sie daran, dass diese Regeln nur gelten , wenn Sie neuen Code schreiben . IMHO Die leeren
else
Klauseln sollten vor dem Einchecken entfernt werden.Testen Sie für
true
, nicht fürfalse
Auch dies ist ein guter Rat auf allgemeiner Ebene, aber in vielen Fällen macht dies Code unnötig komplex und weniger lesbar.
Auch wenn Code gefällt
scherzt den Leser, macht es aber
ist mindestens so schlimm, wenn nicht schlimmer.
Ich habe vor vielen Jahren in BCPL codiert und in dieser Sprache gibt es eine
IF
Klausel und eineUNLESS
Klausel, so dass Sie viel besser lesbar codieren können als:das ist deutlich besser, aber immer noch nicht perfekt.
Mein persönlicher Prozess
Wenn ich neuen Code schreibe, füge ich häufig einen leeren
else
Block zu einerif
Anweisung hinzu, um mich daran zu erinnern, dass ich diese Möglichkeit noch nicht behandelt habe. Dies hilft mir, dieDFS
Falle zu umgehen , und stellt sicher, dass ich beim Überprüfen des Codes feststelle, dass noch mehr zu tun ist. Normalerweise füge ich jedoch einenTODO
Kommentar hinzu, um den Überblick zu behalten.Ich finde, dass ich
else
im Allgemeinen selten in meinem Code verwende, da dies oft auf einen Codegeruch hinweisen kann.quelle
unless
Block ist ein guter Vorschlag und beschränkt sich kaum auf BCPL....
tatsächlich warreturn
. (In der Tat wird mitk=-1
,n=-2
die erste Rückkehr genommen, aber dies ist weitgehend umstritten.)if
undunless
. Darüber hinaus werden diese nach einer Aussage auch zugelassen, sodass Sie sagen können,print "Hello world!" if $born;
oderprint "Hello world!" unless $dead;
und beide tun genau das, was Sie glauben, dass sie tun.Für den ersten Punkt habe ich eine Sprache verwendet, die die Verwendung von IF-Anweisungen auf diese Weise erzwungen hat (in Opal, der Sprache, die sich hinter einem Bildschirmschaber für Großrechner verbirgt, um ein GUI-Front-End für Großrechnersysteme zu erstellen), und nur eine Zeile für die IF und die ELSE. Es war keine angenehme Erfahrung!
Ich würde erwarten, dass jeder Compiler solche zusätzlichen ELSE-Klauseln herausoptimiert. Für Live-Code wird jedoch nichts hinzugefügt (in der Entwicklung kann dies ein nützlicher Marker für weiteren Code sein).
Wenn ich etwas wie diese zusätzlichen Klauseln verwende, ist dies eine Zeit, in der ich CASE / WHEN-Typverarbeitung verwende. Ich füge immer eine Standardklausel hinzu, auch wenn sie leer ist. Dies ist eine langfristige Angewohnheit von Sprachen, die Fehler machen, wenn eine solche Klausel nicht verwendet wird, und einen Gedanken erzwingen, ob die Dinge wirklich einfach durchfallen sollten.
Vor langer Zeit wurde in der Mainframe-Praxis (z. B. PL / 1 und COBOL) akzeptiert, dass negative Prüfungen weniger effizient waren. Dies könnte den 2. Punkt erklären, obwohl es heutzutage massiv wichtigere Effizienzsteigerungen gibt, die als Mikrooptimierungen ignoriert werden.
Negative Logik ist in der Regel weniger lesbar, obwohl dies bei einer so einfachen IF-Anweisung weniger der Fall ist.
quelle
if !A then B; else C
aufif A then C; else B
. Das Berechnen der Negation der Bedingung ist eine zusätzliche CPU-Anweisung. (Obwohl, wie Sie sagen, ist es unwahrscheinlich, dass dies wesentlich weniger effizient ist.)!
und==
Betreiber, zum Beispiel. Nicht, dass das jemand tun sollte , wohlgemerkt ...Ich würde dem Standpunkt der meisten Antworten zustimmen, dass leere
else
Blöcke praktisch immer eine schädliche Verschwendung von elektronischer Tinte sind. Fügen Sie diese nur hinzu, wenn Sie einen guten Grund dafür haben. In diesem Fall sollte der leere Block überhaupt nicht leer sein. Er sollte einen Kommentar enthalten, der erklärt, warum er dort ist.Das Problem der Vermeidung von Negativen verdient jedoch etwas mehr Aufmerksamkeit: Wenn Sie einen booleschen Wert verwenden müssen, müssen in der Regel einige Codeblöcke ausgeführt werden, wenn er festgelegt ist, und einige andere Blöcke, wenn er nicht festgelegt ist. Wenn Sie als solches eine Regel ohne Negative erzwingen, erzwingen Sie entweder
if() {} else {...}
Anweisungen (mit einem leerenif
Block!) Oder Sie erstellen einen zweiten Booleschen Wert für jeden Booleschen Wert, der seinen negierten Wert enthält. Beide Optionen sind schlecht, da sie Ihre Leser verwirren.Eine hilfreiche Richtlinie lautet: Verwenden Sie niemals eine negierte Form innerhalb des Namens eines Booleschen und drücken Sie die Negation als eine einzige aus
!
. Eine Aussage wieif(!doorLocked)
ist vollkommen klar, eine Aussage wieif(!doorUnlocked)
Knotengehirne. Die spätere Art des Ausdrucks ist das, was Sie unbedingt vermeiden müssen, nicht das Vorhandensein einer Einzelperson!
in einerif()
Bedingung.quelle
Ich würde sagen, es ist definitiv eine schlechte Übung. Das Hinzufügen von else-Anweisungen fügt Ihrem Code eine ganze Reihe sinnloser Zeilen hinzu, die nichts bewirken und das Lesen noch schwieriger machen.
quelle
Es gibt ein weiteres Muster, das noch nicht erwähnt wurde, um den zweiten Fall mit einem leeren if-Block zu behandeln. Eine Möglichkeit, damit umzugehen, wäre, im if-Block zurückzukehren. So was:
Dies ist ein gängiges Muster zum Überprüfen von Fehlerbedingungen. Der zustimmende Fall wird immer noch verwendet, und das Innere ist nicht mehr leer, sodass zukünftige Programmierer sich fragen können, ob ein No-Op beabsichtigt war oder nicht. Dies kann auch die Lesbarkeit verbessern, da Sie möglicherweise eine neue Funktion erstellen müssen (wodurch große Funktionen in kleinere Einzelfunktionen unterteilt werden).
quelle
Es gibt einen Punkt bei der Betrachtung des Arguments "Immer eine else-Klausel haben", den ich in keiner anderen Antwort gesehen habe: Es kann in einem funktionalen Programmierstil sinnvoll sein. Art von.
In einem funktionalen Programmierstil werden eher Ausdrücke als Anweisungen verwendet. Jeder Codeblock hat also einen Rückgabewert - einschließlich eines
if-then-else
Ausdrucks. Dies würde jedoch einen leerenelse
Block ausschließen. Lassen Sie mich ein Beispiel geben:Nun, in Sprachen mit C-Stil oder C-Stil inspirierter Syntax (wie Java, C # und JavaScript, um nur einige zu nennen) sieht dies seltsam aus. Es kommt mir jedoch viel bekannter vor, wenn man es so schreibt:
Wenn Sie den
else
Zweig hier leer lassen, wird ein Wert undefiniert. In den meisten Fällen ist dies kein gültiger Fall für die Programmierung von Funktionen. Das gleiche gilt für das völlige Auslassen. Wenn Sie jedoch iterativ programmieren, habe ich sehr wenig Grund, immer einenelse
Block zu haben.quelle
Ich bin nicht einverstanden,
if (a) { } else { b(); }
sollte umgeschrieben werden alsif (!a) { b(); }
undif (a) { b(); } else { }
sollte umgeschrieben werden alsif (a) { b(); }
.Es sei jedoch darauf hingewiesen, dass ich selten einen leeren Zweig habe. Das liegt daran, dass ich mich normalerweise anmelde, dass ich in den sonst leeren Zweig gegangen bin. Auf diese Weise kann ich rein aus Logmeldungen entwickeln. Ich benutze selten einen Debugger. In Produktionsumgebungen erhalten Sie keinen Debugger. Es ist schön, Produktionsprobleme mit denselben Tools beheben zu können, die Sie für die Entwicklung verwenden.
Ich habe diesbezüglich gemischte Gefühle. Ein Nachteil von
doorClosed
unddoorOpened
ist, dass sich die Anzahl der Wörter / Begriffe, die Sie kennen müssen, möglicherweise verdoppelt. Ein weiterer Nachteil ist, dass sich mit der Zeit die Bedeutung vondoorClosed
unddoorOpened
möglicherweise ändert (andere Entwickler folgen Ihnen) und Sie möglicherweise zwei Eigenschaften erhalten, bei denen es sich nicht mehr um präzise Negationen handelt. Anstatt Negationen zu vermeiden, lege ich Wert darauf, die Sprache des Codes (Klassennamen, Variablennamen usw.) an das Vokabular der Geschäftsbenutzer und die von mir gestellten Anforderungen anzupassen. Ich würde mir keinen neuen Begriff einfallen lassen wollen, um a!
Wenn dieser Begriff nur für einen Entwickler eine Bedeutung hat, die Geschäftsbenutzer nicht verstehen. Ich möchte, dass Entwickler dieselbe Sprache sprechen wie die Benutzer und die Personen, die Anforderungen schreiben. Wenn nun neue Begriffe das Modell vereinfachen, dann ist das wichtig, aber das sollte behandelt werden, bevor die Anforderungen finalisiert sind, und nicht danach. Die Entwicklung sollte dieses Problem lösen, bevor sie mit dem Codieren beginnt.Es ist gut, sich weiter zu hinterfragen.
Bis zu einem gewissen Grad spielt vieles keine Rolle. Lassen Sie Ihren Code überprüfen und an Ihr Team anpassen. Das ist normalerweise richtig. Wenn jeder in Ihrem Team eine bestimmte Art und Weise codieren möchte, ist es wahrscheinlich am besten, dies so zu tun (das Ändern einer Person - Sie selbst - erfordert weniger Story-Punkte als das Ändern einer Gruppe von Personen).
Ich kann mich nicht erinnern jemals einen leeren Ast gesehen zu haben. Ich sehe Leute, die Eigenschaften hinzufügen, um Negationen zu vermeiden.
quelle
Ich werde nur den zweiten Teil der Frage ansprechen, und dies kommt aus meiner Sicht, in industriellen Systemen zu arbeiten und Geräte in der realen Welt zu manipulieren.
Dies ist jedoch in manchen Fällen eher ein ausführlicher Kommentar als eine Antwort.
Wenn es heißt
Aus meiner Sicht wird hier die Annahme getroffen, dass der Türzustand ein binärer Zustand ist, obwohl es sich tatsächlich um mindestens einen ternären Zustand handelt:
Je nachdem, wo sich ein einzelner binärer Digitalsensor befindet, können Sie also nur eines von zwei Konzepten vermuten:
Und Sie können diese Konzepte nicht durch die Verwendung einer binären Negation austauschen. Daher
doorClosed
und!doorOpened
wahrscheinlich auch nicht, und jeder Versuch, vorzutäuschen, dass es sich um ein Synonym handelt, ist falsches Denken, das eine größere Kenntnis des Systemzustands voraussetzt, als tatsächlich vorhanden ist.Wenn ich auf Ihre Frage zurückkomme, würde ich eine Wortwahl unterstützen, die dem Ursprung der Informationen entspricht, die die Variable darstellt. Wenn die Informationen von der geschlossenen Seite der Tür stammen,
doorClosed
kann dies bedeuten, dass je nach Bedarf einedoorClosed
oder!doorClosed
mehrere Aussagen verwendet werden, was zu einer möglichen Verwechslung mit der Verwendung der Verneinung führen kann. Aber was es nicht tut, ist implizit Annahmen über den Zustand des Systems zu verbreiten.Zu Diskussionszwecken für die von mir geleistete Arbeit hängt die Menge der Informationen, die ich über den Zustand des Systems habe, von der Funktionalität ab, die das Gesamtsystem selbst benötigt.
Manchmal muss ich nur wissen, ob die Tür geschlossen oder nicht geschlossen ist. In diesem Fall ist nur ein einziger Binärsensor ausreichend. Aber zu anderen Zeiten muss ich wissen, dass die Tür offen, geschlossen oder im Übergang ist. In solchen Fällen gäbe es entweder zwei binäre Sensoren (bei jeder extremen Türbewegung - mit Fehlerprüfung, ob die Tür gleichzeitig geöffnet und geschlossen ist) oder einen analogen Sensor, der misst, wie „offen“ die Tür ist.
Ein Beispiel für die erste wäre die Tür eines Mikrowellenofens. Sie aktivieren den Betrieb des Ofens, wenn die Tür geschlossen oder nicht geschlossen ist. Es ist dir egal, wie offen die Tür ist.
Ein Beispiel für den zweiten wäre ein einfacher motorisch angetriebener Aktuator. Sie verhindern das Vorwärtsfahren des Motors, wenn der Antrieb vollständig ausgefahren ist. Und Sie sperren das Rückwärtsfahren des Motors, wenn der Stellantrieb vollständig eingefahren ist.
Die Anzahl und Art der Sensoren hängt im Wesentlichen davon ab, ob eine Kostenanalyse der Sensoren mit einer Anforderungsanalyse durchgeführt wird, um die erforderliche Funktionalität zu erreichen.
quelle
Konkrete Stilregeln sind immer schlecht. Richtlinien sind gut, aber am Ende gibt es oft Fälle, in denen Sie Dinge klarer machen können, indem Sie etwas tun, das den Richtlinien nicht ganz entspricht.
Das heißt, es gibt eine Menge Hass für die leeren anderen "es verschwendet Zeilen" "zusätzliche Eingabe", die nur schlecht sind. Sie könnten das Argument vorbringen, die Klammern in dieselbe Zeile zu verschieben, wenn Sie wirklich den vertikalen Abstand benötigen, aber wenn dies ein Problem ist, sollten Sie Ihr {ohnehin nicht in eine separate Zeile setzen.
Wie an anderer Stelle erwähnt, ist der else-Block sehr nützlich, um zu zeigen, dass im anderen Fall explizit nichts geschehen soll. Nachdem ich viel funktionales Programmieren durchgeführt habe (wo sonst noch etwas erforderlich ist), habe ich gelernt, dass Sie beim Schreiben des if immer das andere berücksichtigen sollten, obwohl es, wie @OldCurmudgeon erwähnt, wirklich zwei verschiedene Anwendungsfälle gibt. Man sollte ein anderes haben, man sollte nicht. Leider ist es nicht immer auf einen Blick zu erkennen, geschweige denn mit einem Linter, weshalb die Dogmatik „immer einen anderen Block setzen“.
Auch hier sind die absoluten Regeln schlecht. Ein leeres wenn zu haben kann komisch sein, besonders wenn es die Art ist, wenn das kein anderes braucht, also schreibe das alles lieber als ein! oder ein == falsch ist schlecht. Trotzdem gibt es viele Fälle, in denen das Negative Sinn ergibt. Ein häufiges Beispiel wäre das Zwischenspeichern eines Werts:
Wenn die tatsächliche (mentale / englische) Logik ein Negativ beinhaltet, sollte dies auch für die if-Anweisung gelten.
quelle