Ist es eine schlechte Übung, eine Funktion zu verwenden, die das Material innerhalb einer Bedingung ändert, wodurch die Bedingung auftragsabhängig wird?

7
%Vor%

Ссылка

myFunction erhöht eine Variable und gibt etwas zurück. Wenn ich eine Funktion wie diese in einer if -Anweisung verwende, die die Variable enthält, die sie inkrementiert, wäre die Bedingung auftragsabhängig.

Ist es gut oder schlecht, dies zu tun, und warum?

    
Duh-Wayne-101 18.12.2017, 00:55
quelle

6 Antworten

12

Bedingungen sind auftragsabhängig, ob Sie die in der Bedingung verwendeten Variablen ändern oder nicht. Die beiden if-Anweisungen, die Sie als Beispiel verwendet haben, sind unterschiedlich und unterscheiden sich, unabhängig davon, ob Sie myFunction () verwenden oder nicht. Sie entsprechen:

%Vor%

Meiner Meinung nach ist die schlechte Übung in Ihrem Code nicht die Tatsache, dass Sie den Operandenwert der Bedingung in der Bedingung ändern, sondern die Tatsache, dass Ihr Anwendungsstatus in einer Funktion offengelegt und manipuliert wird, die diesen Status nicht einmal akzeptiert Variable als Parameter. Wir versuchen normalerweise, die Funktionen aus dem Code außerhalb ihres Gültigkeitsbereichs zu isolieren und ihren Rückgabewert zu verwenden, um den Rest des Codes zu beeinflussen. Globale Variablen sind 90% der Zeit eine schlechte Idee und wenn Ihre Codebasis größer und größer wird, neigen sie dazu, Probleme zu erzeugen, die schwer zu verfolgen, zu debuggen und zu lösen sind.

    
Roumelis George 20.12.2017, 13:04
quelle
6

Es ist schlechte Praxis, aus den folgenden Gründen:

  • Der Code ist weit weniger lesbar als gut konstruierter Code. Dies ist sehr wichtig, wenn der Code später von einem Dritten geprüft wird.

  • Wenn myfunction später geändert wird, ist der Codefluss völlig unvorhersehbar und erfordert möglicherweise eine umfangreiche Dokumentationsaktualisierung.

  • Kleine und einfache Änderungen können drastische Auswirkungen auf die Ausführung des Codes haben.

  • Es sieht Amateur aus.

JonMark Perry 20.12.2017 05:26
quelle
5

Wenn Sie fragen müssen, ist es kaum eine gute Übung. Ja, es ist eine schlechte Übung genau aus dem Grund, den Sie erwähnten: Eine Änderung der Reihenfolge der Operanden einer logischen Operation sollte das Ergebnis nicht beeinflussen, und daher sollten Nebenwirkungen in Bedingungen im Allgemeinen vermieden werden. Vor allem, wenn sie in einer Funktion versteckt sind.

Ob die Funktion rein ist (liest nur den Status und macht eine Logik) oder ob sie mutiert ist, sollte aus ihrem Namen offensichtlich sein. Sie haben mehrere Möglichkeiten, diesen Code zu beheben:

  • Setzen Sie den Funktionsaufruf vor if :

    %Vor%
  • Machen Sie die Mutation explizit in if :

    %Vor%
  • setze die Logik in die aufgerufene Funktion:

    %Vor%
Bergi 20.12.2017 05:47
quelle
5

MyFunction verstößt gegen ein Prinzip namens Tell, Do not Ask .

MyFunction ändert den Zustand von etwas und macht es zu einem Befehl. Wenn MyFunction erfolgreich ist oder a irgendwie nicht erhöhen kann, sollte es weder wahr noch falsch zurückgeben. Es wurde eine Arbeit gegeben und es muss entweder versuchen, erfolgreich zu sein, oder wenn es findet, dass Arbeit im Moment unmöglich ist, sollte es eine Ausnahme werfen.

