Was macht „guten Stil“ in Java aus? [geschlossen]

9

Ich hatte diese Frage bei Stackoverflow gestellt und bevor sie ausgebuht wurde, erhielt ich den hilfreichen Vorschlag von Péter Török, dass dies ein besserer Ort sein könnte, um sie zu posten.

Ich programmiere seit einigen Jahren in Java. Ich habe Designentscheidungen oft mit Kollegen auf der Grundlage dessen diskutiert, was „guten Stil“ ausmacht. In der Tat gibt es eine Reihe von StackOverflow-Fragen / Antworten, die ein Design auf der Grundlage diskutieren, ob etwas „guter Stil“ ist.

Aber was macht "guten Stil" aus? Wie viele Dinge weiß ich es, wenn ich es sehe ... aber ich wollte eine bessere Idee haben als nur mein Gewissen zu sagen, dass sich dieses Design nicht richtig anfühlt.

Woran denken Sie, um guten, gut gestalteten Code zu erstellen?

(Ich erkenne an, dass dies etwas subjektiv ist, da der „gute Stil“ von der jeweiligen Aufgabe abhängt.) (Außerdem sollte ich hinzufügen, dass ich nicht an Teamstilen interessiert bin - z. B. "Wir verwenden Einrückungen mit 2 statt 4 Leerzeichen" ... und ich bin nicht an den Java-Code-Konventionen interessiert.)

Edit: danke für all die guten Antworten / Kommentare bisher. Ich bin besonders an Antworten interessiert, die helfen könnten, die Dinge zu kodifizieren, die das Gewissen (und möglicherweise den Magen) eines Programmierers erschüttern.

Amaidment
quelle
Unter vielen anderen Dingen, die hier aufgelistet sind, würde ich auf jeden Fall einfach sagen, dass Computer Code auf nahezu jede Art und Weise kompilieren können, wie Sie ihn schreiben, aber letztendlich muss Code für Menschen lesbar sein . Kommentar wie verrückt! Ein guter Test, den ich gerne verwende: Könnte eine Person nur meine Kommentare lesen , um zu erfahren, was der Code tut, was seine Ein- und Ausgänge sein sollten und welche Algorithmen dafür verwendet werden?
Brian
1
@brian, lass deinen Code erklären, wie . Hinterlassen Sie aktuelle Kommentare, um zu erklären, warum . Mit anderen Worten, kommentieren Sie nicht wie verrückt (im allgemeinen Fall)
4
Brian: Diese Technik wird definitiv nicht als gute Praxis angesehen. Es wird allgemein empfohlen, Ihren Code so selbstdokumentierend wie möglich zu gestalten (mit eindeutigen Variablennamen und Funktionszusammenhalt) und Kommentare abzugeben, um das "Warum" und nicht das "Wie" zu erläutern. Kommentare, die jedes Detail erklären, werden im Allgemeinen als ablenkend und oft gefährlich angesehen, da die Kommentare weniger häufig gepflegt werden als der Code.
Casey Patton
1
@ Brian: Deine letzte Aussage sagt alles. Der Code sollte lesbar sein. Kommentare werden abgestanden. Code tut es nie. Wenn Sie Kommentare benötigen, überarbeiten Sie diese, bis der Code so klar ist, dass Kommentare nur wiederholen, was der Code sagt. Der einzige gute Kommentar ist einer, der besagt, warum der Code auf eine bestimmte Weise funktioniert - beispielsweise um einen Fehler in einer Bibliothek eines Drittanbieters zu vermeiden -, damit jemand nicht zurückgeht und ihn in etwas ändert, das aus einem bestimmten Grund nicht funktioniert das ist nicht sofort ersichtlich.
Ryan Stewart
2
Ich bin offiziell gedemütigt worden. Entschuldigung @amaidment. Ich denke, wir müssen nach guten Codierungsstandards suchen, wenn es um Kommentare geht.
Brian

Antworten:

17

Ein paar kurze Punkte:

Ryan Stewart
quelle
3
+1. Vielleicht am kritischsten: Minimieren Sie doppelten Code. Wenn Sie versucht sind, mehr als ein paar Token auszuschneiden und einzufügen, müssen Sie eine Funktion extrahieren. Auch wenn die Funktion eine einzelne Codezeile ist.
Kevin Cline
4
Bei dupliziertem Code gehe ich wie folgt vor. Ausschneiden und Einfügen = okay. Das ist nur das Verschieben von Code (vorausgesetzt, Sie verwenden Einfügen einmal). Kopieren und Einfügen = schrecklich. Wenn Sie nur die Schaltfläche zum Kopieren aus Ihrem Wortschatz entfernen, ist es wahrscheinlicher, dass Sie das Richtige tun.
Sternberg
@jsternberg: +1 für die Unterscheidung zwischen Ausschneiden und Kopieren, aber ich stelle fest, dass viele Leute "Ausschneiden / Einfügen" sagen, wenn sie "Kopieren / Einfügen" meinen. Ich weiß nicht, wie die Unterscheidung verloren gegangen ist.
Ryan Stewart
5
Wiederhole dich nicht. Wiederhole dich nicht. Wiederhole dich nicht.
Konfigurator
1
@configurator, du riechst ein bisschen komisch ...
9

