PHP CodeSniffer mit WordPress verwenden Code-Gerüche verstehen

Die Art und Weise, wie wir Code schreiben, hängt oft davon ab, wie wir mit der Programmierung begonnen haben.

Wenn zum Beispiel jemand eine formale Ausbildung im Bereich Computer hat, kennt er wahrscheinlich eine Reihe von Prinzipien, die ihn daran hindern, Code mit schlechter Qualität zu schreiben. Dies ist natürlich keine Regel, sondern eine Beobachtung. 

In ähnlicher Weise enden diejenigen, die sich außerhalb eines formalen Umfelds selbstständig mit dem Programmieren beschäftigen, am Ende oft selbst und lernen aus verschiedenen Quellen. Dies kann manchmal zu Problemen mit der Art des geschriebenen Codes führen.

Um es ganz klar zu sagen: Ich sage nicht, dass eine formale EDV-Ausbildung jemanden übertrumpft, der sich selbst unterrichtet, oder umgekehrt. Einige fantastische Programmierer sind diejenigen, die gebildet werden; andere sind diejenigen, die Autodidakten sind. Beide haben jedoch eines gemeinsam: Sie sind nicht von Zeit zu Zeit vom Schreiben von Code-Gerüchen befreit.

In diesem Artikel werfen wir einen einführenden Blick auf Codegerüche. Wir werden untersuchen, was sie sind, wie sie aussehen und wie sie sich in unserer Arbeit oft manifestieren. Wir werden PHP für unsere Beispiele verwenden.

Im zweiten Teil dieser Serie werden wir einen Blick darauf werfen, wie wir das Schreiben von Codegerüchen vermeiden können. Wir werden insbesondere PHP, ein paar Tools und WordPress als bevorzugte Umgebung verwenden.

Aber zuerst wollen wir uns mit Code-Gerüchen vertraut machen.

Was sind Code-Gerüche??

Abhängig von der Art des Entwicklers, den Sie fragen, werden Sie wahrscheinlich eine Variation der folgenden Definition erhalten:

Codegeruch, im Computerprogrammiercode auch als schlechter Geruch bekannt, bezieht sich auf jedes Symptom im Quellcode eines Programms, das möglicherweise auf ein tieferes Problem hinweist. 

Diese Definition stammt direkt aus Wikipedia. Es ist nicht schlecht, aber es ist nicht meine Lieblingsmeinung zu diesem Thema. Stattdessen stammt meine Lieblingsdefinition von einem produktiven und beliebten Programmierer namens Martin Fowler. In diesem Artikel können Sie seine gesamte Version zum Thema Codegerüche nachlesen. Ich habe es jedoch auf folgende Punkte konzentriert:

  1. "Eine lange Methode ist ein gutes Beispiel dafür - nur den Code anzusehen und meine Nase zuckt, wenn ich mehr als ein Dutzend Zeilen Java sehe."
  2. "Gerüche sind nicht von sich aus schlecht - sie sind oft eher ein Hinweis auf ein Problem als auf das Problem selbst."
  3. "Datenklassen (Klassen mit allen Daten und keinem Verhalten) sind gute Beispiele."

Wenn Sie den Artikel nicht gelesen haben, endet er damit:

Das Schöne an Gerüchen ist, dass es für unerfahrene Menschen leicht ist, sie zu entdecken, selbst wenn sie nicht genug wissen, um zu beurteilen, ob es ein echtes Problem gibt, oder um sie zu korrigieren. 

Ich denke, das ist eine fantastische Aussage, weil dieses Thema perfekt für diejenigen ist, die Programmierer sind, aber nicht wissen, wo sie anfangen sollen, wenn es darum geht, Codegerüche zu erkennen und zu beseitigen.

Kurz gesagt, die Erfahrung spielt dabei keine große Rolle. Sicher, diejenigen, die mehr Erfahrung haben, können Gerüche leichter identifizieren (weil sie mehr davon gesehen haben), aber weniger erfahrene Entwickler sollten sie erkennen können.

Hast du Beispiele??

Natürlich ist es bei einem Thema wie Code-Gerüchen oft einfacher, auf abstrakter Ebene darüber zu sprechen, dass es tatsächlich darum geht, etwas dagegen zu unternehmen. Dies ist jedoch weder praktisch noch für unsere tägliche Arbeit anwendbar.

Schauen Sie sich doch einmal ein Beispiel für Codegerüche an. Wir untersuchen, warum sie problematisch sind, und bieten dann eine Lösung an, wie der Geruch durch Umgestaltung des Codes entfernt werden könnte.

Beispiel 1: Benennungskonventionen löschen

Einer der am leichtesten zu findenden Codegerüche ist, wenn ein Programmierer sich für die Verwendung unklarer Variablennamen entschieden hat. Das heißt, im Zusammenhang mit dem Code ist nicht klar, was eine bestimmte Variable darstellen soll.

