„Hallo Amigo! Heute werde ich dir etwas über Codestile und die Bedeutung des Codestils erzählen.“

„Ich beginne mit dem, was am wichtigsten ist.  Java-Code sollte leicht zu lesen sein.  Der allgemeine Ansatz für den Code ist dieser: Code wird einmal geschrieben, aber hundertmal gelesen.“

„Angenommen, Sie und zehn andere Programmierer schreiben eine Anwendung. Sie arbeiten drei Jahre lang an der Anwendung, mit Zwischenversionen alle drei Monate.“

"So lang?"

„Das ist Java, mein junger Grashüpfer!“ Wie wäre es mit einem Unternehmenssystem, das auf einem Dutzend Servern läuft und von 100 Leuten über mehr als 6 Jahre geschrieben wurde? Das passiert auch manchmal.

„Wow.“

„Jedenfalls ist die Hauptregel, die Hauptanforderung an den Code, dass er für andere Entwickler leicht lesbar sein muss.“

„In anderen Programmiersprachen arbeiten die Leute oft in kleinen Teams an kleinen Aufgaben, daher gibt es möglicherweise eine andere Hauptregel, wie zum Beispiel ‚Es funktioniert? Ausgezeichnet‘.“

„Im Laufe einiger Jahre werden alle Ihre Teammitglieder mehrere Änderungen an dem von Ihnen geschriebenen Code vornehmen. Und jedes Mal müssen sie verstehen, wie der Code funktioniert.“

„Und unverständlicher Code, der perfekt funktioniert, ist schwer zu ändern.  Sie verwerfen ihn und schreiben ihn auf ihre eigene Weise neu.  Schreiben Sie also Code, den andere verstehen können.  Wenn Sie Ihren Code verbessern können, dann verbessern Sie ihn. Wenn er verbessert werden kann, dann muss es verbessert werden!

„Wenn Sie 15 Minuten lang Code schreiben und dann zwei Stunden damit verbringen, ihn zu verbessern, machen Sie es richtig. Wie viel Zeit sparen Sie dem Team?“

„‚2 Stunden, um Ihren Code zu verstehen‘ x ‚die 100 Mal, in denen die Leute ihn verstehen müssen‘ = 200 Stunden.“

„Ich habe diese Zahlen aus dem Nichts gezogen, aber ich möchte, dass Sie das Problem und seinen Umfang verstehen.  Ihr Code ist so erstellt, dass er von anderen Programmierern gelesen werden kann.  Alles andere ist zweitrangig.“

„Funktioniert der Code nicht richtig? Wir werden ihn reparieren. Nicht optimiert? Wir werden ihn optimieren. Nicht dokumentiert? Wir werden Kommentare hinzufügen.“

Ist der Code schwer zu lesen? Werfen Sie den Mist in den Papierkorb und schreiben Sie alles noch einmal von Grund auf!

„Ich hätte nicht gedacht, dass es so eine große Sache ist.“

„Einer der Gründe, warum Java eine führende Programmiersprache ist, liegt darin, dass der gesamte Java-Code so geschrieben ist, dass er von anderen Programmierern gelesen werden kann.“

„Kommen wir nun zur zweiten Frage: Wie machen Sie Ihren Code so einfach wie möglich lesbar?

„Jeder kann verstehen, wenn jemand vertraute Wörter in seiner Muttersprache spricht. Das Gleiche gilt auch hier. Code ist leicht zu lesen, wenn ein Programmierer leicht erraten kann:

A)  Was jede Methode bewirkt

B)  Der Zweck jeder Klasse

C)  Genau das, was jede Variable speichert.

All dies wird in Namen kommuniziert: Klassennamen, Methodennamen und Variablennamen. Darüber hinaus gibt es Stil bei der Benennung von Variablen. Und es gibt den Codestil.

„Ich bin bereit zuzuhören.“

Programmieren basiert auf gutem Englisch!  Ein gut geschriebenes Programm liest sich wie gewöhnliche technische Dokumentation.

