Java schön?

Dieses Thema im Forum "Programmierung" wurde erstellt von GermanUbuntu, 13. August 2013.

  1. GermanUbuntu
    Online

    GermanUbuntu

    Hallo Leute,

    Ich habe eine frage:

    Ich behersche die Grundlagen von Java aber... ich kann einfach nicht "schön" Coden

    Mein Code ist immer unübersichtlich... wie kriege ich es hin das mein Code übersichtlicher wird?

    Schreibt mir hier bitte ein paar Tipps rein
     
    #1
  2. ChunkNorris
    Online

    ChunkNorris

  3. Chrisliebaer
    Online

    Chrisliebaer

    Das ist ein langwieriger Prozess.

    1. Hör auf mit Bukkit, damit kann man keinen schönen Code schreiben. Wenn man es bereits kann, dann ist es zwar möglich, aber zum LERNEN kann ich es nicht empfehlen. Vor allem wirft Bukkit keine Exceptions. Wenn du mal mit der normalen Java API arbeitest, dann wirst du in der Dokumentation der funktionen hinweise finden: Dabei handelt es sich z.B: um Empfehlungen der Javaentwickler oder um Nebenwirkungen von bestimmten Methoden. Dabei lernst du auch, bestimmte Dinge zu berücksichtigen, an die du vielleicht gar nicht gedacht hast. In Bukkit fehlt das. Du kannst dir ja auch einfach mal ein paar Dokumentationen der Javaklassen ansehen und sie dann mit der Bukkit Dokumentation vergleichen. Du wirst feststellen, dass Bukkitcode quasi gar nicht dokumentiert ist, wohingegen du in Java fast von Textwänden erschlagen wirst (und das ist gut).

    2. Sieh dir existierenden Code an. Stelle aber sicher, dass es sich um hochwertigen Code handelt, Bukkitplugins fallen hier raus, da die meisten nicht sauber gecoded sind.

    3. Wie zh schon verlinkt hat. Auch wenn Java quasi OOP erzwingt, heißt das nicht, dass man damit keine Fehler machen kann. Man sollte trozdem die Idee hinter OOP verstanden haben. Hierfür gibt es sowohl gute Bücher, als auch gute Texte im Internet. Du kannst hier locker ein ganzes Buch lesen ohne einmal etwas zu programmieren. Es handelt sich mehr oder weniger um Theorie, wobei man natürlich das gelernte noch üben muss, damit man es richtig anwenden kann.

    4. Wieviele Probleme lassen sich auf immer die selbe Grundlage abstrahieren. Das gilt es zu erkennen und dann entsprechend zu implementieren. Man muss sich also immer Fragen, wie genau etwas aufgebaut ist und welchen verschiedenen "Dinge" man hat und wie diese Miteinander "sprechen". Es gibt dafür auch s.g. Entwurfsmuster: http://de.wikipedia.org/wiki/Entwurfsmuster Das ist eine Sammlung von bestimmten Softwarestrukturen für bestimmte Probleme. Jede Implementierung sieht aber trozdem immer ein wenig anderst aus. Es sollte als strikter Wegweiser betrachtet werden, jede Abweichung vom Pfad muss man selbst hinterfragen.
     
    #3
  4. Cabraca
    Online

    Cabraca

    Im Grunde gibt es einige wenige Dinge, die einem helfen übersichtlicher zu Arbeiten.

    1. Eine Klasse, Eine Aufgabe: Jede Klasse sollte nur eine Aufgabe haben. Es sieht scheiße aus und ist unübersichtlich wenn die Listener eines Plugins direkt unter der onCommand()-Methode stehen. Listener in ne eigene Klasse, jeder weiß wo die liegen und alle sind glücklich.
    2. Sinnvolle Namen für Klasse, Methoden und Variablen und gleiche Stil der Namen: Infos u.a. hierzu findest du HIER
    3. Klassendiagramme und Abhängigkeiten: Mach dir ein Diagramm in dem sämtliche Klassen vorkommen. Dann verbindest du alle Klassen, die direkt miteinander zu tun haben. Dabei helfen dir z.B. tools wie VioletUML
    Je weniger Abhängigkeiten eine Klasse hat, desto einfacher lässt sich irgendwas bearbeiten ohne andere sachen kaputt zu machen. Gleicht dein Diagramm eher einem Spinnennetz solltest du dein Vorgehen nochmal überdenken.
    4. Wie Chris schon sagte sind Entwurfsmuster ziemlich nützlich.
    5. Nutz packages. Wenn du viele Klassen hast die das gleiche machen pack sie ins gleiche Package. Damit bleibt alles übersichtlicher und jeder weiß wo er nach dingen suchen soll. Bei Bukkit siehst du z.B. dass Events und Entities jeweils in einem eigenen Package liegen.
     
    #4
  5. Baba43
    Offline

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Naja wie wärs, wenn du mal ein Beispielprojekt von dir postest? ;)
     
    #5
  6. GermanUbuntu
    Online

    GermanUbuntu

    #6
  7. ChunkNorris
    Online

    ChunkNorris

    Du könntest zB. aus jedem Command eine eigene Klasse machen, die CommandExecutor implementiert. Diese könntest du dann zB. in ein eigenes Paket hauen und in deiner Mainklasse kannst du zB. über Reflection alle Commands aus dem Paket holen, instanzieren und registrieren. :D

    Edit:
    Außerdem hast du eine Spawnmob-Methode, die komische Sachen macht. :p Einfacher wäre hier die API-Docs zu lesen und herauszufinden das EntityType eine statische Methode namens "fromName" hat. Mit der Kannst du ganz einfach die Entity holen. Mit diesem Beispielcode wäre dein Befehl sogar fit für neue Mobs, die evtl. hinzugefügt werden.
    Code (Text):
    1.  
    2. @Override
    3. public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    4.     if (command.getName().equalsIgnoreCase("spawnmob")) {
    5.         if (sender instanceof Player) {
    6.             if (args.length >= 1) {
    7.                 Player player = (Player) sender;
    8.                 String mob = args[0];
    9.                 EntityType entityType = EntityType.fromName(mob);
    10.                 if (entityType == null) {
    11.                     player.sendMessage("Keine Entity");
    12.                     return true;
    13.                 }
    14.                 if (LivingEntity.class.isAssignableFrom(entityType.getEntityClass())) {
    15.                     player.getWorld().spawnEntity(player.getLocation(), entityType);
    16.                 }
    17.                 else {
    18.                     player.sendMessage("nix lebend");
    19.                 }
    20.             }
    21.             else {
    22.                 sender.sendMessage("too few args");
    23.             }
    24.         }
    25.         else {
    26.             sender.sendMessage("kein player :(");
    27.  
    28.  
    29.         }
    30.         return true;
    31.     }
    32.     return false;
    33. }
    34.  
     
    #7