Sicher, es gibt Zeiten, in denen dies akzeptabel ist (wie die Verwendung einer ich in einem zum Schleife). Aber bei einer längeren Methode ist es nicht ganz dasselbe zum Schleife). 

Zum Beispiel:

Wenn wir genug Zeit haben, könnten wir wahrscheinlich herausfinden, was dies tut. Erstens ist es eine relativ einfache Methode. Zweitens könnten wir die Variablen, Blöcke und durchlesen Rückkehr Wert, um eine bessere Vorstellung davon zu bekommen, was passiert.

Wenn wir jedoch nach sauberem Code suchen, der leichter zu verstehen ist, wenn wir darauf zurückgreifen oder ein anderer Programmierer damit arbeitet, dann ist es immer hilfreich, klare Namenskonventionen zu verwenden. Und der obige Code verwendet keine klaren Namenskonventionen.

Lass uns stattdessen so umgestalten, dass es so aussieht:

Viel einfacher zu verstehen, nicht wahr??

Beachten Sie, dass sich der Algorithmus selbst nicht geändert hat, aber der Funktionsname und die Variablennamen haben. Das hat gemacht Das viel Unterschied beim Lesen dieses Codes. Wenn Sie gefragt werden, was dieser Code tun soll, können Sie leicht Folgendes sagen:

Gibt ein Array von Elementen zurück, die als true markiert sind, aus einem vordefinierten Array von Elementen.

Vermeiden Sie so weit wie möglich die Verwendung von generischen Variablennamen und verwenden Sie die für Sie und Ihre Kollegen die klarste Option.

Beispiel 2: TROCKEN bleiben

Bei der Programmierung wäre es schwierig, einen Entwickler zu finden, der noch nicht von KISS oder DRY gehört hat (wissen Sie, "wiederholen Sie sich nicht"). Trotzdem haben wir oft tun wiederhole uns. 

Dies ist ein Hinweis auf die Tatsache, dass der Versuch, sich an die DRY-Prinzipien zu halten, bei verschiedenen Arten von Programmierern unterschiedlich ist. Und das ist gut so! Es gibt keinen einzigen Weg, um zu zeigen, wie man sich an diesen Grundsatz hält.

Da es jedoch mehrere Möglichkeiten gibt, können wir ein Beispiel dafür geben, wie es nicht aussehen sollte und wie es aussehen sollte.

Nehmen wir für das folgende Beispiel an, dass wir eine Funktion namens save_post haben, die zwei Argumente akzeptiert: eine Beitrags-ID und eine Zeichenfolge, die den Titel des Beitrags darstellt. Ein Codegeruch würde ungefähr so ​​aussehen:

Aber warum würden wir manuell einen Anruf tätigen? save_post drei Mal? Lassen Sie uns stattdessen ein assoziatives Array einrichten, durchlaufen und dann die Methode einmal pro Iteration aufrufen.

 'Hallo Welt!', 2 => 'Auf Wiedersehen Welt!', 3 => 'Was ist diese neue Welt?',]; foreach ($ post als $ post_id => $ post_title) save_post ($ post_id, $ post_title); 

Obwohl das Aufrufen der Methode einmal nett ist, könnte die Methode noch flexibler gestaltet werden, indem das Array von Posts als Argument akzeptiert wird und das für jeden Schleife intakt, obwohl das nicht der Sinn dieses Beispiels ist.

Wenn Sie feststellen, dass Sie dieselbe Methode mehrmals in einer Funktion aufrufen, jedoch mit anderen Parametern, haben Sie möglicherweise einen Codegeruch. Wenn dies der Fall ist, suchen Sie nach Möglichkeiten, diese zu ändern, sodass Sie die Methode nur einmal aufrufen. 

Schließlich wollen Sie sich nicht wiederholen.

Beispiel 3: Lange Parameterlisten

Eines der häufigsten Dinge, die wir weiterhin unabhängig von der Sprache beim Programmieren sehen, ist, wenn eine Funktion eine große Anzahl von Parametern akzeptiert. 

Verschiedene Programmierer haben Meinungen zu der idealen Anzahl von Parametern, die eine Funktion akzeptieren sollte, aber ich neige dazu, dass drei (geben oder nehmen Sie zwei, vielleicht) eine gute Anzahl sind.

Schauen wir uns zunächst an, wie eine Funktion mit einer langen Parameterliste aussehen würde. Der folgende Code enthält wahrscheinlich keine Überraschungen, und in einem Ihrer aktuellen Projekte müssen Sie möglicherweise genau so etwas behandeln:

