Was ist für euch guter Programmcode?



  • Meist gibt man effective lines of code an. Da werden Kommentare, Leerzeilen usw. nicht mitgezählt.



  • BloodLord schrieb:

    Mir fällt gerade so nebenbei ein: Gibt es eigentlich einen Standard für das Zählen von Zeilennummern eines Programmes?

    ja. man zählt die nur zeilenumbrüche und tut dann so, als gäbe es pro zeilenumbruch eine zeile.

    Oft gibt man ja an "Core: 100.000 Lines" oder so ähnliches.

    in meinen kreisen sagt sowas keiner. und wenn, würden die anderen ihn mitleidig belächeln.
    wenn einer grade freundlich drauf ist, sagt er vielleicht noch "geht das nicht auch in 5000 Lines?".

    Die könneten jetzt aber so:
    oder so aussehn:

    die lange version macht man, wenn man nach zeilen bezahlt wird. hat nur den effekt, daß mit der zeit alle mehr zeilen machen müssen (weniger kohle pro zeile kriegen) und ordenlicher code nicht mehr gebaut werden kann.



  • volkard schrieb:

    http schrieb:

    lang. schrieb:

    ist sowas guter code: http://rafb.net/paste/results/LLUB3v51.html ?

    leider sehen alle mir bekannten open source server so aus. da braucht man sich über sicherheitslöcher nicht zu wundern.

    lol. der code ist cool.

    Was meinst du mit cool?



  • volkard schrieb:

    http schrieb:

    lang. schrieb:

    ist sowas guter code: http://rafb.net/paste/results/LLUB3v51.html ?

    leider sehen alle mir bekannten open source server so aus. da braucht man sich über sicherheitslöcher nicht zu wundern.

    lol. der code ist cool.

    hab mal ein wenig den von lightppd gelesen, um ein bug zu fixen. war eigentlich ganz lesbar un den gegenden, wo ich stöbern mußte. (aber noch weit von "hübsch" entfernt.)

    lol. die http request parse funktion ist dort ja noch länger. 739 zeilen. das kann doch echt nicht wahr sein. 🙄

    http://www.rafb.net/paste/results/96dVAS88.html



  • http schrieb:

    lol. die http request parse funktion ist dort ja noch länger. 739 zeilen. das kann doch echt nicht wahr sein. 🙄

    ok. ich nehme den nicht mehr.



  • volkard schrieb:

    http schrieb:

    lol. die http request parse funktion ist dort ja noch länger. 739 zeilen. das kann doch echt nicht wahr sein. 🙄

    ok. ich nehme den nicht mehr.

    thx 🤡 👍

    ich freue mich schon auf deinen. 🙂



  • BloodLord schrieb:

    Un sowieso man schreibt doch nicht plötzlich einfach so was in nen monate alten Flamethread rein...

    Ich fand die Dinge, die in diesem Thread gesagt wurden teilweise sehr interessant. Ich sehe den somit auch nicht als "Flamethread" an.

    BTW: Da der Thread jetzt schon reanimiert wurde, kann ich ja wiedermal'n bischen Code posten, gegen den man dann flamen kann. 😃

    Das ist Code, bei dem ich mir eigentlich keine besonders große Mühe gemacht habe. Ich halte es also nicht für besonders guten Code. Es fehlen auch Kommentare usw.. Ich bin mal gespannt, was da für Verbesserungsvorschläge kommen, falls dazu noch einer Lust hat.

    Der Code ist letztendlich eine Realisierung eines n-dimensionalen Bresenham-Linienalgorithmus inklusive einer Clipping-Funktion, die dem Liang-Barsky Algorithmus nahe kommt. Es wird allerdings keine Linie gemalt, sondern "analysiert".

    /*
     * LineCaster.java
     *
     * Created on 8. März 2005, 01:25
     */
    
    package jaradap.model.algorithm;
    
    import jaradap.model.algorithm.multiPointProcessor.RaycastProcessor;
    import jaradap.model.data.BasicRaster;
    import jaradap.model.data.StandardRaster;
    import math.linearAlgebra.Vector;
    
    /**
     *
     * @author Gregor
     */
    public class LineCaster
    {
       private final RaycastProcessor pointProcessor;
       private final StandardRaster raster;
       private final int dimension;
    
       /** Creates a new instance of RayCaster */
       public LineCaster(final RaycastProcessor pointProcessor, final StandardRaster raster)
       {
          this.pointProcessor = pointProcessor;
          this.raster = raster;
          dimension = raster.getDimensions();
       }
    
       public float castLine(final Vector startPoint, final Vector endPoint)
       {
          if (startPoint.getDimension() != dimension) 
             throw new IllegalArgumentException("startPoint has wrong dimension.");
          if (endPoint.getDimension() != dimension) 
             throw new IllegalArgumentException("endPoint has wrong dimension.");
          final int[] realStartPoint = new int[dimension];
          final int[] realEndPoint = new int[dimension];
          if(!setFirstPointInRaster(realStartPoint,startPoint,endPoint)) return 0.0f;
          if(!setFirstPointInRaster(realEndPoint,endPoint,startPoint)) return 0.0f;
          int maxDiffIndex = 0;
          final int[] intDifferences = new int[dimension];
          final int[] relativePosition = new int[dimension];
          final int[] position = new int[dimension];
          final int[] increments = new int[dimension];
          for(int i = 0 ; i < dimension ; ++i)
          {
             intDifferences[i] = realEndPoint[i] - realStartPoint[i];
             increments[i] = (intDifferences[i] > 0) ? 1 : -1;
             intDifferences[i] = Math.abs(intDifferences[i]);
             if (intDifferences[i] > intDifferences[maxDiffIndex]) maxDiffIndex = i;
             relativePosition[i] = intDifferences[i] >> 1;
             position[i] = realStartPoint[i];
          }
          final int maxDifference = intDifferences[maxDiffIndex];
          final int maxIncrement = increments[maxDiffIndex];
          pointProcessor.reset();
          for(;position[maxDiffIndex] != realEndPoint[maxDiffIndex] ; position[maxDiffIndex] += maxIncrement)
          {
             if (pointProcessor.addPoint(raster,position)) break;
             for(int i = 0 ; i < dimension ; ++i)
             {
                if (i == maxDiffIndex) continue;
                relativePosition[i] += intDifferences[i];
                if (relativePosition[i] < maxDifference) continue;
                position[i] += increments[i];
                relativePosition[i] -= maxDifference;
             }
          }
          pointProcessor.addPoint(raster,position);
          return pointProcessor.getValue();
       }
    
       private final boolean setFirstPointInRaster(final int[] target, final Vector firstLinePoint, 
                                                   final Vector lastLinePoint)
       {
          final double[] differences = new double[dimension];
          double fraction = 0.0;
          for (int i = 0 ; i < dimension ; ++i)
          {
             differences[i] = (float)(lastLinePoint.getComponent(i) - firstLinePoint.getComponent(i));
          }
          for (int i = 0 ; i < dimension ; ++i)
          {
             double newFraction = 0.0;
             final double component = firstLinePoint.getComponent(i);
             final double difference = differences[i];
             final double maxValue = raster.getSize(i) - 1;
             if (component < 0.0)
             {
                if (difference <= 0.0) return false;
                newFraction = component / difference;
             }
             else if (component > maxValue)
             {
                if (difference >= 0.0) return false;
                newFraction = (component - maxValue) / difference;
             }
             if (newFraction < fraction) fraction = newFraction;
          }
          for (int i = 0 ; i < dimension ; ++i)
          {
             target[i] = Math.round((float)(firstLinePoint.getComponent(i) - fraction * differences[i]));
             if (target[i] < 0) return false;
             if (target[i] > raster.getSize(i) - 1) return false;
          }
          return true;
       }
    }
    


  • IMHO: Viel zu lange Funktionen mit zu vielen lokalen Variablen. Da sollte man versuchen, besser aufzuteilen. Zwing mich jetzt aber nicht, darüber nachzudenken, wo. 🤡



  • Gregor@Home schrieb:

    Das ist Code, bei dem ich mir eigentlich keine besonders große Mühe gemacht habe. Ich halte es also nicht für besonders guten Code. Es fehlen auch Kommentare usw.. Ich bin mal gespannt, was da für Verbesserungsvorschläge kommen, falls dazu noch einer Lust hat.

    Naja, um es nochmal anders auszudrücken: Ich habe da einen Algorithmus implementiert, der IMHO nicht so ganz leicht zu implementieren ist. Es war schwer für mich, den Code überhaupt zu produzieren, so dass ich nicht so auf "guten Stil" geachtet habe. Das ist sicherlich eine Frage der Erfahrung, aber mich interessiert, ob es euch bei schwierigen Algorithmen ähnlich geht:

    Wird bei euch der Stil bei schwierigen Programmieraufgaben schlechter oder produziert ihr unabhängig von der Komplexität der Aufgabe immer gleichbleibend guten Code?



  • Gregor@Home schrieb:

    Wird bei euch der Stil bei schwierigen Programmieraufgaben schlechter oder produziert ihr unabhängig von der Komplexität der Aufgabe immer gleichbleibend guten Code?

    der wird zunächst signifikant schlechter. auch mal schlecht, daß ich den überblick verliere und löschen muss. hab gerade wieder tagelang so ne phase gehabt. jetzt geht's langsam wieder.



  • volkard schrieb:

    der wird zunächst signifikant schlechter. auch mal schlecht, daß ich den überblick verliere und löschen muss. hab gerade wieder tagelang so ne phase gehabt. jetzt geht's langsam wieder.

    Führst du dann Refactorings durch, bis die Qualität des Codes der deines restlichen Codes entspricht?



  • Optimizer schrieb:

    IMHO: Viel zu lange Funktionen mit zu vielen lokalen Variablen. Da sollte man versuchen, besser aufzuteilen. Zwing mich jetzt aber nicht, darüber nachzudenken, wo. 🤡

    😃

    Ich habe mal angefangen, da ein bischen was aufzuteilen, aber irgendwie habe ich das Gefühl, dass das so nicht wirklich etwas wird. Ich habe plötzlich Methoden, die unglaublich viele Parameter brauchen und die Länge der Klasse hat sich auch mal eben um 30 Zeilen erhöht.

    da ist der Code:

    /*
     * LineCaster.java
     *
     * Created on 8. März 2005, 01:25
     */
    
    package jaradap.model.algorithm;
    
    import jaradap.model.algorithm.multiPointProcessor.RaycastProcessor;
    import jaradap.model.data.BasicRaster;
    import jaradap.model.data.StandardRaster;
    import math.linearAlgebra.Vector;
    
    /**
     *
     * @author Gregor
     */
    public class LineCaster
    {
       private final RaycastProcessor pointProcessor;
       private final StandardRaster raster;
       private final int dimension;
    
       /** Creates a new instance of RayCaster */
       public LineCaster(final RaycastProcessor pointProcessor, final StandardRaster raster)
       {
          this.pointProcessor = pointProcessor;
          this.raster = raster;
          dimension = raster.getDimensions();
       }
    
       public float castLine(final Vector startPoint, final Vector endPoint)
       {
          checkCastLineParameters(startPoint, endPoint);
          final int[][] line = clipLine(startPoint, endPoint);
          if (line == null) return 0.0f;
          final int[] intDifferences = new int[dimension];
          final int[] relativePosition = new int[dimension];
          final int[] position = new int[dimension];
          final int[] increments = new int[dimension];
          final int maxDiffIndex = initHelperVariables(intDifferences, relativePosition, position, 
                                                       increments, line);
          final int maxDifference = intDifferences[maxDiffIndex];
          final int maxIncrement = increments[maxDiffIndex];
          pointProcessor.reset();
          processLine(pointProcessor, intDifferences, relativePosition, position, increments, 
                      maxDiffIndex, maxDifference, maxIncrement, line);
          return pointProcessor.getValue();
       }
    
       private final void checkCastLineParameters(final Vector startPoint, final Vector endPoint)
       {
          if (startPoint.getDimension() != dimension) 
             throw new IllegalArgumentException("startPoint has wrong dimension.");
          if (endPoint.getDimension() != dimension) 
             throw new IllegalArgumentException("endPoint has wrong dimension.");
       }
    
       private final int[][] clipLine(final Vector startPoint, final Vector endPoint)
       {
          final int[][] line = new int[2][dimension];
          if(!setFirstPointInRaster(line[0],startPoint,endPoint)) return null;
          if(!setFirstPointInRaster(line[1],endPoint,startPoint)) return null;
          return line;
       }
    
       private final int initHelperVariables(final int[] intDifferences, final int[] relativePosition,
                                             final int[] position, final int[] increments,
                                             final int[][] line)
       {
          int maxDiffIndex = 0;
          for(int i = 0 ; i < dimension ; ++i)
          {
             intDifferences[i] = line[1][i] - line[0][i];
             increments[i] = (intDifferences[i] > 0) ? 1 : -1;
             intDifferences[i] = Math.abs(intDifferences[i]);
             if (intDifferences[i] > intDifferences[maxDiffIndex]) maxDiffIndex = i;
             relativePosition[i] = intDifferences[i] >> 1;
             position[i] = line[0][i];
          }
          return maxDiffIndex;
       }
    
       private final void processLine(final RaycastProcessor pointProcessor,final int[] intDifferences, 
                                      final int[] relativePosition, final int[] position, 
                                      final int[] increments, final int maxDiffIndex, 
                                      final int maxDifference, final int maxIncrement,
                                      final int[][] line)
       {
          for(;position[maxDiffIndex] != line[1][maxDiffIndex] ; position[maxDiffIndex] += maxIncrement)
          {
             if (pointProcessor.addPoint(raster,position)) break;
             for(int i = 0 ; i < dimension ; ++i)
             {
                if (i == maxDiffIndex) continue;
                relativePosition[i] += intDifferences[i];
                if (relativePosition[i] < maxDifference) continue;
                position[i] += increments[i];
                relativePosition[i] -= maxDifference;
             }
          }
          pointProcessor.addPoint(raster,position);
       }
    
       private final boolean setFirstPointInRaster(final int[] target, final Vector firstLinePoint, 
                                                   final Vector lastLinePoint)
       {
          final double[] differences = new double[dimension];
          double fraction = 0.0;
          for (int i = 0 ; i < dimension ; ++i)
          {
             differences[i] = (float)(lastLinePoint.getComponent(i) - firstLinePoint.getComponent(i));
          }
          for (int i = 0 ; i < dimension ; ++i)
          {
             double newFraction = 0.0;
             final double component = firstLinePoint.getComponent(i);
             final double difference = differences[i];
             final double maxValue = raster.getSize(i) - 1;
             if (component < 0.0)
             {
                if (difference <= 0.0) return false;
                newFraction = component / difference;
             }
             else if (component > maxValue)
             {
                if (difference >= 0.0) return false;
                newFraction = (component - maxValue) / difference;
             }
             if (newFraction < fraction) fraction = newFraction;
          }
          for (int i = 0 ; i < dimension ; ++i)
          {
             target[i] = Math.round((float)(firstLinePoint.getComponent(i) - fraction * differences[i]));
             if (target[i] < 0) return false;
             if (target[i] > raster.getSize(i) - 1) return false;
          }
          return true;
       }
    }
    

    Findest du, der Code hat sich verbessert?

    Man könnte das jetzt natürlich noch weiter treiben und zum Beispiel eine neue Klasse einführen, in der die ganzen Hilfsvariablen Member sind. So könnte man sicherlich die vielen Parameter bei den Methodenaufrufen verhindern. Aber letztendlich landet man dann vermutlich irgendwann bei einem Monster mit 1000 Zeilen, wo es auch 100 getan hätten. Zudem dürfte der Code durch solche "Verbesserungen" immer träger/langsamer werden. Ich glaube nicht, dass dieser Weg der Beste ist. Fragt sich nur, wie man den Code ansonsten verbessern sollte, denn der Ausgangscode ist ja immer noch nicht schöner geworden.

    Oder habe ich mich bei der Aufteilung der Methoden einfach nur sehr blöd angestellt? Geht das vielleicht deutlich besser?

    (Ätsch, jetzt mußt du doch denken. 😉 😃 )



  • Irgendwie fehlt dem armen Side ein Kommentar wo was steht bzgl. was LineCaster sein soll 😞 Überhaupt sehen alle Kommentare ziemmlich auto-eclipse-created aus.

    MfG SideWinder



  • SideWinder schrieb:

    Irgendwie fehlt dem armen Side ein Kommentar wo was steht bzgl. was LineCaster sein soll 😞 Überhaupt sehen alle Kommentare ziemmlich auto-eclipse-created aus.

    Ja, das ist sicherlich ein treffender Punkt. Vor Kommentaren habe ich mich in dieser Klasse bisher etwas gedrückt, dabei würden die sicherlich helfen. Vielleicht kann man damit auch innerhalb von Methoden verschiedene Bereiche markieren und kann sich so eine Aufteilung der Methoden sparen.

    Was die Klasse prinzipiell macht, habe ich etwas weiter oben geschrieben:

    Der Code ist letztendlich eine Realisierung eines n-dimensionalen Bresenham-Linienalgorithmus inklusive einer Clipping-Funktion, die dem Liang-Barsky Algorithmus nahe kommt. Es wird allerdings keine Linie gemalt, sondern "analysiert".



  • Ich habe mal mein jämmerliches Englisch aktiviert, um die Klasse halbwegs zu kommentieren. Was sagt ihr dazu:

    /*
     * LineCaster.java
     *
     * Created on 8. März 2005, 01:25
     */
    
    package jaradap.model.algorithm;
    
    import jaradap.model.algorithm.multiPointProcessor.RaycastProcessor;
    import jaradap.model.data.BasicRaster;
    import jaradap.model.data.StandardRaster;
    import math.linearAlgebra.Vector;
    
    /**
     * This class represents Objects that can analyze lines in a given raster. The analysis
     * projects a line into a single float which is given by a RaycastProcessor, the raster and the line. 
     *
     * @author Gregor
     */
    public class LineCaster
    {
       private final RaycastProcessor pointProcessor;
       private final StandardRaster raster;
       private final int dimension;
    
       /** 
        * Creates a new LineCaster with the given parameters.
        *
        * @param pointProcessor This is the RaycastProcessor that will be used to analyze the lines 
        *                       in the method castLine.
        * @param raster This is the raster which represents the environment in that this LineCaster
        *               may analyze lines.
        */
       public LineCaster(final RaycastProcessor pointProcessor, final StandardRaster raster)
       {
          this.pointProcessor = pointProcessor;
          this.raster = raster;
          dimension = raster.getDimensions();
       }
    
       /**
        * This method analyzes the line which is specified by the parameters. The pointProcessor
        * of this LineCaster is used to compute the resulting value, while the raster of this LineCaster
        * is the environment of the analysis.
        *
        * @param startPoint This is the start point of the line.
        * @param endPoint This is the end point of the line.
        * @return The value of the pointProcessor after processing all points of the line inside the raster
        *         will be returned. If the line has no points inside the raster 0 will be returned.
        */
       public float castLine(final Vector startPoint, final Vector endPoint)
       {
          // Check parameters.
          if (startPoint.getDimension() != dimension)
             throw new IllegalArgumentException("startPoint has wrong dimension.");
          if (endPoint.getDimension() != dimension)
             throw new IllegalArgumentException("endPoint has wrong dimension.");
    
          // Clip line: 
          // Resulting line is given by rasterStartPoint and rasterEndPoint.
          final int[] rasterStartPoint = new int[dimension];
          final int[] rasterEndPoint = new int[dimension];
          if(!setFirstPointInRaster(rasterStartPoint,startPoint,endPoint)) return 0.0f;
          if(!setFirstPointInRaster(rasterEndPoint,endPoint,startPoint)) return 0.0f;
    
          // Init helper variables.
          int maxDiffIndex = 0;
          final int[] intDifferences = new int[dimension];
          final int[] relativePosition = new int[dimension];
          final int[] position = new int[dimension];
          final int[] increments = new int[dimension];
          for(int i = 0 ; i < dimension ; ++i)
          {
             intDifferences[i] = rasterEndPoint[i] - rasterStartPoint[i];
             increments[i] = (intDifferences[i] > 0) ? 1 : -1;
             intDifferences[i] = Math.abs(intDifferences[i]);
             if (intDifferences[i] > intDifferences[maxDiffIndex]) maxDiffIndex = i;
             relativePosition[i] = intDifferences[i] >> 1;
             position[i] = rasterStartPoint[i];
          }
          final int maxDifference = intDifferences[maxDiffIndex];
          final int maxIncrement = increments[maxDiffIndex];
    
          // Process line: 
          // 1. Reset pointProcessor.
          // 2. Process Bresenham-Line-Algorithm
          // 3. Return value of pointProcessor
          pointProcessor.reset();
          for(;position[maxDiffIndex] != rasterEndPoint[maxDiffIndex] ; position[maxDiffIndex] += maxIncrement)
          {
             if (pointProcessor.addPoint(raster,position)) break;
             for(int i = 0 ; i < dimension ; ++i)
             {
                if (i == maxDiffIndex) continue;
                relativePosition[i] += intDifferences[i];
                if (relativePosition[i] < maxDifference) continue;
                position[i] += increments[i];
                relativePosition[i] -= maxDifference;
             }
          }
          pointProcessor.addPoint(raster,position);
          return pointProcessor.getValue();
       }
    
       private final boolean setFirstPointInRaster(final int[] target, final Vector firstLinePoint,
                                                   final Vector lastLinePoint)
       {
          // Compute the differences of the line's start- and endpoint.
          final double[] differences = new double[dimension];
          double fraction = 0.0;
          for (int i = 0 ; i < dimension ; ++i)
          {
             differences[i] = (float)(lastLinePoint.getComponent(i) - firstLinePoint.getComponent(i));
          }
    
          // Compute the fraction that represents the point where the line enters the raster.
          for (int i = 0 ; i < dimension ; ++i)
          {
             double newFraction = 0.0;
             final double component = firstLinePoint.getComponent(i);
             final double difference = differences[i];
             final double maxValue = raster.getSize(i) - 1;
             if (component < 0.0)
             {
                if (difference <= 0.0) return false;
                newFraction = component / difference;
             }
             else if (component > maxValue)
             {
                if (difference >= 0.0) return false;
                newFraction = (component - maxValue) / difference;
             }
             if (newFraction < fraction) fraction = newFraction;
          }
    
          // Use the fraction to compute the first point of the line that lies within the raster
          // and check if the point really lies within the raster.
          // The point may not lie within the raster if the line has no point in the raster.
          for (int i = 0 ; i < dimension ; ++i)
          {
             target[i] = Math.round((float)(firstLinePoint.getComponent(i) - fraction * differences[i]));
             if (target[i] < 0) return false;
             if (target[i] > raster.getSize(i) - 1) return false;
          }
          return true;
       }
    }
    


  • Gregor@Home schrieb:

    volkard schrieb:

    der wird zunächst signifikant schlechter. auch mal schlecht, daß ich den überblick verliere und löschen muss. hab gerade wieder tagelang so ne phase gehabt. jetzt geht's langsam wieder.

    Führst du dann Refactorings durch, bis die Qualität des Codes der deines restlichen Codes entspricht?

    eigentlich nicht. oder nicht absichtlich. aber wenn ich mich im code nicht mehr zurechtfinde, wenn ich einfach nix neues mehr dazubauen kann, dann muß ich löschen.
    und ansonsten sind die klassen halt möglichst mit nur einem zweck betraut, und ich kann im prinzip ne häßliche implementierung durch ne hübsche austauschen und ne schnittstellenänderung dauert auch nicht soo lange, der compiler sag ja, wo die aufrufer probleme kriegen.
    zur zeit lösche ich auch mal frühzeitig, wenn ich sehe, daß es häßlich, aber noch nicht grausam, werden wird. aber ich kriege keine kohle dafür.
    ich hab dieses jahr dreimal private erblichkeit gebaut. jedemals sah ich das und dachte mir "irgendwie ist das nicht hübsch", aber egal, es muß ja auch mal weitergehen.
    in allen drei fällen ist der code umgekippt und sehr schlimm geworden. im dritten fall sogar so schlimm, daß ich auch mit angestrengtem nachdenken nicht gerausgefunden habe, warum er funktionierte (er funktionierte!).
    das wird meinen stil beeinflussen und ich werde in zukunft auch für kohle frühzeitiger löschen. die zeit, die man wegen häßlichem code verliert, ist einfach zu groß irgendwie.



  • // Compute the differences of the line's start- and endpoint. 
          final double[] differences = new double[dimension]; 
          for (int i = 0 ; i < dimension ; ++i) 
          { 
             differences[i] = (float)(lastLinePoint.getComponent(i) - firstLinePoint.getComponent(i)); 
          }
    

    was ist das?

    zweck: Compute the differences of the line's start- and endpoint.
    name: computeDiffrerences
    argumente: zwei arrays a und b
    rückgabe: ein array c mit c[i]=a[i]-b[i] für jedes i

    wenn du c++ machen würdest, müßteste du den ganzen kram in so kleine einheiten zerhacken. und dann wieder die kommetare sparen, also
    aus

    // Compute the differences of the line's start- and endpoint. 
          final double[] differences = new double[dimension]; 
          for (int i = 0 ; i < dimension ; ++i) 
          { 
             differences[i] = (float)(lastLinePoint.getComponent(i) - firstLinePoint.getComponent(i)); 
          }
    

    wird

    // Compute the differences of the line's start- and endpoint. 
    final double[] differences=computeDifferences(lasLinePoint,firstLinePoint);
    

    das macht den code zwar nicht sofort kürzer, aber ungemein viel übersichtlicher.

    dann würde man es vielleicht löschen und sich sagen, daß man ja eigentlich mit mehrdomensionalen vektoren rechnet, dann sollte man für so einen wesentlichen begriff auch einen namen haben und ne klasse bauen. wäre für java vielleicht erst recht gut, da kannste computeDifferences ja schlecht in den global namespace stecken. und in deiner klasse hat's eigentlich kaum was zu suchen.



  • Gregor@Home schrieb:

    Optimizer schrieb:

    IMHO: Viel zu lange Funktionen mit zu vielen lokalen Variablen. Da sollte man versuchen, besser aufzuteilen. Zwing mich jetzt aber nicht, darüber nachzudenken, wo. 🤡

    😃

    Ich habe mal angefangen, da ein bischen was aufzuteilen, aber irgendwie habe ich das Gefühl, dass das so nicht wirklich etwas wird. Ich habe plötzlich Methoden, die unglaublich viele Parameter brauchen und die Länge der Klasse hat sich auch mal eben um 30 Zeilen erhöht.

    Entscheidend ist, wieviele zu wartende Zeilen du hast. Du musst eine Zeile mit einer einzigen geschweiften Klammer nicht warten und darfst sie deshalb nicht dazuzählen. Ich weiß nicht, wer das eingeführt hat, aber die Anzahl LOC sind kein Maß für gar nichts. Ich finde es jetzt schöner anzusehen, das kann man aber bestimmt noch weiter zerhacken. castLine() ist noch viel zu lange, volkard hat auch ein schönes Beispiel gebracht. Ich mache, wenn ich die Muße habe, lauter maximal 10-Zeiler, das ist enorm übersichtlich, weil der halbe Code nur noch aus Funktionsaufrufen besteht und damit fast wie ein englischer Text gelesen werden kann.
    Dass das Programm deswegen langsamer wird, glaube ich nicht, so schrottig sind die JIT-Compiler heute eigentlich nicht mehr.

    Eine Funktion, die so anfängt:

    // Clip line:
          // Resulting line is given by rasterStartPoint and rasterEndPoint.
          final int[] rasterStartPoint = new int[dimension];
          final int[] rasterEndPoint = new int[dimension];
          if(!setFirstPointInRaster(rasterStartPoint,startPoint,endPoint)) return 0.0f;
          if(!setFirstPointInRaster(rasterEndPoint,endPoint,startPoint)) return 0.0f;
    
          // Init helper variables.
          int maxDiffIndex = 0;
          final int[] intDifferences = new int[dimension];
          final int[] relativePosition = new int[dimension];
          final int[] position = new int[dimension];
          final int[] increments = new int[dimension];
    

    Tut mir weh, wenn ich keinen Plan hab, was sie macht und ich sie warten muss. Wenn ich sie nur benutzen würde, wäre es mir egal.

    Außerdem iterierst du verdammt oft über alle Dimensionen, diese Dinger kann man alle auslagern in ein forAllDimensions(FunctionObject). Kann sein, dass du bei sowas viele Parameter bräuchtest. Ich kenne leider die näheren Umstände nicht so genau, aber evtl. kannst du ein paar Daten sinnvoll zu einer nested class zusammenfassen, die auch gleich ihre Methoden zum Bearbeiten ihrer Daten mitbringt.

    EDIT: Offtopic: @volkard: Bei deinem Kurs ist diese Seite kaputt.



  • die zeit, die man wegen häßlichem code verliert, ist einfach zu groß irgendwie.

    👍 außerdem macht code schreiben mehr Spaß als ihn zu debuggen. Das hat vor längerer Zeit sogar mein Chef kapiert: Als das Implementieren von neuer Funktionalität nach dem Redesign plötlich 5 mal so schnell ging wie vorher hat er eingesehen, das sich die Kosten für 3 Wochen Redesign nach kürzester Zeit amortisieren.
    Leider wird in der Praxis IMO zu spät damit angefangen, weil sich Redesign immer nach viel Arbeit ohne für den User sichtbaren Nutzen anhört....



  • Optimizer schrieb:

    Dass das Programm deswegen langsamer wird, glaube ich nicht, so schrottig sind die JIT-Compiler heute eigentlich nicht mehr.

    Dann muss ich dich jetzt vermutlich mal in die Realität zurückholen. 😃 Ich habe natürlich gemessen und alleine die simple Aufspaltung der Methoden, die ich da oben gemaht habe, hat das Programm an der entsprechenden Stelle 20-30% langsamer gemacht. Der JIT-Compiler beherrscht in der Theorie zwar lauter tolle Sachen, das heißt aber noch lange nicht, dass davon auch etwas in der Praxis ankommt.


Anmelden zum Antworten