none
C#-Code verbessern, wie gehts? RRS feed

  • Frage

  • Hallo zusammen,

    ich bin nicht besonders erfahren in C# habe aber in einem anderen Forum einen Code für jemanden gepostet der sah folgendermaßen aus:

    Int64 x = Convert.ToInt64(Console.ReadLine());
    int y = Convert.ToInt16(Console.ReadLine());
    
    for(int i = 2; i <= y; i++)
    {
     x = x * i;
     Console.Write(x + " ");
    }
    
    for (int i=y; i > 1; i--)
    {
        x = x / i;
        Console.Write(x + " ");
    }
    Console.ReadLine();

    Was es machen soll ist, man gibt zwei zahlen ein x und y und dann wird ausgeben: 2x 6x 24x usw, bis zu einem bestimmten punkt und dann eben wieder rückwärts.

    Nun kommentierte mir jemand den Code und sagte er sei "totaler crap code"und "total langsam". Wie könnte ich denn diesen Code verbessern?

    Sonntag, 6. Oktober 2013 12:40

Antworten

  • Hallo,
    erstmal vorne weg, Code kann man sogut wie immer optimieren. Jeder Quellcode geht kürzer zu fassen, ob das aber immer so sinnvoll ist - darüber lässt sich streiten.

    1. Rein Formal würde ich long statt Int64 verwenden.
    2. Wenn der Benutzer falsche Werte eingibt, dann stürtzt das Programm ab. Das kannst du so verhindern:
      long x;
      string input = Console.ReadLine();
      if(!long.TryParse(input, out x))
      {
          /Fehler, falsche eingabe
      }
      //Alles OK
      die TryParse-Methode gibt False zurück, wenn input keine gültige Zahl ist. Sollte die Umwandlung klappen, dann enthält x den Wert.
      So etwas baue ich aber nie mit in solche kleinen Beispielcodes ein, da das jeder selbst machen kann.
    3. Wenn ich deinem Code die Werte 2 und 3 übergebe, dann erhalte ich 4 12 4 2. Soll am Anfang wirklic keine 2 Stehen? Wenn doch, dann musst du die erste Schleife abändern in
      for(int i = 1; ...
      Wenn die 2 Am Ende Fehlen soll, dann muss die 2. Schleife abgeändert werden in
      ...; i > 2;...
    4. Nunja, langsam ist zwar relativ, aber man könnte es optimieren. (Würde ich aber für solche Minibeispiele auch nicht tun)
      String + String ist immer relativ Langsam. Ständige Konsolenausgaben schlucken vielleicht auch noch etwas. Ein StringBuilder oder Methoden wie String.Format oder String.Concat können zwar einiges optimieren, das ist hier aber alles etwas überdimensioniert.
      Die Console.WriteLine-Methode hat eine ähnliche Funktionalität wie String.Format. Von daher lässt es sich recht leicht einbauen:
      Console.Write("{0} ", x);
      Der Sinn des ganzen - Fraglich.
    5. Ich persönlich mag ReadLine nicht, nur um darauf zu warten, das der Benutzer das Ergebnis gesehen hat. folgendes mag ich mehr:
      Console.WriteLine("\nDrücken Sie eine beliebige Taste...");
      Console.ReadKey();
      
      Das ist aber auch Ansichtssache.
    6. Nun kann es sein, das der jenige lieber WriteLine anstelle von Write genommen hätte. Kommt auf die Anforderung an.

    Wie du siehst fällt mir kaum etwas zum verbessern auf, was auch Sinn macht. Würde ich jeden Code den ich poste so perfekt ausbauen, dann würde ich 1 Antwort am Tag schaffen. Mehr wahrscheinlich nicht. Vieles ist nunmal schnell von der Hand weg getippt und fertig. Darum sollte der Fragesteller sollte auch nie erwarten, das er 100% perfekte Lösungen bekommt.

    Frag den jeniegn doch einfach mal, warum er deinen Code so schlecht findet und was er besser machen würde.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 6. Oktober 2013 13:50
    Moderator

Alle Antworten

  • Hallo,
    erstmal vorne weg, Code kann man sogut wie immer optimieren. Jeder Quellcode geht kürzer zu fassen, ob das aber immer so sinnvoll ist - darüber lässt sich streiten.

    1. Rein Formal würde ich long statt Int64 verwenden.
    2. Wenn der Benutzer falsche Werte eingibt, dann stürtzt das Programm ab. Das kannst du so verhindern:
      long x;
      string input = Console.ReadLine();
      if(!long.TryParse(input, out x))
      {
          /Fehler, falsche eingabe
      }
      //Alles OK
      die TryParse-Methode gibt False zurück, wenn input keine gültige Zahl ist. Sollte die Umwandlung klappen, dann enthält x den Wert.
      So etwas baue ich aber nie mit in solche kleinen Beispielcodes ein, da das jeder selbst machen kann.
    3. Wenn ich deinem Code die Werte 2 und 3 übergebe, dann erhalte ich 4 12 4 2. Soll am Anfang wirklic keine 2 Stehen? Wenn doch, dann musst du die erste Schleife abändern in
      for(int i = 1; ...
      Wenn die 2 Am Ende Fehlen soll, dann muss die 2. Schleife abgeändert werden in
      ...; i > 2;...
    4. Nunja, langsam ist zwar relativ, aber man könnte es optimieren. (Würde ich aber für solche Minibeispiele auch nicht tun)
      String + String ist immer relativ Langsam. Ständige Konsolenausgaben schlucken vielleicht auch noch etwas. Ein StringBuilder oder Methoden wie String.Format oder String.Concat können zwar einiges optimieren, das ist hier aber alles etwas überdimensioniert.
      Die Console.WriteLine-Methode hat eine ähnliche Funktionalität wie String.Format. Von daher lässt es sich recht leicht einbauen:
      Console.Write("{0} ", x);
      Der Sinn des ganzen - Fraglich.
    5. Ich persönlich mag ReadLine nicht, nur um darauf zu warten, das der Benutzer das Ergebnis gesehen hat. folgendes mag ich mehr:
      Console.WriteLine("\nDrücken Sie eine beliebige Taste...");
      Console.ReadKey();
      
      Das ist aber auch Ansichtssache.
    6. Nun kann es sein, das der jenige lieber WriteLine anstelle von Write genommen hätte. Kommt auf die Anforderung an.

    Wie du siehst fällt mir kaum etwas zum verbessern auf, was auch Sinn macht. Würde ich jeden Code den ich poste so perfekt ausbauen, dann würde ich 1 Antwort am Tag schaffen. Mehr wahrscheinlich nicht. Vieles ist nunmal schnell von der Hand weg getippt und fertig. Darum sollte der Fragesteller sollte auch nie erwarten, das er 100% perfekte Lösungen bekommt.

    Frag den jeniegn doch einfach mal, warum er deinen Code so schlecht findet und was er besser machen würde.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 6. Oktober 2013 13:50
    Moderator
  • Vielen Dank

    Sonntag, 6. Oktober 2013 14:11