Beachten Sie im obigen Beispiel, dass wir uns nicht mit der Implementierung der Funktion beschäftigen. Stattdessen geht es uns darum, wie viele Parameter erforderlich sind. Das sind viele Informationen, die gesendet werden müssen, und die Methode wird aufgerufen Das auch viel hässlicher.

Es geht nicht einmal um das Thema Verifizierung und Validierung. Aber ich schweife ab.

Wie könnte man das aufräumen? Persönlich bin ich ein Fan von Klassen, die Informationssammlungen wie diese darstellen. Für dieses spezielle Beispiel könnten wir eine Klasse haben, die die Kontaktinformationen einer Person darstellt. Darüber hinaus könnte diese Person mit einer Kreditkartennummer verknüpft sein. 

Die Details dazu könnten mithilfe der Geschäftslogik an anderer Stelle in der Anwendung erzwungen werden, die Abstraktion würde jedoch etwa wie folgt aussehen:

Diese Umgestaltung ist zwar die kleinste, aber die größte, die wir in diesem Artikel gemacht haben. Beachten Sie, dass wir die folgenden Dinge getan haben:

  1. Erschuf ein Kontaktinformation Klasse, mit der wir ein Objekt instanziieren können, das alle Zahlungsinformationen für eine Person enthält.
  2. Erschuf ein Zahlungsinformationen Klasse, die es uns ermöglicht, die Kreditkarten- oder Debitkartennummer für eine Person sowie andere mit dieser Zahlungsmethode verbundene Details zu verwalten.
  3. Erstellt ein Auftrag Klasse, platzierte die Bestellung abschicken Funktion innerhalb von, umbenannt in Senden (seit Bestellung abschicken wäre redundant) und verringerte seine Parameterliste auf zwei Werte: eine Instanz von Kontaktinformation Klasse und die Zahlungsinformationen Klasse).

Um klar zu sein, dieses Beispiel behandelt weder die Überprüfung der Zuordnung zwischen Kontaktinformationen und Zahlungsinformationen noch zeigt es andere Klassen an, die möglicherweise erforderlich sind (z. B. ob die Zahlung für die Transaktion fehlgeschlagen ist oder nicht)..

Aber das ist nicht der Punkt der Übung.

Stattdessen betrachten wir den Codegeruch langer Parameterlisten und wie wir sie mit praktischen, wartungsfähigeren Methoden reduzieren können, die uns zur Verfügung stehen.

Wenn Sie eine Funktion schreiben oder eine Funktion aufrufen, für die eine große Anzahl von Argumenten erforderlich ist, sollten Sie nach Möglichkeiten suchen, diese Funktion umzuwandeln. Dadurch erhöht sich der Zusammenhalt des Codes und der Geruch nimmt ab.

Fazit

Denken Sie daran, dass die Beispiele, die wir oben betrachtet haben, genau das sind. Die Liste ist keinesfalls vollständig, aber es handelt sich dabei um gewöhnliche Gerüche, die Sie wahrscheinlich im Code sehen, mit dem Sie arbeiten oder sogar Code schreiben, den Sie schreiben. Ich werde der Erste sein, der zugibt, dass ich daran schuld bin.

Darüber hinaus stehen viele, viele Ressourcen zur Verfügung, um Codegerüche zu erkennen und zu beheben. Glücklicherweise verfügen wir auch über eine Reihe von Tools, mit denen wir sie automatisch erkennen und aufräumen können.

Und da gehen wir als nächstes voran. Wir werden insbesondere PHP CodeSniffer verwenden, um Code-Gerüche in unserem Code zu vermeiden. Anschließend erfahren Sie, wie Sie die WordPress-Regeln in PHP CodeSniffer integrieren und an unsere IDE Ihrer Wahl anschließen.

Wie bereits in diesem Artikel erwähnt, wird sich der nächste Artikel der Serie beim Schreiben von Code für WordPress stärker auf Codegerüche konzentrieren. Wir werden einen Blick auf einige verfügbare Tools und Ressourcen werfen, um sicherzustellen, dass Code-Gerüche vermieden werden, und um sicherzustellen, dass stärkerer Code geschrieben wird.

Studieren Sie in der Zwischenzeit die oben genannten Beispiele und prüfen Sie die Ressourcen, die ich zur Verfügung gestellt habe. Dort können Sie mehr über Gerüche und das Umkodieren von Codes von Personen und Orten erfahren, die in unserer Branche eine herausragende Rolle spielen.

Denken Sie daran, Sie können alle meine Kurse und Tutorials auf meiner Profilseite abrufen und Sie können mir auf meinem Blog und / oder Twitter unter @tommcfarlin folgen, wo ich über verschiedene Softwareentwicklungspraktiken spreche und wie wir sie in WordPress einsetzen können.

Bitte zögern Sie nicht, Fragen oder Kommentare in den untenstehenden Feed zu schreiben, und ich werde versuchen, auf jeden von ihnen zu antworten.