So kam es, dass ich in den letzten Jahren Frankenstein genäht und keine niedlichen Porzellanfiguren von Hirtinnen und Schornsteinfegern gemeißelt habe. Ich erstelle Lösungen auf Basis von Magento 2. Das bedeutet, dass das Ausgangsmaterial für mich der Traum eines jeden Archäologen ist. Die kulturelle Schicht mit Spuren verschiedener "Epochen" und "Zivilisationen". Es kann verwendet werden, um die Entwicklung des Programmierergedankens in PHP / JS-Communities im letzten Jahrzehnt zu untersuchen.
Dies ist nur die Basis, und das Add-In besteht aus Modulen von Drittanbietern, die integriert werden müssen. Hier ist es bereits möglich, Manifestationen außerirdischer Intelligenz zu begegnen. Einige Module werden von entwickelten Kreaturen erstellt, die den Schöpfern der Basis sehr ähnlich denken, aber Sie stoßen auf diejenigen, die Sie dem Autor bei der Schulter nehmen möchten, schauen ihm tief in die Augen und fragen freundlich: "Von welchem Planeten kommst du, Eingeborener? "

Debugger hilft, Frankenstein aus solchem Material zu nähen. Im Folgenden ist meine persönliche Top-Codierungstechnik aufgeführt, die das Leben eines jeden verkomplizieren kann, der wie ich den Debugger täglich in seinem Leben verwendet. Es ist klein, mit vier Positionen, aber jedes Mal, wenn ich beim Debuggen auf so etwas stoße, bin ich traurig. Vielleicht reduziert mein Beitrag die Anzahl der Sorgen auf der Welt oder vielleicht auch nicht. Ich werde es zumindest versuchen.
Verschleierung und Codeverschlüsselung
Dies ist außer Konkurrenz. Ich bin ein paar Mal auf Module gestoßen , für die ionCube benötigt wird, und ich kann sagen, dass ich als letztes ein ähnliches Modul in mein Projekt aufnehmen werde. Ich unterstütze die Minimierung von JS-Code voll und ganz, insbesondere wenn die übliche Quelle in der Nähe ist, aber Verschleierung und Verschlüsselung sind ein destilliertes, konzentriertes Übel. Ich sage Ihnen dies als Integrator.
IV. Einzeiliger Code
Das Speichern in Codezeilen ist das harmloseste auf meiner Liste:
if ($cond) aaa(); else bbb();
Hängt während der schrittweisen Ausführung des Programms zwei Schritte in dieser Zeile auf (Berechnung der Bedingung, Ausführung des true
oder false
Zweigs). Es ist in Ordnung, Sie müssen nur bedenken, wie oft Sie einen Step-Over in dieser Zeile durchgeführt haben, und den Wert von $cond
in der Variablenliste verfolgen. Im Laufe der Zeit hat sich der Automatismus entwickelt.
Etwas schlimmer ist, dass Sie keinen bedingungslosen Haltepunkt für den true
oder false
Zweig festlegen können. Anstelle eines einzelnen Klicks in der IDE müssen Sie etwas länger mit der Maus / Tastatur arbeiten und einen bedingten Haltepunkt hinzufügen.
Die ideale Option ist, wenn jeder ausführbare Schritt (Bedingung, true
Licht, false
Licht) in einer eigenen Zeile steht:
if ($cond) aaa(); else bbb();
III. Ausdrucksergebnis
Verwenden von Ausdrücken in Bedingungen:
if (exp()) ...
Zyklen:
foreach (exp() as $item) ...
als Parameter:
foo(exp(), ...)
und Ergebnis zurückgeben:
return exp();
Der Code wird nicht nur "dichter", was das Verständnis erleichtert, sondern auch das Debuggen erschwert. Die Ausführungswerte von Ausdrücken werden in der Liste der Debugger-Variablen nur nicht angezeigt. Ich muss Uhren hinzufügen (eine interessante Frage, und wenn Sie die Generatoren durch Uhren überwachen, hat dies Auswirkungen auf die Ausführung des Programms? ).
Die ideale Option ist eine temporäre Variable:
$exp = exp(); if ($exp) ...
II. Viele Ausstiegspunkte
Oft bin ich auf die Empfehlung gestoßen, nur einen Austrittspunkt aus der Funktion zu haben, und oft bin ich auf einen Verstoß gegen diese Empfehlung gestoßen (ein erfundenes, aber typisches Beispiel):
public function onEvent($event) { if($event == 'entrance') { return 'entranceRoute'; } else if($event == 'exit') { return 'exitRoute'; } return 'defaultRoute'; }
Hier ist eine korrektere Option:
public function onEvent($event) { $result = 'defaultRoute'; if($event == 'entrance') { $result = 'entranceRoute'; } else if($event == 'exit') { $result = 'exitRoute'; } return $result; }
Das ist alles, ich muss nicht bei jeder return
Haltepunkte streuen oder aus der ersten Zeile aussteigen (wenn der aufrufende Code mir die Möglichkeit gibt, das Ergebnis in einer separaten Variablen zu sehen), um zu verstehen, wie die Ausführung endete. Stellen Sie sich eine Funktion mit 120 Zeilen und 22 Rückgaben vor? Und ich habe das selbst entkräftet und ich vermute, dass dies nicht die Grenze ist.
I. Kaskadierende Methodenaufrufe
Mein Favorit ist die Methodenkaskadierung :
$collection ->addFilterByProduct(...) ->addShowInStoresFilter(...) ->addPublicFilter(...) ->addApprovedStatusFilter(...) ->addCreatedAtLessThanNowFilter(...);
Wenn ich in die Methode addApprovedStatusFilter()
, die auf der Schnittstelle basiert und in mehreren verschiedenen Klassen implementiert ist (eine bestimmte Klasse wird zur Laufzeit festgelegt), ist es am einfachsten, einen Haltepunkt für $collection
addFilterByProduct
und alles nacheinander addFilterByProduct
( addFilterByProduct
, addShowInStoresFilter
, addPublicFilter
) bis zum richtigen Ort. Wenn Sie dies mit Ausdrücken in den Parametern und den zurückgegebenen Ergebnissen kombinieren, wird der Pfad nicht vollständig geschlossen. Im Original sieht dieser Code folgendermaßen aus:
$collection ->addFilterByProduct($this->getProduct()) ->addShowInStoresFilter($this->_storeManager->getStore()->getId()) ->addPublicFilter() ->addApprovedStatusFilter() ->addCreatedAtLessThanNowFilter();
Ja, mit kaskadierenden Methoden wird der Code besser lesbar, aber das Abbuchen wird schwieriger. Ich habe nichts gegen die Set'er-Kaskade (ich debütiere in der Regel nicht mit Setzern):
$answerModel ->setAuthorName(...) ->setStatus(...) ->setCreatedAt(...) ->setAuthorEmail(...) ->setCustomerId(...) ->setHelpfulness(...)
Aber der Code, der die Logik enthält, die möglicherweise belastet werden muss, oder vielleicht sogar von mir selbst, ist besser, " old school " zu schreiben (ich mache es selbst):
$collection->addFilterByProduct(...); $collection->addShowInStoresFilter(...); $collection->addPublicFilter(...); $collection->addApprovedStatusFilter(...); $collection->addCreatedAtLessThanNowFilter(...);
Ist es viel schwieriger geworden, es wahrzunehmen?
Oder hier sind die Empfehlungen für einen guten Programmierstil:
ladder.up().up().down().up().down().showStep();
Betrachten Sie dies aus der Sicht eines Integrators, der in die Sekunde nach down
.
Zusammenfassung
Ich meine nicht, dass diese Techniken in ihrem Code von " Außerirdischen " verwendet werden. Überhaupt nicht, zum größten Teil zielen sie im Gegenteil darauf ab, die Menge an Code zu reduzieren. Diese Techniken erschweren jedoch das Debuggen. Eine Person hat nicht die Geschwindigkeit eines Computers, und um den Problemcode zu erreichen, muss der Integrator zuerst den Fortschritt des Programms an Schlüsselpunkten scannen (nicht verstehen, nämlich scannen). All dies, da einerseits die Aufgabe besteht, das Verständnis des Codes zu verbessern, wird dieses Verständnis während des Debuggens tatsächlich behindert. Sie stören nicht am Ort des Codes, sondern stören den Zugang zum Problembereich, der im Allgemeinen ein echtes Verständnis erfordert.
Haftungsausschluss
Das Vorstehende ist das Ergebnis persönlicher beruflicher Verformungen und kann von Meinungen abweichen, die auf anderen beruflichen Verformungen beruhen.