Hinzufügen zu Ryans Liste:

  • Befolgen Sie die SOLID- Prinzipien
  • Stellen Sie sicher, dass Ihr Code nicht zu zyklisch komplex ist
  • Testgesteuertes Java ist immer eine gute Sache
  • Wenn du eine xFactoryFactoryKlasse hast, machst du es falsch :-)
  • Angesichts der Open-Source-Bibliotheken im Java-Ökosystem ist es ein schlechter Stil, das Rad neu zu erfinden
  • Verwenden Sie die Joda-Zeit für Datum und Uhrzeit

Ich werde dort aufhören.

Martijn Verburg
quelle
2
Aber was ist mit der HammerFactoryFactoryFactoryKlasse? ;-)
Wayne Molina
@Wayne, Fabriken sind ein Hinweis darauf, dass einige Entscheidungen verzögert werden müssen, und FactoryFactoryFactories zeigen an, dass es eine Entscheidung gibt, die wirklich zur Laufzeit getroffen werden musste, aber nicht konnte.
Ich weiß, ich war sarkastisch und bezog mich auf diesen Artikel darüber, warum damals J2EE mit HammerFactories und HammerFactoryFactories übermäßig komplex war, und ich denke, HammerFactoryFactoryFactories. :)
Wayne Molina
@Martijn - danke für den SOLID Link; Darauf bin ich noch nie gestoßen. Sie schlagen vor, JodaTime zu verwenden. Ist dies nur eine (angemessene) Abneigung gegen die Java-Kalender- / Datumsklassen? Was ist mit JSR310 (dem Nachfolger von JodaTime)?
Amaidment
JSR-310 wird es hoffentlich in Java 8 schaffen (einige von uns bereiten sich darauf vor, dies zu erreichen, kontaktieren Sie mich, wenn Sie sich beteiligen möchten). In der Zwischenzeit ist die Joda-Zeit der Standard für den Umgang mit Datum und Uhrzeit in Java. Es gibt so viele Probleme mit Javas Datums- und Kalendersystem, dass ich nicht einmal weiß, wo ich anfangen soll ;-). Der Mörder ist, dass Daten veränderlich sind und dass es kein Konzept für einen Augenblick oder eine Periode gibt oder ... nein, ich werde hier aufhören :-).
Martijn Verburg
1

Obwohl ich die Antworten anderer zu schätzen wusste, fand ich es nur fair, einige der Dinge zu teilen, über die ich nachdenke, wenn ich versuche, guten Code zu schreiben:

  • Was muss über diese Klasse / Methode / Variable wissen? dh wo soll dieses Wissen leben?

  • Wie kann sich dieser Code auf den Speicher / die Leistung meiner Anwendung auswirken? (Ich erkenne an, dass "vorzeitige Optimierung die Wurzel allen Übels ist". Ich schlage daher nicht vor, viel Zeit mit der Optimierung zu verbringen, sondern ein Bewusstsein, während ich meinen Code anfänglich schreibe.)

  • Ist klar (aus dem Code und den Codestrukturen), was dies bewirkt? (Ich versuche, der Maxime zu folgen: "Bemühen Sie sich, es den Menschen nicht zu ermöglichen, zu verstehen, und versuchen Sie, es den Menschen unmöglich zu machen, sie falsch zu verstehen.")

Amaidment
quelle
1

In den Klassen String und ArrayList finden Sie hervorragende Beispiele für die ordnungsgemäße Java-Programmierung. Aber sie sind sehr prägnant, fast im C-Stil, was für wartbaren Code mit minimalen Java-Dokumenten nicht unbedingt am besten ist. Die übliche Praxis in meinem Shop sind keine Kommentare, daher versuche ich, durch Code zu kommentieren, indem ich ausführliche camelCase-Variablennamen und übermäßige Verwendung von Zeilenumbrüchen verwende, um eine Gedankenzeile von einer anderen abzugrenzen. Ich diskutiere immer noch über die Verwendung von Tabulatoren, um Vars von ihren Werten zu trennen. Registerkarten können die Lesbarkeit verbessern, IMO, aber nur, wenn sie minimal ausgeführt werden und sehr subjektiv sind. Ich finde, es geht wirklich um das Publikum. Hier gibt es keine beste Antwort.

Carlmart
quelle