Wie schreibe ich sauberen Code? Lehren aus "The Clean Code" - Robert C. Martin

Es gibt zwei Dinge - Programmierung und gute Programmierung. Wir haben alle programmiert. Jetzt ist die Zeit für eine gute Programmierung gekommen. Wir alle wissen, dass auch der schlechte Code funktioniert. Aber es braucht Zeit und Ressourcen, um ein Programm gut zu machen. Darüber hinaus verspotten andere Entwickler Sie, wenn sie versuchen, herauszufinden, was alles in Ihrem Code vor sich geht. Es ist jedoch nie zu spät, sich um Ihre Programme zu kümmern.

Dieses Buch hat mir viel Wissen darüber gegeben, was die besten Methoden sind und wie man tatsächlich Code schreibt. Jetzt schäme ich mich für meine Codierfähigkeiten. Obwohl ich immer bestrebt bin, meinen Code zu verbessern, hat dieses Buch viel mehr gelehrt.

Sie lesen diesen Blog aus zwei Gründen. Erstens sind Sie ein Programmierer. Zweitens möchten Sie ein besserer Programmierer sein. Gut. Wir brauchen bessere Programmierer.

Merkmale eines Clean-Codes:

  1. Es sollte elegant sein - Sauberer Code sollte angenehm zu lesen sein. Wenn du es liest, solltest du lächeln wie bei einer gut gearbeiteten Spieluhr oder einem gut designten Auto.
  2. Sauberer Code ist fokussiert - Jede Funktion, jede Klasse, jedes Modul enthüllt eine zielstrebige Haltung, die von den umgebenden Details völlig unbeeinträchtigt und unverschmutzt bleibt.
  3. Für sauberen Code wird gesorgt. Jemand hat sich die Zeit genommen, es einfach und ordentlich zu halten. Sie haben den Details die gebührende Aufmerksamkeit geschenkt. Sie haben sich gekümmert.

4. Führt alle Tests aus

5. Enthält keine Vervielfältigung

6. Minimieren Sie die Anzahl der Entitäten wie Klassen, Methoden, Funktionen und dergleichen.

Wie schreibe ich Clean Code?

Bedeutungsvolle Namen

Verwenden Sie die Absicht, Namen preiszugeben. Die Auswahl guter Namen kostet Zeit, spart aber mehr als nötig. Der Name einer Variablen, Funktion oder Klasse sollte alle wichtigen Fragen beantworten. Es sollte Ihnen sagen, warum es existiert, was es tut und wie es verwendet wird. Wenn ein Name einen Kommentar erfordert, zeigt der Name nicht seine Absicht.

ZB d; // Verstrichene Zeit in Tagen.

Wir sollten einen Namen wählen, der angibt, was gemessen wird und welche Maßeinheit dies ist.

Ein besserer Name wäre: - int elapsedTime. (Auch wenn das Buch elapsedTimeInDays sagt, würde ich das erstere immer noch bevorzugen. Angenommen, die verstrichene Zeit wird in Millisekunden geändert. Dann müssten wir long zu int und elapsedTimeInMillis ändern, anstatt elapsedTimeInDays. Und wie lange werden wir beide ändern den Datentyp und den Namen.)

Klassennamen - Klassen und Objekte sollten Substantiv- oder Nominalphrasennamen wie Customer, WikiPage, Account und AddressParser haben. Vermeiden Sie Wörter wie Manager, Prozessor, Daten oder Informationen im Namen einer Klasse. Ein Klassenname sollte kein Verb sein.

Methodennamen - Methoden sollten Verb- oder Verbphrasennamen wie postPayment, deletePage oder save enthalten. Accessoren, Mutatoren und Prädikate sollten nach ihrem Wert benannt und mit dem Präfix get, set versehen werden.

Wenn Konstruktoren überladen sind, verwenden Sie statische Factory-Methoden mit Namen, die die Argumente beschreiben. Zum Beispiel,

Complex fulcrumPoint = Complex.FromRealNumber (23.0); ist im Allgemeinen besser als Complex fulcrumPoint = new Complex (23.0);