Im Prädikat einer if-Anweisung wird MyFunction als Abfrage verwendet.

Im Allgemeinen sollten Abfragen keine Nebenwirkungen aufweisen (d. h. Dinge nicht ändern, die beobachtet werden können). Eine gute Abfrage kann wie eine Berechnung behandelt werden, da sie für die gleichen Eingaben dieselben Ausgaben (manchmal als "idempotent" beschrieben) erzeugt.

Es ist auch wichtig zu wissen, dass dies Richtlinien sind, die Ihnen und anderen helfen, über den Code nachzudenken. Code, der kann zu Verwirrung führen, wird . Verwirrung über Code ist eine Brutstätte für Bugs.

Es gibt gute Muster wie das Trier-Doer-Muster, das wie Ihr Codebeispiel verwendet werden kann, aber jeder, der es liest, muss verstehen, was durch Namen und Struktur geschieht.

    
Greg 26.12.2017 17:14
quelle
3

Der Code präsentiert tatsächlich mehr als eine schlechte Praxis:

%Vor%
  1. Mutiert eine Variable in einem anderen Bereich. Dies kann oder kann kein Problem sein, aber normalerweise ist es das.

  2. Ruft eine Funktion innerhalb einer if -Anweisungsbedingung auf. Das verursacht an sich keine Probleme, aber es ist nicht wirklich sauber. Es ist besser, das Ergebnis dieser Funktion einer Variablen zuzuweisen, möglicherweise mit einem beschreibenden Namen. Dies hilft jedem, der den Code liest, zu verstehen, was genau Sie in dieser if -Anweisung überprüfen möchten. Die Funktion gibt übrigens immer true zurück.

  3. Verwendet einige magische Zahlen. Stellen Sie sich vor, jemand anderes würde diesen Code lesen, und er ist Teil einer großen Codebasis. Was diese Zahlen bedeuten? Eine bessere Lösung wäre, sie durch gut benannte Konstanten zu ersetzen.

  4. Wenn Sie weitere Nachrichten unterstützen möchten, müssen Sie weitere Bedingungen hinzufügen. Ein besserer Ansatz wäre, dies konfigurierbar zu machen.

Ich würde den Code wie folgt umschreiben:

%Vor%
  1. Eine Klasse mit einer präzisen Funktion, die ihren eigenen internen Zustand verwendet, anstelle einer Reihe von Funktionen, die auf einer Variablen basieren, die sich irgendwo befinden kann. Ob man eine Klasse benutzt oder nicht, es ist eine Frage der Wahl. Es könnte anders gemacht werden.

  2. Verwendet eine Konfiguration. Das bedeutet, dass Sie mehr Nachrichten hinzufügen möchten, Sie müssen den Code überhaupt nicht berühren. Stellen Sie sich beispielsweise vor, dass die Konfiguration von einer Datenbank kommt.

  3. Wie Sie vielleicht bemerken, mutiert das eine Variable im äußeren Bereich der Funktion, aber in diesem Fall verursacht sie kein Problem.

  4. Verwendet Konstanten mit einem eindeutigen Namen. (Nun, es könnte besser sein, aber ertragen Sie mit mir das Beispiel).

Giacomo Cosimato 26.12.2017 06:59
quelle
1

Eine Funktion, die das Zeug ändert. Wie kommt die Welt auch? Diese Funktion muss jedes Mal, wenn sie aufgerufen wird, den Inhalt wechseln und unterschiedliche Werte zurückgeben.

Betrachte die DealCard-Funktion für ein Kartenspiel. es behandelt die Karten 1-52. Bei jedem Aufruf sollte ein anderer Wert zurückgegeben werden.

%Vor%

/ * Wir nehmen an, dass die Array-Karten gemischt sind * /

/ * der Kürze halber nehmen wir an, dass das Deck unendlich ist und nicht bei 52 * /

läuft     
danny117 26.12.2017 21:56
quelle