Codemetric Berechnen

  • C#
  • .NET (FX) 4.0

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    Codemetric Berechnen

    Hallo nutzt jemand von euch die funktion Codemetrik berechnen und was hat das mit dem Wartbarkeitsindex auf sich? Beachten oder kann man den ruhig ignorieren?
    Frage nur da bei InitializeComponent immer ein wert zwischen 10-50 pkt. steht und der wird ja automatisch von visual Studio erstellt :-). :D ;( 8|
    Ja, Designer Dateien sind immer recht unübersichtlich, und sowieso ellenlang. Das will und muss aber auch Keiner anfassen im Normalfall, also kann man die Designer-Dateien getrost ignorieren.

    Bei allem was aus deiner Feder stammt, ist es jedoch schon ein recht interessanter Wert. Er gibt dir Feedback darüber wie "gut" oder "schlecht" du programmierst.
    Wenige ellenlange spaghetticode Klassen, mit ein oder zwei Funktionen => niedrige Wetung
    Mehrere übersichtliche Klassen, mit "kurzen" Funktionen => hohe Wertung.

    Natürlich liegt Wartbarkeit, und Übersichtlichkeit immer im Auge des Betrachters, und hin und wieder lässt es sich einfach nicht umgehen eine über 2- 5K Zeilen große Klasse zu haben. Sieh es einfach als groben Richtwert. Es ist erstrebenswert eine hohe Wertung zu haben, jedoch sollte man sich keinesfalls dafür verkünsteln. Lieber eine hässliche Funktion, als einen schönen Bug ;)

    Rattenfänger schrieb:

    Vielen dank für die antwort, also ist es wie bei MS schon beschrieben alles über 20 ist akzeptabel bis gut. sehe ich das richtig?

    So steht es auf msdn.microsoft.com/de-de/library/bb385914.aspx geschrieben. Aber mehr wie 20 sollte doch jeder schaffen. Selbst ich mit meinem Codegerümpel liege bei 82/83 im Wartbarkeitsindex (>10k Zeilen).
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    ok so gut bin ich noch nicht ich liege bei 50 - 95(5 zeilen code's,deshalb werde ich nur noch viele klassen mit kurzen codes schreiben :D :D :D ).

    ok ich will mich verbessern.hier mal ein bsp. code, kann ich daran was verbessern. der code erstellt einen zeitbalken auf ein beliebiges bild. habe 57 pkt.

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. namespace Grafik_bearbeitung
    4. {
    5. public class AddBarinPic
    6. {
    7. /// <summary>
    8. /// Add a Timebar in a Picture
    9. /// </summary>
    10. public Image AddBar_TimeCalc(Image _ImageStream, int _Red, int _Green, int _Blue, int _Transperancy, DateTime _Time, Double _Houers, int _PosUTCNull)
    11. {
    12. Bitmap _Bitmap = new Bitmap(_ImageStream);
    13. Graphics _graphic = Graphics.FromImage(_Bitmap);
    14. int _BarWidth = (int)Math.Truncate((_Bitmap.Width / 24) * _Houers);
    15. Time_Calc.Recalc_Time _difftimeUTC = new Time_Calc.Recalc_Time();
    16. int _diffsec = _difftimeUTC._GetDiffUTC_SystemNowSeconds();
    17. int _pixelsec = _getdiffpixelseconds(_Bitmap,_diffsec);
    18. int _Endpixel = _difftimeUTC._GetDiffTwo_Times_Seconds(DateTime.Now, _Time);
    19. int _diffsec2 = _getdiffpixelseconds(_Bitmap, _Endpixel);
    20. int _tempdiff;
    21. if (DateTime.Now > _Time)
    22. {
    23. _tempdiff = _pixelsec - _diffsec2 - (_BarWidth / 2);
    24. }
    25. else
    26. {
    27. _tempdiff = _pixelsec + _diffsec2 - (_BarWidth / 2);
    28. }
    29. int _PosUTCNull2 = 0;
    30. int posxUTCTIME = _PosUTCNull + _tempdiff;
    31. Pen _Timezone = new Pen(Color.FromArgb(_Transperancy, _Red, _Green, _Blue), _BarWidth);
    32. Pen _Border_Timezone = new Pen(Color.FromArgb(255, _Red, _Green, _Blue), 2);
    33. _graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.GammaCorrected;
    34. _graphic.DrawLine(_Timezone, posxUTCTIME, 0, posxUTCTIME, _Bitmap.Height);
    35. _graphic.DrawLine(_Border_Timezone, posxUTCTIME - (_BarWidth / 2), 0, posxUTCTIME - (_BarWidth / 2), _Bitmap.Height);
    36. _graphic.DrawLine(_Border_Timezone, posxUTCTIME + (_BarWidth / 2), 0, posxUTCTIME + (_BarWidth / 2), _Bitmap.Height);
    37. if ((posxUTCTIME - (_BarWidth / 2)) < 0)
    38. {
    39. _PosUTCNull2 = (_Bitmap.Width + (_BarWidth/2)) - ((_BarWidth/2) - posxUTCTIME);
    40. _graphic.DrawLine(_Timezone, _PosUTCNull2, 0, _PosUTCNull2, _Bitmap.Height);
    41. _graphic.DrawLine(_Border_Timezone, _PosUTCNull2 - (_BarWidth / 2), 0, _PosUTCNull2 - (_BarWidth / 2), _Bitmap.Height);
    42. _graphic.DrawLine(_Border_Timezone, _PosUTCNull2 + (_BarWidth / 2), 0, _PosUTCNull2 + (_BarWidth / 2), _Bitmap.Height);
    43. }
    44. else if((posxUTCTIME + (_BarWidth / 2)) > _Bitmap.Width)
    45. {
    46. _PosUTCNull2 = (posxUTCTIME + (_BarWidth / 2)) - _Bitmap.Width;
    47. _graphic.DrawLine(_Timezone, _PosUTCNull2, 0, _PosUTCNull2, _Bitmap.Height);
    48. _graphic.DrawLine(_Border_Timezone, _PosUTCNull2 - (_BarWidth / 2), 0, _PosUTCNull2 - (_BarWidth / 2), _Bitmap.Height);
    49. _graphic.DrawLine(_Border_Timezone, _PosUTCNull2 + (_BarWidth / 2), 0, _PosUTCNull2 + (_BarWidth / 2), _Bitmap.Height);
    50. }
    51. return _Bitmap;
    52. }
    53. private int _getdiffpixelseconds(Image _Bitmap, int _diffseconds)
    54. {
    55. //double _Hour = _Bitmap.Width / 24;
    56. //double _Minute = _Hour / 60;
    57. //double _seconds = _Minute / 60;
    58. double _seconds = ((_Bitmap.Width / 24) / 60) / 60;
    59. Double _diffpix = _seconds * _diffseconds;
    60. return (int)Math.Truncate(_diffpix);
    61. }
    62. }
    63. }
    Bilder
    • Unbenannt.PNG

      260,79 kB, 1.562×931, 122 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    @Rattenfänger Die Codemetrik ist sehr vom Programmierstil des Entwicklers abhängig, insbesondere bei komplexeren Klassen.
    Anderswo wird mit einem Resharper gearbeitet, der überwacht quasi online die Softwareentwicklung und mault sofort, wenn eine Zeile / ein Block nicht den Vorgaben entspricht.
    Wenn Du mal (fast) nicht wartbaren Code sehen willst, öffne ein Projekt von Dir von vor ein paar Jahren. :thumbsup:
    Ich hab mehrere Projekte meiner Vorgänger übernommen und da mehrere Mannmonate reingesteckt, um sie wartbar zu machen.
    Was in jedem Falle hilft, ist:
    Kürzere Prozeduren, Code in Klassen auslagern, Unterverzeichnisse mit Unter-Namespaces anlegen, Funktionalität in separate DLLs auslagern (z.B. Ansteuerung spezieller Hardware).
    Und: Ich schwöre auf die Codeanalyse, hat aber wenig mit Metrik zu tun.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hahahahaha, wenn ich codes aus meinen anfängen öffnen würde, würde mir die CPU mit dem a**** ins Gesicht Gespringen und sagen "Echt jetzt :| !!!".
    Ok worauf achtest du bei der Codeanalyse?

    Rattenfänger schrieb:

    .hier mal ein bsp. code, kann ich daran was verbessern.
    jede menge kannste daran verbessern.
    Ich täts auch gern versuchen, um zu gugge, wieviele Punkte ich kriege (ich werd mich aber einen Deibel unter sone CodeMetric-Diktatur unterwerfen - ich erkenne selber, und viel zuverlässiger, ob Code lesbar ist).
    Wie dem auch sei: da scheint mindest. ein Datentyp zu fehlen, daher kann ich da keine Experimente mit machen, die kompilieren würden.

    Achso - Verbesserungsvorschläge:
    Warum heisst ein Image _ImageStream? - Ein Stream ist doch kein Image!
    Warum haben lokale Variablen den UnderScore-Prefix? - Und KlassenVars haben den scheints ebenso!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo @ErfinderDesRades,
    hoffe du hattest einen guten und geruhsamen Urlaub :-)!

    Also lokale Varibelen bekommen keinen Underscore, sonder nur globale? sehe ich das richtig? werde ich ändern, versuche grad für mich selbst einen weg zu finden alles richtig uns sauber zu schreiben :-).
    ok das mit dem Imagestream ist doof ausgedrückt, gebe ich dir recht.

    Ja dir fehlt die Time_Calc Klasse :)

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace Time_Calc
    7. {
    8. public class Recalc_Time
    9. {
    10. /// <summary>
    11. /// Get the difference between UTC and System Time in seconds as Truncate integer
    12. /// </summary>
    13. public int _GetDiffUTC_SystemNowSeconds()
    14. {
    15. DateTime _CurrenTime = System.DateTime.Now;
    16. DateTime _CurrentTimeUTC = System.DateTime.UtcNow;
    17. TimeSpan Unterschied = _CurrenTime - _CurrentTimeUTC;
    18. return (int)Math.Truncate(Unterschied.TotalSeconds);
    19. }
    20. /// <summary>
    21. /// Get the difference between 2 Time's in second's as Truncate integer
    22. /// </summary>
    23. public int _GetDiffTwo_Times_Seconds(DateTime _FirstTime, DateTime _SecondTime)
    24. {
    25. TimeSpan _returnSeconds = new TimeSpan();
    26. if (_FirstTime > _SecondTime)
    27. {
    28. _returnSeconds = _FirstTime - _SecondTime;
    29. }
    30. else
    31. {
    32. _returnSeconds = _SecondTime - _FirstTime;
    33. }
    34. return (int)_returnSeconds.TotalSeconds;
    35. }
    36. }
    37. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Hier eine halbfertige Überarbeitung:

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. using System.Collections.Generic;
    4. using System.Linq;
    5. namespace Grafik_bearbeitung {
    6. public class AddBarinPic {
    7. /// <summary>
    8. /// erzeugt aus der Vorlage eine Bitmap mit aufgemaltem Zeitbalken. Die Breite der Vorlage entspricht 24h, die Breite des Zeitbalkens dem hours-Parameter
    9. /// </summary>
    10. public Bitmap AddBarinImage(Image img, Color color, int alpha, DateTime time, Double hours, int _PosUTCNull) {
    11. Bitmap bmp = new Bitmap(img);
    12. int timeOffsetSec = (int)DateTimeOffset.Now.Offset.TotalSeconds;
    13. int timeOffset = SecondsToPixel(bmp, timeOffsetSec);
    14. int endpixelSec = Math.Abs((int)(DateTime.Now - time).TotalSeconds);
    15. int endpixel = SecondsToPixel(bmp, endpixelSec);
    16. int tempdiff;
    17. int barWidth_2 = (int)Math.Truncate((bmp.Width / 48) * hours);// halbe Balkenbreite
    18. if (DateTime.Now > time) { tempdiff = timeOffset - endpixel - barWidth_2; }
    19. else { tempdiff = timeOffset + endpixel - barWidth_2; }
    20. int posxUTCTIME = _PosUTCNull + tempdiff;
    21. using (Graphics g = Graphics.FromImage(bmp))
    22. using (Pen penBorder = new Pen(Color.FromArgb(255, color), 2))
    23. using (Pen penBar = new Pen(Color.FromArgb(alpha, penBorder.Color), barWidth_2)) {
    24. g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.GammaCorrected;
    25. g.DrawLine(penBar, posxUTCTIME, 0, posxUTCTIME, bmp.Height);
    26. g.DrawLine(penBorder, posxUTCTIME - barWidth_2, 0, posxUTCTIME - barWidth_2, bmp.Height);
    27. g.DrawLine(penBorder, posxUTCTIME + barWidth_2, 0, posxUTCTIME + barWidth_2, bmp.Height);
    28. if ((posxUTCTIME - barWidth_2) < 0) {
    29. var _PosUTCNull2 = (bmp.Width + barWidth_2) - (barWidth_2 - posxUTCTIME);
    30. g.DrawLine(penBar, _PosUTCNull2, 0, _PosUTCNull2, bmp.Height);
    31. g.DrawLine(penBorder, _PosUTCNull2 - barWidth_2, 0, _PosUTCNull2 - barWidth_2, bmp.Height);
    32. g.DrawLine(penBorder, _PosUTCNull2 + barWidth_2, 0, _PosUTCNull2 + barWidth_2, bmp.Height);
    33. }
    34. else if ((posxUTCTIME + barWidth_2) > bmp.Width) {
    35. var _PosUTCNull2 = (posxUTCTIME + barWidth_2) - bmp.Width;
    36. g.DrawLine(penBar, _PosUTCNull2, 0, _PosUTCNull2, bmp.Height);
    37. g.DrawLine(penBorder, _PosUTCNull2 - barWidth_2, 0, _PosUTCNull2 - barWidth_2, bmp.Height);
    38. g.DrawLine(penBorder, _PosUTCNull2 + barWidth_2, 0, _PosUTCNull2 + barWidth_2, bmp.Height);
    39. }
    40. return bmp;
    41. }
    42. }
    43. private int SecondsToPixel(Image img, int seconds) {
    44. var pixelPerSecond = img.Width / (24.0 * 60 * 60);
    45. return (int)Math.Truncate(pixelPerSecond * seconds);
    46. }
    47. }
    48. }
    Anmerkungen:
    • ungefähre Richtlinie: Weniger Codezeilen und weniger Code ist besserer Code.
    • unnötige usings: System.Task, System.Text
    • Recalc_Time kann static sein, weil zustandsfrei. Beachte die daraus resultierenden Erleichterungen im Zugriff auf deren Methoden
    • Ups - Das Time_Calc-Dingens erwies sich dann als komplett üflüssig.
    • _getdiffpixelseconds(Image _Bitmap, int _diffseconds) ist vereinfacht und umbenannt in das, was es tut: SecondsToPixel
    • lokale VarNames: stark verkürzt, camelCase, ohne prefix. Bitmap bmp, Graphics g, etc reicht völlig.
    • methoden-Params: kurz aber unmissverständlich, camelCase
    • Methodenkommentar: verständlich und korrekt: "Add a Timebar in a Picture" ist wohl ein Witz?
      Die Methode erzeugt eine Bitmap (so hab ich sie nun auch deklariert), und zwar eine Kopie der Vorlage, mit einer TimeBar drauf.
    • gerne auch deutsch kommentieren. Englisch ist nur nötig, wenn absehbar, dass es international gelesen werden wird.
      Andernfalls ist wichtiger, die Sprache zu nehmen, in der du dich am besten ausdrücken kannst. Weil das ist schwierig genug.
    • und auch parameter kommentieren (nur diejenigen, die nicht selbsterklärend sind!): was soll hours? - und v.a.: was ist postUtcNull??
    • gib ihm eine Color, das spart parameter - eine Methode mit mehr als 4 Params ist nur mühsam verständlich
    • Graphics-Objekt disposen - Using-Block - gilt auch für annere Objekte - etwa Pen
    • Übrigens, wenn das eine Klasse ist mit nur einer Methode drin, ist das glaub auch ein Fehldesign - besser wäre, die Klasse wegzumachen, und die Methode da hinzuschreiben, wo sie gebraucht wird.
    • ach - und grober Schnitzer: Die else-if-Kette hat keinen abschliessenden else-Zweig. Es sind also Zustände denkbar, wo die Methode ühaupt nix malt - ich als CodeMetric würde das nicht durchgehen lassen ;)
    ich hab nur teilweise überarbeitet, weil ich nix testen kann, und _PosUTCNull, posxUTCTIME, _PosUTCNull2 ühaupt nicht verstehe.
    Da gibts ja mehrere Fallunterscheidungen - evtl. lässt sich das auch ohne Fallunterscheidung berechnen - das wäre ein enormer Fortschritt an Wartbarkeit.

    Jo - und wieviele Punkte kommen dann da raus?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo @ErfinderDesRades ,

    1.) Dein Code sieht natürlich um einiges eleganter und verständlicher aus.
    2.) Danke für die erklärung, werde es versuchen auch so in Zukunft umzusetzen.
    3.) posUTCNull ist die Position. von der aus die UTC Zeit berechnet wird in Pixel(in dem fall London, ungefähr auf Bild abgemessen, ca 815px in x), da ich aber 3 pos. brauche einmal wenn position1 bei null ist soll position2 rechts beim Bild Weiterzeichnen.
    stell dir die Timebar einfach so vor, das Sie dir Zeigt, wie lange du noch arbeiten musst, ist Sie an deinem geogrphischen Punkt vorbei kannst du nach hause.
    4.) Erstelle aktuell viele eigene Klassen, die zu einem bestimmten Thema passen, in diesem bsp. alles was mit Grafikbearbeitung zu tun hat soll in Zukunft in dieses Projekt. Ob das Sinnvoll ist weiss ich nicht, aktuell hole ich mir alles aus alten Projekten(also copy & paste). Jedoch habe ich das bei einem Unternehmen gesehen und war von dem System begeistert, der riesige nachteil liegt aber auf der Hand, man schickt eine riesige *dll mit in der vlt. nur 2 funktionen genutzt werden.

    Anbei jetzt die Auswertung mit deinem und meinem Code!?

    Die mit X markierten sind meine, nur zur Info das ist VS2017 Prof.
    Bilder
    • WB_Index.PNG

      25,32 kB, 1.607×286, 113 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Rattenfänger schrieb:

    sehe ich das richtig?
    Du kannst Variablen benennen wie immer Du willst, allerdings solltest Du dabei einige Punkte konsequent einhalten:
    • Unterscheide (in der Schreibweise) zwischen lokalen und Klassen-Variablen, z.B. Klassenvariablen groß, lokale klein, und, wie der @ErfinderDesRades schreibt: CamelCase.
    • schreibe vor Klassenvariablen ein this. (C#) bzw. ein Me. (VB.NET) und Du siehst sofort, wo sie hingehört (das macht der IlSpy übrigens auch),
    • veermeide einzeilige if und Co ohne Klammern:
      Auch wenn die IDE den Code ordentlich formatiert, pack den Code nach einem if und Co immer ein Klammernpaar bzw. in einen If-End If-Block usw.
      Wenn Du in einen solchen Block eine Codezeile ergänzt, sind die Begenzungen des Blocks klar erkennbar.
    • Auch wenn das dem @ErfinderDesRades missfällt: { und } kommen in eine neue Zeile, jede Codezeile kommt in eine neue Zeile.
      Auch wenn die Zeile kurz ist, ist sie auf einen Blick überschaubar.
    • Wende dies auch auf "fertige" Projekte an, also: Wenn Du ein Projekt öffnest und Du findest solche "Mängel", behebe sie.
    • Bei "formulierungsmäßigen Unklarheiten": Mach ne Exe, schau Dir den Code im IlSpy an. Der formatiert sehr gut.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ok das mit dem Camelcase gewöhne ich mir auch schon an, da mich 2017 in VB darauf hingewiesen hat, Prozeduren und Funktionen mit großbuchstaben zu schreiben. In C# wird man auch darauf hingewiesen, jedoch macht VS da selbst noch fehler als bsp.

    system generierter code:

    C#-Quellcode

    1. private void button2_Click(object sender, EventArgs e) // ist in dem fall falsch da Button groß geschrieben werden soll, bzw. wird angemekelt.
    2. {
    3. }

    also müsste ich theoretisch über all diese kleinen Fehler korrigieren. In VB macht er es richtig.

    Versuche natürlich, jetzt alle fehler zu beheben, wie schon oben erwähnt, ich versuche mir langsam einen sauberen und ordentlichen Programmierstil anzugewöhnen.
    ok, dann schau ich mir meine codes mal in Ilspy an.

    Edit:

    @RodFromGermany habe die { } so erstellt wie du es gesagt hast im Code von @ErfinderDesRades , schon hat er einen Punkt weniger.

    Ich glaube das ist auch ein Streitpunkt, wo jeder seine eigene Meinung hat und jedes Unternehmen für sich entschieden hat, wie es gemacht werden soll.


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Rattenfänger schrieb:

    Anbei jetzt die Auswertung mit deinem und meinem Code!?
    ... und dann kommt ein schwarzes Bildle mit weisser Schrift, die ich kaum lesen kann - ist das mein Metrik-Ergebnis?
    Und welches ist dein Metrik-Ergebnis?
    Ich wollte doch wissen, inwiefern sich die Unterschiede inne Metrik niederschlagen.



    Rattenfänger schrieb:

    also müsste ich theoretisch über all diese kleinen Fehler korrigieren. In VB macht er es richtig. [...] button2_Click...
    Na benenn den button2 doch einfach richtig, und auch in GrossSchrift, dann wird VS die Methode glaub entsprechend generieren.



    Übrigens Controls benenne ich mit Prefixes. MS-Guidelines sind da zwar gegen, aber das erleichtert unerhört deren Auffinden inne Intellisense.
    Womit gezeigt ist, dasses bessere Guidelines als die von MS gibt - wie gesagt: Guidelines sind prima, aber man sollte sich genau überlegen, welchen man sich unterwerfen möchte.
    Und vorzugsweise einer selbstgestrickten Verbesserung der MS-Guidelines.
    Und die Guideline sollte auch tolerant sein.
    Weil es gibt verschiedene Möglichkeiten, Code gut zu formulieren.
    Und Menschen-Hirne sind da ebenfalls tolerant - also wenn ich einen Stil hab, Code gut zu formulieren, dann habich deswegen kaum ein Problem, einen anderen guten Stil zu lesen - da soll man doch keine Glaubenskriege deswegen anfangen!
    Die Kriegerei kann man sich ja für schlechten Code aufheben - den gibts ja auch noch ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades du hattes 45 pkt. Bei mir waren es 44pkt. dieser Code hat eine Verbesserung um 1pkt. gebracht.

    C#-Quellcode

    1. if (DateTime.Now > time) { tempdiff = timeOffset - endpixel - barWidth_2; }
    2. else { tempdiff = timeOffset + endpixel - barWidth_2; }


    sobald ich es mache wie @RodFromGermany sagt.

    C#-Quellcode

    1. if (DateTime.Now > time)
    2. {
    3. tempdiff = timeOffset - endpixel - barWidth_2;
    4. }
    5. else
    6. {
    7. tempdiff = timeOffset + endpixel - barWidth_2;
    8. }


    ist bei der Wartbarkeit kein Unterschied mehr :-(.

    Das mit dem Button müsste ich theoretisch überall manuell ändern, sprich also im Designer auch manuell ändern

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Rattenfänger schrieb:

    ist bei der Wartbarkeit kein Unterschied mehr
    Natürlich nicht, denn die verwendeten Zeichen sind identisch bis auf die Zeilenschaltung.
    Namen von Controls änderst Du besser im Designer, denn beim "schnöden" Umbenennen mit Crtl+R+R werden die Kommentare und der Name des Controls in der FormX.Designer.y nicht geändert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Rattenfänger schrieb:

    @ErfinderDesRades du hattes 45 pkt. Bei mir waren es 44pkt. dieser Code hat eine Verbesserung um 1pkt. gebracht.
    Womit doch gezeigt ist, dass die Codemetric für'n A... ist, oder?
    Ich habe eine komplette Klasse mit 2 (unnützen) Methoden abgeschafft, eine andere Methode auf einen Einzeiler reduziert, habe ca. 20 Fälle von (barWidth / 2) abgeschafft, using-Blöcke eingeführt, und bringt nur 1 Metric-Punkt?

    (Zutiefst beleidigt) - täte ich empfehlen: Beschäftige dich mit was annerem als mit Metric-Müll.

    Übrigens -
    3.) posUTCNull ist die Position. von der aus die UTC Zeit berechnet wird in Pixel
    erzähl nicht mir, sondern kommentier das dran ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades
    Womit doch gezeigt ist, dass die Codemetric für'n A... ist, oder?


    Tja da gebe ich dir Teilweise Recht, den es sieht nur Zeillenlänge und nicht wie es geschrieben ist! Da hast du vollkommen recht. Trotz der aussage bei MS es wird die Eleganz mit berücksichtigt! Naja.
    Also wir haben ja gesehen das dein Code um einiges Eleganter und noch verständlicher geschrieben ist.

    So gesehen ist aber wiederum Interessant, ohne die Funktion und dem Punktesystem, hätte ich den Code so gelassen und nicht versucht Ihn zu verbessern, also an meinem Schreibstil gezweifelt :-).

    Aber damit du nicht zutiefst beleidigt im Wochenende bleibst habe ich den Code nochmals überarbeitet und kann dir Sagen das wir zusammen(also du 90% ich nochmal 10%) die Klasse von ehemals 50pkt. auf 62 pkt. gepimt haben :-). Juhuu Party!!!!

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. namespace Grafik_bearbeitung
    4. {
    5. public class AddBarinPic
    6. {
    7. /// <summary>
    8. /// erzeugt aus der Vorlage eine Bitmap mit aufgemaltem Zeitbalken. Die Breite der Vorlage entspricht 24h, die Breite des Zeitbalkens dem hours-Parameter.
    9. /// Die Position des Balkens wird aus Time und PosUTCNull berechnet
    10. /// </summary>
    11. public Bitmap AddBarinImage(Image img, Color color, int alpha, DateTime time, Double hours, int PosUTCNull)
    12. {
    13. Bitmap bmp = new Bitmap(img);
    14. int timeOffsetSec = (int)DateTimeOffset.Now.Offset.TotalSeconds;
    15. int timeOffset = SecondsToPixel(bmp, timeOffsetSec);
    16. int endpixelSec = Math.Abs((int)(DateTime.Now - time).TotalSeconds);
    17. int endpixel = SecondsToPixel(bmp, endpixelSec);
    18. int tempdiff;
    19. int barWidth_2 = (int)Math.Truncate((bmp.Width / 48) * hours);// halbe Balkenbreite
    20. if (DateTime.Now > time)
    21. {
    22. tempdiff = timeOffset - endpixel - barWidth_2;
    23. }
    24. else
    25. {
    26. tempdiff = timeOffset + endpixel - barWidth_2;
    27. }
    28. int posxUTCTIME = PosUTCNull + tempdiff;
    29. using (Graphics g = Graphics.FromImage(bmp))
    30. using (Pen penBorder = new Pen(Color.FromArgb(255, color), 2))
    31. using (Pen penBar = new Pen(Color.FromArgb(alpha, penBorder.Color), (barWidth_2 * 2)))
    32. {
    33. g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.GammaCorrected;
    34. DrawBarLine(g, penBar, posxUTCTIME, 0, posxUTCTIME, bmp.Height, penBorder, barWidth_2);
    35. if ((posxUTCTIME - barWidth_2) < 0)
    36. {
    37. var PosXUTCNull_2 = (bmp.Width + barWidth_2) - (barWidth_2 - posxUTCTIME);
    38. DrawBarLine(g, penBar, PosXUTCNull_2, 0, PosXUTCNull_2, bmp.Height, penBorder, barWidth_2);
    39. }
    40. else if ((posxUTCTIME + barWidth_2) > bmp.Width)
    41. {
    42. var PosXUTCNull_2 = (posxUTCTIME + barWidth_2) - bmp.Width;
    43. DrawBarLine(g, penBar, PosXUTCNull_2, 0, PosXUTCNull_2, bmp.Height, penBorder, barWidth_2);
    44. }
    45. }
    46. return bmp;
    47. }
    48. private static void DrawBarLine(Graphics g, Pen PenBar,float x,float y, float x2, float y2,Pen PenBorder,int BarWidth_2)
    49. {
    50. g.DrawLine(PenBar, x, y, x2, y2);
    51. g.DrawLine(PenBorder, x - BarWidth_2, y, x2 - BarWidth_2, y2);
    52. g.DrawLine(PenBorder, x + BarWidth_2, y, x2 + BarWidth_2, y2);
    53. }
    54. private int SecondsToPixel(Image img, int seconds)
    55. {
    56. var pixelPerSecond = img.Width / (24.0 * 60 * 60);
    57. return (int)Math.Truncate(pixelPerSecond * seconds);
    58. }
    59. }
    60. }


    Edit: Die Ultimate Version hat sogar eine Funktion, die doppelte codzeilen findet und in eine Funktion umwandelt, WOW!!! Nur zur Info.
    Und ich habe herausgefunden das C# besser bewertet wird als VB ein und der selbe code.

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace Lambdavariablen_Test1
    7. {
    8. class Program
    9. {
    10. static void Main(string[] args)
    11. {
    12. var Actions = new List<Action>();
    13. for (int i = 0; i <= 3; i++)
    14. {
    15. Actions.Add(() => { Console.Write(i); });
    16. }
    17. foreach (var i in Actions)
    18. {
    19. i();
    20. }
    21. Console.ReadLine();
    22. }
    23. }
    24. }


    gibt 65pkt.

    VB.NET-Quellcode

    1. Module Module1
    2. Public Sub Main()
    3. Dim Actions As New List(Of Action)
    4. For i = 0 To 3
    5. Actions.Add(Sub() Console.Write(i))
    6. Next
    7. For Each i In Actions
    8. i()
    9. Next
    10. Console.ReadLine()
    11. End Sub
    12. End Module


    gibt 62 Pkt.

    auch wird eine gesammt Klasse ganz anders berechnet in C# sowie vb.net. Aber das ist jetzt auch Haarspalterei.

    Und bevor Ihr motzt, der Code ist absichtlich Falsch :-)!
    Bilder
    • Unbenannt_2.PNG

      261,57 kB, 1.579×925, 79 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Rattenfänger“ ()

    Rattenfänger schrieb:

    Die Ultimate Version hat sogar eine Funktion, die doppelte codzeilen findet und in eine Funktion umwandelt, WOW!!! Nur zur Info.
    Danke, das habe ich noch nicht gefunden. :thumbup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!