Wählen Sie ein Wort pro Konzept - Wählen Sie ein Wort für ein abstraktes Konzept und bleiben Sie dabei. Zum Beispiel ist es verwirrend, Methoden verschiedener Klassen abzurufen, abzurufen und als gleichwertige Methoden abzurufen. Wie erinnerst du dich, welcher Methodenname zu welcher Klasse passt? Ebenso ist es verwirrend, einen Controller und einen Manager sowie einen Treiber in derselben Codebasis zu haben. Was ist der wesentliche Unterschied zwischen einem DeviceManager und einem Protocol-Controller?

Funktionen

Die erste Regel für Funktionen ist, dass sie klein sein sollten. Die zweite Regel von Funktionen ist, dass sie kleiner sein sollten. Dies impliziert, dass die Blöcke in if-Anweisungen, else-Anweisungen, while-Anweisungen usw. eine Zeile lang sein sollten. Wahrscheinlich sollte diese Zeile ein Funktionsaufruf sein. Dies hält nicht nur die umschließende Funktion klein, sondern fügt auch einen dokumentarischen Wert hinzu, da die im Block aufgerufene Funktion einen aussagekräftigen Namen haben kann.

Funktionsargumente

Eine Funktion sollte nicht mehr als 3 Argumente haben. Halte es so niedrig wie möglich. Wenn eine Funktion mehr als zwei oder drei Argumente benötigt, sollten einige dieser Argumente wahrscheinlich in eine eigene Klasse eingeschlossen werden. Die Anzahl der Argumente zu verringern, indem Objekte daraus erstellt werden, mag schummeln scheinen, ist es aber nicht.

Wenn ich jetzt sage, um eine Funktionsgröße zu reduzieren, würden Sie definitiv darüber nachdenken, wie Sie den Try-Catch reduzieren können, da Ihr Code dadurch bereits so viel größer wird. Meine Antwort ist make eine Funktion, die nur die try-catch-finally-Anweisungen enthält. Und trennen Sie die Körper von try / catch / finally in separate Funktionen. Z.B-

Dies macht die Logik kristallklar. Funktionsnamen beschreiben leicht, was wir erreichen wollen. Fehlerbehandlung kann ignoriert werden. Dies bietet eine schöne Trennung, die das Verstehen und Ändern des Codes erleichtert.

Fehlerbehandlung ist eine Sache - Funktion sollte eine Sache tun. Fehlerbehandlung ist eine andere Sache. Wenn eine Funktion das Schlüsselwort try hat, sollte es das allererste Schlüsselwort sein und nach den catch / finally-Blöcken sollte nichts stehen.

Bemerkungen

Wenn Sie Kommentare schreiben, um Ihren Standpunkt zu belegen, machen Sie einen Fehler. Im Idealfall sind keine Kommentare erforderlich. Wenn Ihr Code kommentiert werden muss, machen Sie etwas falsch. Unser Code sollte alles erklären. Moderne Programmiersprachen sind wie Englisch, durch die wir unseren Punkt leicht erklären können. Eine korrekte Benennung kann Kommentare verhindern.

Rechtliche Hinweise werden hier nicht berücksichtigt. Sie müssen schreiben. Rechtliche Hinweise bedeuten Urheberrechts- und Lizenzerklärungen.

Objekte und Datenstrukturen

Dies ist ein komplexes Thema, achten Sie also gut darauf. Zunächst müssen wir den Unterschied zwischen Objekt- und Datenstrukturen verdeutlichen.

Objekte verstecken ihre Daten hinter Abstraktionen und machen Funktionen verfügbar, die mit diesen Daten arbeiten. Datenstruktur legen ihre Daten offen und haben keine sinnvollen Funktionen.

Diese beiden Dinge sind völlig unterschiedlich. Zum einen geht es nur um das Speichern von Daten und zum anderen darum, wie diese Daten bearbeitet werden. Betrachten Sie beispielsweise das folgende Beispiel für die Verfahrensform. Die Geometrieklasse verarbeitet die drei Formklassen. Die Formklassen sind einfache Datenstrukturen ohne Verhalten. Das gesamte Verhalten ist in der Geometrieklasse.

