Java-Projekte professionell auffahren



  • Hallo Freunde der Sonne,

    Als ich anfing, programmieren zu lernen, wollte ich einfach nur wissen, wie man einem Computer Anweisungen gibt. Das kann ich nun mittlerweile. Mehr oder weniger.

    Ich habe schon viel Literatur zu den Sprachen Python, Java, C, C++ und anderen gelesen. Dabei ist mir aufgefallen, dass zwar meist sehr ausführlich das Programmieren, also das Umsetzen einer Idee erklärt wird, aber meistens nicht oder nur mangelhaft, wie man eine Idee durchdenkt, und einen, ich sage mal, "Programmierplan" aufstellt. Ich glaube, dass viele Autoren von Anfängerbüchern hier Nachholbedarf haben.

    Ich möchte in diesem Thread eure Meinung hören, welche Methodiken zum Durchdenken einer Idee und zum Aufstellen eines Programmierplans ihr im Laufe eures Schaffens als Programmierer als genutzt habt, und wie ihr vorgeht, wenn es um die Entwicklung einer völlig neuen Softwareidee geht. Es wäre schön, wenn hierbei der Schwerpunkt auf die Entwicklung von Javaprogrammen gelegt werden könnte.

    Ich persönlich gehe wie folgt vor:

    Ich formuliere eine Softwareidee im Groben. Dann versuche ich mir bewusst zu machen, welche einzelnen Komponenten in meiner Idee vorkommen. Diese versuche ich als Klassen zu modellieren und fange dann an zu programmieren. Die konkrete Ausgestaltung ergibt sich meist erst im Laufe der Programmierung, was den Nachteil hat, dass einem bessere Implementierungsansätze erst dann bewusst werden, wenn man schon die Hälfte fertigprogrammiert hat. Dieses Anfängergewurstel sollte durch bessere Praktiken ersetzt werden.



  • Dexter1997 schrieb:

    Dabei ist mir aufgefallen, dass zwar meist sehr ausführlich das Programmieren, also das Umsetzen einer Idee erklärt wird, aber meistens nicht oder nur mangelhaft, wie man eine Idee durchdenkt, und einen, ich sage mal, "Programmierplan" aufstellt.

    Das gehört auch nicht zum "Programmieren in Sprache X", sondern ist eine ganz eigene Wissenschaft, nämlich "Softwareentwurf". Dazu gibts wieder eigene Bücher.

    Der Softwareentwurf kann sogar gemacht werden, bevor die Entscheidung für eine konkrete Sprache fällt - es sollte vielleicht nur vorab bekannt sein, ob es eine objektorientierte, eine funktionale oder eine prozedurale Sprache sein wird.



  • Dexter1997 schrieb:

    Ich persönlich gehe wie folgt vor: ...

    Das ist schon gar nicht schlecht, und wenn vor allem das letzte (das Anfängergewurstel durch bessere Praktiken ersetzen) regelmäßig und konsequent stattfindet, dann wirst du dich auch zügig verbessern.

    Andere wichtige Punkte:
    1. Nicht nur im eigenen Saft kochen und nicht jedes Rad selber erfinden. Lies Blogs von anderen Entwicklern, um auf andere Ideen zu kommen.

    2. Such Antworten zu konkreten Fragestellungen immer auch auf Plattformen wie stackoverflow und denk über das, was da geschrieben wird, zumindest nach. Auch wenn es dir für deinen Anwendungsfall way-over-the-top erscheint - häufig ist es das gar nicht, und mit der Zeit lernst du, das einzuschätzen.

    3. Hab Mut zum Ausprobieren, nur dadurch lernst du wirklich. Stell dein Projekt unter Source-Kontrolle (git oder svn), mach kleinteilige Commits und lerne zu branchen und zu mergen, dann kann nicht viel schiefgehen.

    4. Hör nicht auf, wenn du Klassen modelliert hast. Lerne, auch Interfaces zu modellieren. Bei großen Projekten sind Klassen nur die halbe Miete, Interfaces sind wichtiger.



  • Vielen Dank für eure wertvollen Ratschläge. Dann ist Softwareentwurf mein Suchbegriff, genau nach sowas habe ich hier auch gesucht, dankesehr!

    Sind Schnittstellen wirklich wichtiger als Klassen? Mir schien es eher, als wollte Java damit versuchen, krampfhaft die fehlende Mehrfachvererbung zu kompensieren, da es in den Lehrbüchern als Einleitung immer heißt: "Java erlaubt keine Mehrfachvererbung, aber das ist nicht so schlimm, denn es gibt Schnittstellen [...]"

    In meinem bisher größten Projekt beispielsweise konnte ich keine Anwendung für Schnittstellen finden:
    https://codereview.stackexchange.com/questions/186334/fight-against-enemies-rpg-in-java

    Vielleicht lag's auch daran, dass keine Mehrfachvererbung vonnöten war...



  • Dexter1997 schrieb:

    Vielen Dank für eure wertvollen Ratschläge. Dann ist Softwareentwurf mein Suchbegriff, genau nach sowas habe ich hier auch gesucht, dankesehr!

    Sind Schnittstellen wirklich wichtiger als Klassen? Mir schien es eher, als wollte Java damit versuchen, krampfhaft die fehlende Mehrfachvererbung zu kompensieren, da es in den Lehrbüchern als Einleitung immer heißt: "Java erlaubt keine Mehrfachvererbung, aber das ist nicht so schlimm, denn es gibt Schnittstellen [...]"

    In meinem bisher größten Projekt beispielsweise konnte ich keine Anwendung für Schnittstellen finden:
    https://codereview.stackexchange.com/questions/186334/fight-against-enemies-rpg-in-java

    Vielleicht lag's auch daran, dass keine Mehrfachvererbung vonnöten war...

    Mit Schnittstellen meinst du Interfaces?
    Das ist Javas Art der Mehrfachvererbung.



  • Dexter1997 schrieb:

    Sind Schnittstellen wirklich wichtiger als Klassen?

    Sie sind was anderes als Klassen. In Java sieht man das sogar an der Syntax ("extends" vs. "implements"). Wichtig ist, dass man die Unterschiede versteht und die Konzepte "Schnittstelle" und "Basisklasse" richtig anwenden kann.

    Von einer Basisklasse abzuleiten führt dazu, dass die abgeleitete Klasse die Eigenschaften und Methoden der Basisklasse übernimmt ("Ist-ein-Beziehung"). Bei Bedarf kann sie sie erweitern, ergänzen oder ersetzen.

    Von einem Interface abzuleiten führt dazu, dass die abgeleitete Klasse die Verpflichtung übernimmt, das im Interface zugesicherte Verhalten zur Verfügung zu stellen (d.h. die dort definierten Methoden zu implementieren). Sie erbt keine bereits vorhandenen Eigenschaften. Das ist keine Ist-ein-Beziehung, sondern eher ein Vertrag über eine bestimmte Funktionalität.

    Mir schien es eher, als wollte Java damit versuchen, krampfhaft die fehlende Mehrfachvererbung zu kompensieren ...

    Mehrfachvererbung ist nicht ganz unproblematisch (kurze Zusammenfassung hier: https://de.wikipedia.org/wiki/Mehrfachvererbung). In der "Goldrausch-Phase" von C++ (keiner wusste wirklich Bescheid, aber alle stürzten sich drauf), als endlose und vielfach verzweigte Ableitungshierarchien als Qualitätsmerkmal galten ("da hat sich jemand richtig viel Gedanken gemacht" 🙄), sind Klassendesigns entstanden, die schon sehr bald kein Mensch mehr durchblickte. Nachdem man das untersucht und das Problem verstanden hatte, hat man in später definierte Sprachen (Java, C#) mehr Restriktionen eingebaut.

    ... da es in den Lehrbüchern als Einleitung immer heißt: "Java erlaubt keine Mehrfachvererbung, aber das ist nicht so schlimm, denn es gibt Schnittstellen [...]

    Schade, wenn Lehrbücher das so andeuten, aber Schnittstellen sind definitiv keine Krücke! Es ist vielmehr so, dass vieles, was aus Unkenntnis oder Bequemlichkeit mit Basisklassen gelöst wurde, viel besser (weil nebenwirkungsfrei) mit Schnittstellen gelöst worden wäre.