Beginnen wir mit den Namen.

„Ein Methodenname sollte kurz beschreiben, was die Methode tut. Dann kann der Code wie einfache Prosa gelesen werden.“

Programm
public String downloadPhoto(String url)
{
 String resultFileName = TempHelper.createTempFileName();

 Downloader downloader = new SingleFileDownloader(new Url(url));
 downloader.setResultFileName(resultFileName)
 downloader.start();
 while(downloader.isDone())
 {
  Thread.sleep(1000);
 }

 if (downloader.hasError())
  return null;

 return resultFileName;
}

„So wird ein solches Programm gelesen.“

Linie 1.

„Die Methode heißt ‚downloadPhoto‘. Es scheint, dass sie eine Fotodatei aus dem Internet herunterlädt. Wohin wird sie heruntergeladen? Wir wissen es noch nicht. Von wo? Die Methode hat einen Parameter namens url – das ist wahrscheinlich die URL dafür den Download.“

Zeile 3.

„Die Variable resultFileName wird von TempHelper.createTempFileName(); deklariert und einem Wert zugewiesen.“

Dies muss also der lokale Pfad zu der Datei sein, in der wir unsere heruntergeladene Datei speichern.

„Der Name ‚TempHelper‘ sagt uns nichts. Der Zusatz ‚Helper‘ besagt, dass es sich um eine Art Utility-Klasse handelt, die keine wichtige Geschäftslogik enthält, sondern vielmehr dazu dient, häufig anfallende Routineaufgaben zu vereinfachen.“

„Der Methodenname ‚createTempFileName‘ gibt an, dass diese Methode eine temporäre Datei (temp-Datei) erstellt und deren Namen zurückgibt. Eine temporäre Datei ist eine temporäre Datei, die für eine Weile erstellt und dann normalerweise gelöscht wird, wenn das Programm geschlossen wird. "

Zeile 5.

„Ein SingleFileDownloader-Objekt wird erstellt und dem Variablen-Downloader zugewiesen.“

Dies ist das Objekt, das unsere Datei aus dem Internet herunterlädt.

„Ein SingleFileDownloader-Objekt wird der Variable downloader zugewiesen. Aus dem Namen können wir annehmen, dass das Programm über mehrere Arten von Downloader-Klassen verfügt. Eine wurde für das Herunterladen einzelner Dateien geschrieben, und wir können wahrscheinlich damit rechnen, im Code auf andere Downloader für Gruppen zu stoßen von Dateien mit Namen wie: MultiFileDownloader, FileGroupDownloader oder DirectoryDownloader“

Zeile 6.

„Wir setzen die resultFileName-Eigenschaft des Downloader-Objekts auf den Wert der Variablen resultFileName. Mit anderen Worten, wir teilen dem Loader mit, wo die heruntergeladene Datei gespeichert werden soll. Wie zu erwarten. Wir sagen also im Grunde den Code voraus!“

Zeile 7.

„Wir rufen die Startmethode auf. Der Download startet. Das macht Sinn. Ich frage mich, wie der Download abläuft: in Teilen, in einem separaten Thread oder das Ganze hier? Wenn wir das Ganze hier herunterladen, könnte es eine Weile dauern lange dauern und Konsequenzen haben.“

Zeilen 8-11.

"Ah. Hier sehen wir die Standardschleife, die von jemandem geschrieben wurde, der auf den Abschluss eines Downloads wartet. Das Downloder-Objekt hat eine done-Eigenschaft, die von der isDone()-Methode zurückgegeben wird. Weil die Methode isDone() heißt und nicht getDone( ), kommen wir zu dem Schluss, dass die Variable done ein Boolescher Wert oder vielleicht ein Boolescher Wert ist.“

Zeilen 13-14.