Überlegen Sie, was passieren würde, wenn eine perimeter () -Funktion zu Geometry hinzugefügt würde. Die Formklassen wären davon nicht betroffen! Alle anderen Klassen, die von den Formen abhingen, wären ebenfalls nicht betroffen! Wenn ich dagegen eine neue Form hinzufüge, muss ich alle Funktionen in Geometry ändern, um damit fertig zu werden. Lesen Sie das noch einmal durch. Beachten Sie, dass die beiden Bedingungen diametral entgegengesetzt sind.

Betrachten Sie nun einen anderen Ansatz für das obige Szenario.

Jetzt können wir einfach neue Shapes hinzufügen, d. H. Datenstrukturen im Vergleich zum vorherigen Fall. Wenn wir die perimeter () -Funktion nur in einer Form hinzufügen müssen, müssen wir diese Funktion in allen Formen implementieren, da die Shape-Klasse eine Schnittstelle ist, die die area () - und perimeter () -Funktion enthält. Das heisst:

Datenstrukturen erleichtern das Hinzufügen neuer Funktionen, ohne die vorhandenen Datenstrukturen zu ändern. OO-Code (unter Verwendung von Objekten) erleichtert das Hinzufügen neuer Klassen, ohne vorhandene Funktionen zu ändern.

Das kostenlose ist auch wahr:

Der Prozedurcode (unter Verwendung von Datenstrukturen) erschwert das Hinzufügen neuer Datenstrukturen, da alle Funktionen geändert werden müssen. OO-Code erschwert das Hinzufügen neuer Funktionen, da alle Klassen geändert werden müssen.

Also, die Dinge, die für OO schwierig sind, sind für Prozeduren einfach, und die Dinge, die für Prozeduren schwierig sind, sind für OO einfach!

In jedem komplexen System wird es Zeiten geben, in denen wir neue Datentypen anstelle neuer Funktionen hinzufügen möchten. Für diese Fälle sind Objekte und OO am besten geeignet. Andererseits wird es auch Zeiten geben, in denen wir anstelle von Datentypen neue Funktionen hinzufügen möchten. In diesem Fall sind Verfahrenscode und Datenstrukturen angemessener.

Erfahrene Programmierer wissen, dass die Vorstellung, dass alles ein Objekt ist, ein Mythos ist. Manchmal möchten Sie wirklich einfache Datenstrukturen mit darauf ablaufenden Prozeduren. Sie müssen sich also genau überlegen, was Sie implementieren möchten. Denken Sie auch über die zukünftige Perspektive nach, die leicht zu aktualisieren sein wird. Da in diesem Beispiel in Zukunft jede neue Form hinzugefügt werden kann, werde ich den OO-Ansatz dafür wählen.

Ich verstehe, dass es schwierig ist, gute Programme zu schreiben, wenn man bedenkt, in welcher Zeitspanne Sie Ihre Aufgaben erledigen müssen. Aber bis wie lange zögern Sie noch? Beginne langsam und sei konsequent. Ihr Code kann Wunder für sich selbst und vor allem für andere tun. Ich habe angefangen und so viele Fehler gefunden, die ich die ganze Zeit gemacht habe. Obwohl es einige zusätzliche Stunden meines täglichen Zeitlimits gekostet hat, wird es mich in Zukunft bezahlen.

Dies ist kein Ende dieses Blogs. Ich werde weiterhin über neue Möglichkeiten zur Bereinigung Ihres Codes schreiben. Darüber hinaus werde ich einige grundlegende Entwurfsmuster beschreiben, die jeder Entwickler in jeder Technologie kennen muss.

In der Zwischenzeit, wenn Ihnen mein Blog gefällt und Sie daraus gelernt haben, applaudieren Sie bitte. Es motiviert mich, schneller einen neuen Blog zu erstellen :) Kommentare / Vorschläge sind wie immer willkommen. Lerne weiter und teile weiter.

Schauen Sie sich alle Top-Artikel auf blog.mindorks.com an