Lernen ohne Nachdenken ist verlorene Arbeit; Denken ohne Lernen ist gefährlich.
Programmier-Ninjas der Vergangenheit nutzten diese Tricks, um den Geist von Code-Betreuern zu schärfen.
Code-Review-Gurus suchen in Testaufgaben danach.
Anfänger-Entwickler nutzen sie manchmal sogar besser als Programmier-Ninjas.
Lesen Sie sie sorgfältig durch und finden Sie heraus, wer Sie sind – ein Ninja, ein Neuling oder vielleicht ein Code-Reviewer?
Ironie erkannt
Viele versuchen, Ninja-Pfaden zu folgen. Nur wenigen gelingt es.
Machen Sie den Code so kurz wie möglich. Zeigen Sie, wie schlau Sie sind.
Lassen Sie sich von subtilen Sprachfunktionen leiten.
Schauen Sie sich zum Beispiel diesen ternären Operator '?'
an. :
// entnommen aus einer bekannten Javascript-Bibliothek ich = ich ? i < 0 ? Math.max(0, len + i) : i : 0;
Cool, oder? Wenn Sie so schreiben, wird ein Entwickler, der auf diese Zeile stößt und versucht zu verstehen, was der Wert von i
ist, eine fröhliche Zeit haben. Dann kommen Sie zu Ihnen und suchen Sie nach einer Antwort.
Sagen Sie ihnen, dass kürzer immer besser ist. Führe sie in die Wege des Ninja ein.
Das Dao verbirgt sich in der Wortlosigkeit. Nur das Dao ist gut begonnen und gut abgeschlossen.
Eine andere Möglichkeit, kürzer zu codieren, besteht darin, überall Variablennamen aus einem Buchstaben zu verwenden. Wie a
, b
oder c
.
Eine kurze Variable verschwindet im Code wie ein echter Ninja im Wald. Niemand wird es über die „Suche“ des Editors finden können. Und selbst wenn jemand es tut, wird er nicht in der Lage sein, zu „entschlüsseln“, was der Name a
oder b
bedeutet.
…Aber es gibt eine Ausnahme. Ein echter Ninja wird i
niemals als Zähler in einer "for"
-Schleife verwenden. Überall, aber nicht hier. Schauen Sie sich um, es gibt noch viele weitere exotische Buchstaben. Zum Beispiel x
oder y
.
Eine exotische Variable als Schleifenzähler ist besonders cool, wenn der Schleifenkörper 1-2 Seiten umfasst (machen Sie ihn länger, wenn Sie können). Wenn dann jemand tief in die Schleife hineinschaut, wird er nicht schnell herausfinden können, dass die Variable mit dem Namen x
der Schleifenzähler ist.
Wenn die Teamregeln die Verwendung von einbuchstabigen und vagen Namen verbieten – kürzen Sie sie, nehmen Sie Abkürzungen vor.
So was:
list
→ lst
.
userAgent
→ ua
.
browser
→ brsr
.
…usw
Nur wer wirklich ein gutes Gespür hat, wird solche Namen verstehen können. Versuchen Sie, alles zu kürzen. Nur eine würdige Person sollte in der Lage sein, die Entwicklung Ihres Codes voranzutreiben.
Der große Platz ist eckenlos
Das große Schiff ist zuletzt fertig,
Die große Note ist ein verfeinerter Klang,
Das große Bild hat keine Form.
Versuchen Sie bei der Namenswahl, das abstrakteste Wort zu verwenden. Wie obj
, data
, value
, item
, elem
und so weiter.
Der ideale Name für eine Variable ist data
. Benutzen Sie es überall dort, wo Sie können. Tatsächlich enthält jede Variable Daten , oder?
…Aber was tun, wenn bereits data
erfasst wurden? Probieren Sie value
aus, es ist auch universell. Schließlich erhält eine Variable irgendwann einen Wert .
Benennen Sie eine Variable nach ihrem Typ: str
, num
…
Probieren Sie es aus. Ein junger Eingeweihter fragt sich vielleicht: Sind solche Namen für einen Ninja wirklich nützlich? Tatsächlich sind sie es!
Sicher, der Variablenname hat immer noch eine Bedeutung. Es sagt aus, was sich in der Variablen befindet: eine Zeichenfolge, eine Zahl oder etwas anderes. Aber wenn ein Außenstehender versucht, den Code zu verstehen, wird er überrascht sein, dass es tatsächlich überhaupt keine Informationen gibt! Und letztendlich wird es Ihnen nicht gelingen, Ihren gut durchdachten Code zu ändern.
Der Werttyp lässt sich durch Debuggen leicht herausfinden. Aber was bedeutet die Variable? Welche Zeichenfolge/Zahl wird gespeichert?
Ohne eine gute Meditation gibt es einfach keine Möglichkeit, das herauszufinden!
…Aber was ist, wenn es solche Namen nicht mehr gibt? Fügen Sie einfach eine Zahl hinzu: data1, item2, elem5
…
Nur ein wirklich aufmerksamer Programmierer sollte in der Lage sein, Ihren Code zu verstehen. Aber wie kann man das überprüfen?
Eine Möglichkeit besteht darin, ähnliche Variablennamen wie date
und data
zu verwenden.
Mischen Sie sie, wo Sie können.
Ein schnelles Lesen eines solchen Codes wird unmöglich. Und wenn es einen Tippfehler gibt ... Ähm ... Wir sitzen lange fest, Zeit zum Teetrinken.
Das Tao, das erzählt werden kann, ist nicht das ewige Tao. Der Name, der benannt werden kann, ist nicht der ewige Name.
Die Verwendung ähnlicher Namen für dieselben Dinge macht das Leben interessanter und zeigt der Öffentlichkeit Ihre Kreativität.
Betrachten Sie beispielsweise Funktionspräfixe. Wenn eine Funktion eine Meldung auf dem Bildschirm anzeigt, starten Sie sie mit display…
, z. B. displayMessage
. Und wenn dann eine andere Funktion etwas anderes auf dem Bildschirm anzeigt, etwa einen Benutzernamen, beginnen Sie sie mit show…
(wie showName
).
Unterstellen Sie, dass es einen subtilen Unterschied zwischen solchen Funktionen gibt, obwohl es keinen gibt.
Machen Sie einen Pakt mit anderen Ninjas des Teams: Wenn John anfängt, Funktionen mit display...
in seinem Code zu „zeigen“, dann könnte Peter render..
und Ann – paint...
verwenden. Beachten Sie, wie viel interessanter und vielfältiger der Code geworden ist.
…Und jetzt der Hattrick!
Für zwei Funktionen mit wichtigen Unterschieden – verwenden Sie dasselbe Präfix!
Beispielsweise verwendet die Funktion printPage(page)
einen Drucker. Und die Funktion printText(text)
bringt den Text auf den Bildschirm. Lassen Sie einen unbekannten Leser gut über die ähnlich benannte Funktion printMessage
nachdenken: „Wo wird die Nachricht abgelegt?“ Auf einen Drucker oder auf den Bildschirm?“ Damit es wirklich glänzt, sollte printMessage(message)
es im neuen Fenster ausgeben!
Sobald das Ganze geteilt ist, werden die Teile zerlegt
brauche Namen.
Namen gibt es schon genug.
Man muss wissen, wann man aufhören muss.
Fügen Sie nur dann eine neue Variable hinzu, wenn dies unbedingt erforderlich ist.
Verwenden Sie stattdessen vorhandene Namen wieder. Schreiben Sie einfach neue Werte hinein.
Versuchen Sie, in einer Funktion nur Variablen zu verwenden, die als Parameter übergeben werden.
Das würde es wirklich schwierig machen , jetzt genau zu identifizieren, was in der Variablen enthalten ist. Und auch woher es kommt. Der Zweck besteht darin, die Intuition und das Gedächtnis einer Person zu entwickeln, die den Code liest. Eine Person mit schwacher Intuition müsste den Code Zeile für Zeile analysieren und die Änderungen in jedem Codezweig verfolgen.
Eine fortgeschrittene Variante des Ansatzes besteht darin, den Wert verdeckt (!) mitten in einer Schleife oder einer Funktion durch etwas Ähnliches zu ersetzen.
Zum Beispiel:
Funktion NinjaFunction(elem) { // 20 Zeilen Code für die Arbeit mit elem elem = clone(elem); // 20 weitere Zeilen, jetzt funktioniert es mit dem Klon des Elem! }
Ein Programmierkollege, der in der zweiten Hälfte der Funktion mit elem
arbeiten möchte, wird überrascht sein … Erst beim Debuggen, nach Prüfung des Codes, wird er feststellen, dass er mit einem Klon arbeitet!
Wird regelmäßig im Code angezeigt. Selbst gegen einen erfahrenen Ninja tödlich wirksam.
Setzen Sie Unterstriche _
und __
vor Variablennamen. Wie _name
oder __value
. Es wäre großartig, wenn Sie nur ihre Bedeutung wüssten. Oder besser: Fügen Sie sie nur zum Spaß und ohne besondere Bedeutung hinzu. Oder unterschiedliche Bedeutungen an verschiedenen Orten.
Du tötest zwei Kaninchen mit einem Schuss. Erstens wird der Code länger und schlechter lesbar, und zweitens kann es sein, dass ein Mitentwickler viel Zeit damit verbringt, herauszufinden, was die Unterstriche bedeuten.
Ein intelligenter Ninja setzt an einer Stelle im Code Unterstriche und umgeht sie an anderen Stellen. Das macht den Code noch fragiler und erhöht die Wahrscheinlichkeit zukünftiger Fehler.
Lassen Sie alle sehen, wie großartig Ihre Wesen sind! Namen wie superElement
, megaFrame
und niceItem
werden den Leser auf jeden Fall aufklären.
Tatsächlich steht auf der einen Seite etwas geschrieben: super..
, mega..
, nice..
Aber auf der anderen Seite – das bringt keine Details. Ein Leser könnte beschließen, nach einer verborgenen Bedeutung zu suchen und ein oder zwei Stunden seiner bezahlten Arbeitszeit zu meditieren.
Wenn man im Licht ist, kann man in der Dunkelheit nichts sehen.
Wenn man in der Dunkelheit ist, kann man im Licht alles sehen.
Verwenden Sie für Variablen innerhalb und außerhalb einer Funktion dieselben Namen. So einfach. Keine Bemühungen, neue Namen zu erfinden.
let user = AuthenticateUser(); Funktion render() { let user = anotherValue(); ... ...viele Zeilen... ... ... // <-- ein Programmierer möchte hier mit dem Benutzer arbeiten und... ... }
Ein Programmierer, der in den render
springt, wird wahrscheinlich nicht bemerken, dass ein lokaler user
den äußeren beschattet.
Dann werden sie versuchen, mit user
zu arbeiten und davon auszugehen, dass es sich um die externe Variable handelt, das Ergebnis von authenticateUser()
… Die Falle ist ausgelöst! Hallo, Debugger…
Es gibt Funktionen, die scheinbar nichts ändern. Wie isReady()
, checkPermission()
, findTags()
… Es wird davon ausgegangen, dass sie Berechnungen durchführen, die Daten finden und zurückgeben, ohne etwas außerhalb davon zu ändern. Mit anderen Worten: ohne „Nebenwirkungen“.
Ein wirklich schöner Trick besteht darin, ihnen zusätzlich zur Hauptaufgabe eine „nützliche“ Aktion hinzuzufügen.
Ein Ausdruck benommener Überraschung auf dem Gesicht Ihres Kollegen, wenn er eine Funktion namens „etwas ändern“ sieht is..
check..
oder find...
– wird Ihre Grenzen der Vernunft auf jeden Fall erweitern.
Eine andere Möglichkeit, zu überraschen, besteht darin, ein nicht standardmäßiges Ergebnis zurückzugeben.
Zeigen Sie Ihr originelles Denken! Lassen Sie den Aufruf von checkPermission
nicht true/false
zurückgeben, sondern ein komplexes Objekt mit den Ergebnissen der Prüfung.
Diejenigen Entwickler, die versuchen if (checkPermission(..))
zu schreiben, werden sich fragen, warum es nicht funktioniert. Sagen Sie ihnen: „Lesen Sie die Dokumente!“. Und geben Sie diesen Artikel.
Das große Tao fließt überall,
sowohl nach links als auch nach rechts.
Beschränken Sie die Funktion nicht durch den Inhalt ihres Namens. Seien Sie breiter.
Beispielsweise könnte eine Funktion validateEmail(email)
(neben der Überprüfung der E-Mail auf Richtigkeit) eine Fehlermeldung anzeigen und zur erneuten Eingabe der E-Mail auffordern.
Zusätzliche Aktionen sollten aus dem Funktionsnamen nicht ersichtlich sein. Ein echter Ninja-Programmierer wird sie auch aus dem Code nicht offensichtlich machen.
Das Zusammenfassen mehrerer Aktionen zu einer schützt Ihren Code vor Wiederverwendung.
Stellen Sie sich vor, ein anderer Entwickler möchte nur die E-Mails prüfen und keine Nachricht ausgeben. Ihre Funktion validateEmail(email)
die beides tut, wird ihnen nicht passen. Sie unterbrechen Ihre Meditation also nicht, indem sie etwas dazu fragen.
Alle oben genannten „Ratschläge“ stammen aus dem echten Code … Manchmal wurden sie von erfahrenen Entwicklern geschrieben. Vielleicht sogar erfahrener als du ;)
Befolgen Sie einige davon, und Ihr Code wird voller Überraschungen sein.
Befolgen Sie viele davon, und Ihr Code wird wirklich Ihnen gehören, niemand würde ihn ändern wollen.
Wenn Sie alle befolgen, wird Ihr Code zu einer wertvollen Lektion für junge Entwickler, die auf der Suche nach Erleuchtung sind.