„Wenn während des Downloads ein Fehler auftritt, gibt die downloadPhoto-Methode null zurück. Es ist gut, dass sie Fehler behandelt. Schlecht ist, dass sie nur null zurückgibt – es ist nicht klar, was der Fehler ist. Es wäre besser, eine Ausnahme mit Informationen darüber auszulösen der Fehler."

Zeile 16.

„Wir geben den Pfad zur lokalen Datei zurück, die die heruntergeladene Datei enthält.“

„Wow!“

„Der Code dieses Programms macht absolut klar, was es tut. Sie können sogar Vermutungen darüber anstellen, wie das Programm organisiert ist und welche anderen Klassen/Methoden wir finden werden.“

„Jetzt verstehe ich, wie wichtig Namen sind.“

„Mehr über Namen. Man kann oft erraten, welche Methoden ein Objekt/eine Klasse hat. Wenn es sich bei einem Objekt beispielsweise um eine Sammlung handelt, verfügt es höchstwahrscheinlich über eine size()- oder count()-Methode, um die Anzahl der Elemente zu ermitteln. Außerdem , wird es wahrscheinlich eine add()- oder insert()-Methode haben. Elemente werden aus Sammlungsklassen mit den Methoden get/getItem/getElement abgerufen.

„Wenn eine Variable i, j oder k heißt, dann handelt es sich höchstwahrscheinlich um einen Schleifenzähler.“

„Wenn eine Variable m oder n heißt, dann hat sie höchstwahrscheinlich die Größe eines Arrays/einer Sammlung.“

„Wenn eine Variable „Name“ heißt, handelt es sich höchstwahrscheinlich um einen String, der den Namen einer Person enthält.“

„Wenn eine Klasse FileInputStream heißt, dann ist sie gleichzeitig eine Datei und ein Eingabestream.“

„Je mehr Code man sieht, desto einfacher ist es, den Code anderer zu lesen.“

„Aber manchmal gibt es Code, der sehr schwer zu lesen ist. In diesem Fall hier ein sehr praktischer Ratschlag:“

Spitze
Schreiben Sie Code, als würde er von einem gewalttätigen Psychopathen gepflegt, der weiß, wo Sie leben .

„Das ist lustig und nicht lustig zugleich.“

„Jetzt ein wenig über die Stile, die zum Benennen von Variablen verwendet werden.“

„Java-Entwickler versuchen, Variablen und Methoden sehr aussagekräftige Namen zu geben. Daher bestehen Namen oft aus mehreren Wörtern. Es gibt 4 Stile für die Groß- und Kleinschreibung zusammengesetzter Namen.“

1) Kleinbuchstaben  – Alle Wörter werden mit Kleinbuchstaben geschrieben. Zum Beispiel:

Aus „grünem Haus“  wird „Gewächshaus“

Aus „Hollywood Girl“  wird  „Hollywoodgirl“

Dieser Stil wird für Paketnamen verwendet.

2) Großbuchstaben  – Alle Wörter werden mit Großbuchstaben geschrieben und durch einen Unterstrich getrennt. Zum Beispiel:

„Maximalwert“  wird zu MAX_VALUE

„Katzenanzahl“  wird zu CAT_COUNT

„Dieser Stil wird für die Namen von Konstanten (endgültige statische Felder) verwendet.“

3) CamelCase  – Alle Wörter werden mit Kleinbuchstaben geschrieben, außer dass der erste Buchstabe jedes Wortes großgeschrieben wird. Zum Beispiel:

Aus „Grünes Haus“  wird  „GreenHouse“

Aus „Hollywood Girl“  wird „HollywoodGirl“

Dieser Stil wird für die Namen von Klassen und Schnittstellen verwendet.

4) Lower CamelCase (gemischte Groß-/Kleinschreibung)  – Alle Wörter werden mit Kleinbuchstaben geschrieben, außer dass der erste Buchstabe jedes Wortes groß geschrieben ist. Zum Beispiel:

„Get width“ wird zu „getWidth“

„Get Hollywood Girl Name“ wird zu  „getHollywoodGirlName“

„Dieser Stil wird für die Namen von Variablen und Methoden verwendet.“

„Es gibt also nicht zu viele Regeln.“

1)  Alles ist in Lower CamelCase geschrieben.

2)  Namen von Klassen und Schnittstellen werden immer großgeschrieben.

3)  Paketnamen werden immer in Kleinbuchstaben geschrieben.

4)  Konstanten werden immer in Großbuchstaben geschrieben.

„Es gibt ein paar Nuancen, aber im Großen und Ganzen ist es so.“

„Jetzt zu den Methoden.  “ Methodennamen beginnen fast immer mit einem Verb! „count“ ist ein schlechter Name für eine Methode. Es ist besser, es getCount() zu nennen. Eine Methode führt eine Aktion für das Objekt aus:  startDownload , interrupt  , sleep  , loadPirateMusic .

„Wie Sie bereits wissen, gibt es Getter und Setter für die Arbeit mit den Eigenschaften/Feldern eines Objekts:  getName / setName , getCount / setCount usw.“

„Die einzige Ausnahme gilt für boolesche Werte. Für boolesche Werte verwenden Getter-Namen ‚is‘ und nicht ‚get‘, z. B. isDone, isEmpty. Auf diese Weise kommt es der normalen Sprache näher.“

„Wie wäre es, wenn Sie zwei statt acht Stunden am Tag arbeiten würden? Sind Sie in Versuchung?“

"Ja!"

„So wie Sie sein sollten. Für einen Junior-Java-Entwickler ist ein ausgezeichnetes Verständnis der Grundlagen von Java, also Java Core, die Grundvoraussetzung.“

„Ich habe noch eine Frage. Warum haben wir diese unterschiedlichen Methoden, um die Anzahl der Elemente zu ermitteln?“

Klasse Methode/Eigenschaft zum Ermitteln der Anzahl der Elemente
Zeichenfolge Länge ()
Array Länge
Anordnungsliste Größe ()
ThreadGroup aktive Anzahl ()

„Erstens wurde Java vor mehr als 20 Jahren erfunden, bevor Anforderungen wie setCount / getCount festgelegt wurden, und es gab einen gemeinsamen Ansatz aus der C-Sprache, es so kurz wie möglich zu machen.“

„Zweitens spielt hier die Semantik eine Rolle. Wenn wir von einem Array sprechen, sprechen wir von seiner Länge. Wenn wir von einer Sammlung sprechen, sprechen wir von ihrer Größe.“

„Was für eine interessante Lektion.“

„Ich würde dir gerne mehr erzählen, aber ich fürchte, dass du dich nicht an alles auf einmal erinnern wirst. Es ist besser, es dir in kleinen Portionen zu servieren.“

„Aber ich möchte auf den Stil in Bezug auf die Verwendung von geschweiften Klammern eingehen: {}. Es gibt zwei Ansätze:“

1)  Die Klammer wird jedes Mal in eine neue Zeile verschoben

2)  Die öffnende Klammer steht am Ende der vorherigen Zeile, während die schließende Klammer in einer neuen Zeile steht. Dieser Stil wird „ägyptische Zahnspange“ genannt.

„Ehrlich gesagt, Sie können entscheiden, wie Sie codieren. Viele Leute verwenden eine öffnende geschweifte Klammer in derselben Zeile. Viele Leute setzen sie in eine neue Zeile. Es ist wie die Debatte darüber, welches Ende des Eies zerbrochen werden soll: das kleine Ende oder das große.“ Ende."

„Das Einzige, was ich empfehlen kann, ist, sich an den Stil zu halten, der in dem Projekt, an dem Sie arbeiten, verwendet wird. Ändern Sie nicht den Code eines anderen, um ihn an Ihren bevorzugten Stil anzupassen.  Menschen sind unvollkommen. Ich sage Ihnen das als Doktor Bilaabo.“ "

„Danke für die interessante Lektion, Bilaabo. Ich werde darüber nachdenken, was du gesagt hast.“