Suche Menschen die meinen C#-Code kritisieren!

ich bin einer der einzigen Programmierer in meinem Semester und der Beste.
von dem was so vermittelt wurde weiß ich nicht ob ich nicht sogar besser bin als die professoren...
aber das will ich eigentlich nicht glauben... zum Wohle aller^^
 
andy_m4 schrieb:
Gut lesbarer Code bedeutet nicht, dass Du ihn jetzt gut lesen kannst wo Du ihn schreibst, sondern das wenn Du in 2 Jahren noch mal drauf guckst immer noch verstehst, was Du da fabriziert hast.
Kleine Anekdote dazu, um die Wichtigkeit zu verdeutlichen: Ich arbeite seit meinem Master Ende 2017 Vollzeit in der Softwareentwicklung. Hauptsächlich in einem Projekt mit 15 Teilprojekten in einem Hauptprogramm, Jedes Teilprojekt hat nochmals so grob über den Daumen gepeilt zwischen 10 und 100 Klassen/Views/etc. Dadurch, dass man immer hin und her springt liest man auch den Code anderer, früherer, oder parallel entwickelnder Mitarbeiter. Gibt es da keinen Stil, der eindeutig ist kostet dich das alleinige Verstehen von manchen Stellen Stunden. Teilweise entwickle ich selber, muss für eine andere Aufgabe Monate pausieren und wenn ich zurück komme hab ich von meinem eigenen Code damals keinen Dunst mehr. Ist der Code dann mies, oder selbst wenn er gut ist hat er keine Kommentare...bin ich am Arsch. Und bei meinem Stundensatz kostet mich jede Minute, die ich mit Verstehen von schlechtem Code verschwende, richtig, richtig Schotter.
Ich weiß, im Bachelor und Master hab ich nicht so viel praktisch relevantes gelernt, eher im praktischen Teil meiner dualen Ausbildung dort. Aber ich nehme bis heute die analytischen Fähigkeiten mit, Grundlagen, Denkweisen, mathematische Sachen, und vieles mehr, die mir das gebracht hat. Und dazu gehört durch die praktische Erfahrung auch das Analysieren von Code, das Verstehen und das (durch Übung und Anwendung verbesserte) Anwenden eines einheitlichen, durchdachten Coding Styles, wo mich ein ReSharper, IntelliSense oder sonst ein Tool hilfreich unterstützt, aber nie(!) ersetzt.

Ich glaube auch nicht, dass du dumm bist, clever wirst du sein. Vielleicht nur eher unerfahren, um wirklich hinter die Sinnhaftigkeit der Weisheiten mancher alten Hasen hier zu steigen :D Ich war vor ein paar Jahren noch genauso.

Und als kleinen Tipp, um den Thread hier etwas produktiver zu gestalten: gestalte gezielte Fragestellungen im Idealfall etwas übersichtlicher, am besten stichpunktartig.
Sowas wie

Thema: LINQ

Ich hab xy dazu gelesen und so und so verstanden.
  • Welche Bedeutung hat die Verwendung von LINQ anstelle von a?
  • Erreiche ich dadurch bestimmte Vorteile (dich ich selber noch nicht so ganz verstanden habe)?
  • Kann ich mein Problem b mit Herangehensweise c damit vlt sogar besser lösen?
  • blabla
So hat man zumindest als Antwortschreiber deutlich direkter prägnante Fragestellungen und kann gezielter darauf eingehen als auf die hier üblichen 30km Fließtexte (die auch ihren Sinn hatten, alles gut :D) Vielleicht nur so als Idee. Ich werd soweit das hier mal im Auge behalten und evtl. meinen Senf dazugeben falls ich mal Zeit haben sollte, auch wenn ich mich mit Unity nicht wirklich auskenne^^ Hier gibts auch Codeblöcke, wenn du spezifische Fragen hast wäre hier ein Spoiler mit Code ganz hilfreich, um das einzugrenzen. Wer mehr Hintergrund haben will, kann das Projekt aus Post 1 ja immer noch separat betrachten.

C#:
public string IchSehWasDasDuNichtSiehst(string was){
    return string.Format("und das ist {0}!", was);
}

// oder wenn wir mal aktueller sein wollen
public string IchSehWasDasDuNichtSiehst(string was) => $"und das ist {was}!";

So als 50 Cents von meiner Seite. Fühl dich frei davon was anzuwenden oder nicht, ist ja nicht mein Thread :D
 
  • Gefällt mir
Reaktionen: areiland
Letzteres gefällt mir vom Code her deutlich besser. wird alles was in {} steht als Variable genommen?
also wennich jetzt z.B. schreibe {x.y.z.funktion()} nimmt der das auch als Variable??
Das wär dann sogar etwas kürzer und übersichtlicher und wenn dann noch die Laufzeit minimal besser ist dann brat ich für die ganze Runde nen Schweinebraten ;)
 
Richtig. Hauptsache er gibt was zurück. In der Regel nutze ich sowas für schönere Ausgaben von properties oder so. Oder wenn’s nur einfache returns sind bei Methoden wird die Methode ein Einzeiler. Aber das ist glaube erst mit C# v7 oder nem .NET 4.7.x dazu gekommen, daher läuft das eher erst in aktuelleren Projekten 😁 was bei dir zum Glück ja funktioniert :D
 
Ich melde mich freiwillig.
Dein Code ist kacke.
:)
 
  • Gefällt mir
Reaktionen: cfHxqA
Puuuh da wär ich mir jetzt nicht so sicher... Ich probiers aus aber soweit ich weiß benutzt Unity nur C#6
Das könnte etwas eklatant werden...
Aber wennich gerade so drüber nachdenke ist diese Vorgehensweise eigentlich sinnlos. Der Performance-Vorteil den man dadurch hat ist warscheinlich im Nanosekundenbereich. Das würde sinnmachen wenn man regelmäßig tausende Strings verknüpft aber wenn ich mir das so ansehe ist das mit dem Stil gar nicht möglich oder?
So könnte man schreiben
variable += string[x];
und wenn man dann noch das Array-Element mit ner Umgebung haben will sowas wie
"Variable x:" + string[] + ";"
kann man sich das wohl abschminken? Ähnlich bei string.Format oder?
 
Es ging dabei auch nie um Performance. Mein Code war ein reiner Coding Style Grund sich Zeilen und/oder unnötige Phrasen zu sparen. Nothing more :) Performance spielt dann eher ne Rolle bei DataBinding, ObservableCollections, Events die da im Hintergrund gefeuert werden und und und. Da lässt sich weitaus mehr rausholen. Aber das ist hier ja erstmal nicht von Belang :D
Kokujou schrieb:
So könnte man schreiben
variable += string[x];
und wenn man dann noch das Array-Element mit ner Umgebung haben will sowas wie
"Variable x:" + string[] + ";"
kann man sich das wohl abschminken? Ähnlich bei string.Format oder?
Ich versteh zwar nicht ganz was du willst, aber für sowas eignen sich StringBuilder ganz gut.
C#:
var sb = new StringBuilder();
foreach(var string in strings){
    sb.Append(string);
    sb.Append(", ");
}
sb.Remove(letzte zwei Zeichen (hab die Syntax grad nicht im Kopf));
sb.Append(";");

Ergebnis:
    ["Hallo","Welt","der","Wunder"] => "Hallo, Welt, der, Wunder;"
Für sinnvollere Texte natürlich andere Logiken verwenden, aber wenns um String verknüpfen geht ist der StringBuilder eigentlich genau der richtige. So wie man Dateipfade im Idealfall mit Path.Combine verbindet anstatt als strings irgendwie aneinander zu kleben.
 
Achso? Weil ich hatte in nem anderen Thread der vorher verlinkt wurde gesehen, dass es ähnliche Tipps zum Thema Performance bei String-Verkettungen gibt und dachte du willst darauf hinaus ^^ aber natürlich wenn's klappt benutze ich den Stil, der ist mir eh lieber, obwohl dann natürlich n bisl das Highlighting fehlt und es dementsprechend anfälliger auf Typos ist. Nützlich :3
 
Die Hardwarehersteller sagen immer: Performante Software schreiben ist unnötig. :-)
 
  • Gefällt mir
Reaktionen: psYcho-edgE
Tja sag das mal meinem Smartphone XD
Als ich mein projekt noch mit haufenweise Find-Aufrufen zugestöpselt habe statt die Variablen gleich zu Anfang da reinzupacken dachte ich ich krieg nen schlag so sehr hat das gelaggt. Und aus den Laggs kamen Animationsfehler..

Klar bei PC-Software da kann der Computer mit allem umgehen aber bei Smartphone wirds übler.
 
There are only two hard problems in Computer Science: cache invalidation and naming things — Phil Karlton

Kokujou schrieb:
dass es ähnliche Tipps zum Thema Performance bei String-Verkettungen gibt
Strings sind beim Programmieren immer inperformant. Doch das sind bereits micro optimizations.
Hier ein Zitat von StackExchange:
My personal summary of 25 answers, thanks to all.

Sometimes we need to really worry about micro-optimisations, but only in very rare circumstances. Reliability and readability are far more important in the majority of cases. However, considering micro-optimisation from time to time doesn't hurt. A basic understanding can help us not to make obvious bad choices when coding [...]
Quelle: https://softwareengineering.stackex...5/is-micro-optimisation-important-when-coding

Kokujou schrieb:
Tja sag das mal meinem Smartphone XD
Als ich mein projekt noch mit haufenweise Find-Aufrufen zugestöpselt habe statt die Variablen gleich zu Anfang da reinzupacken dachte ich ich krieg nen schlag so sehr hat das gelaggt.
Selbst Smartphones haben sehr viel Leistung.
Bei solchen Problemen handelt es sich meist eher um grundlegende Design-Fehler im eigenen Code.
 
Was für Fehler auch immer sie haben viel Performance gefressen.
Was ich mir persönlich gewünscht hätte wären irgendwelche Fehler die gemacht werden und wirklich viel Performance fressen ohne dass man es merkt.
Wie z.B. diese Linq.Find Operationen, die GameObject.Finds und Resources.Load in Unity.
Und da gibt's sicher noch mehr. Funktionenin vorgehensweise die man niemals benutzen sollte besonders nicht wenn sie bei jedem Aufruf eines main-loops, alias der Update-Routine in Unity aufgerufen werden.

Ich meine bedenkt ich bin ein Anfänger. Ich sehe eine Funktion die sagt "Find" und denke mir, die benutz ich. Ich hab keine Ahnung was da drinne steht. Ich vertraue darauf dass die schon tut was ich will und nicht meinen ganzen Code zerstört. Genauso wie ich darauf vertraut habe dass String Verkettung der Form "" + "" + "" schon irgendwie performant sein wird. A la "wenn die es als Standard drin haben werden die wohl kaum den langsamsten Code der Welt fabrizieren". Aber vielleicht kann man sich da ja nicht immer drauf verlassen.
 
Kokujou schrieb:
Ich meine bedenkt ich bin ein Anfänger. Ich sehe eine Funktion die sagt "Find" und denke mir, die benutz ich. Ich hab keine Ahnung was da drinne steht. Ich vertraue darauf dass die schon tut was ich will
Nicht umsonst gibt des Dokumentationen, sowohl im Code als auch externe. Es gibt manche Namen bei denen man aus der Sicht des Nutzers in einer bestimmten Situation etwas anderes erwartet.
Z. B. haben wir ein Objekt mit dem Namen DataProvider und der Methode search() und find(q String...).
Nun moechtest du den DataProvider sagen, dass er in seinem Datensatz nach allen Werten mit der Eigenschaft X suchen soll.
Ueber Intellisense findest du direkt die methode search(). Wunderst dich weshalb keine Parameter bereitgestellt werden. Nutzt sie aber trtozdem.
In Wirklichkeit ist search() allerdings dafuer da, um z. B. alle moeglichen Daten-Quellen zu suchen, und nicht den Datensatz zu durchsuchen.
Liest man allerdings die Dokumentationen durch, erfaehrt man sowas recht fix. Oft haben die Dokus auch bestimmte Beispiele wie etwas zu verwenden ist oder wie manche Sachen gemacht werden.

Genauso gut kann es sein, dass manche Methoden in manchen Situationen sehr performant arbeiten, in einer anderen allerdings nicht. Bestes beispiel sind Sortieralgorithmen. Manche kommen sehr gut mit vorsortierten Datensaetzen zurecht. Andere haben dort ihre Probleme, dafuer koennen sie sehr gut mit unsortierten arbeiten.

Kokujou schrieb:
Genauso wie ich darauf vertraut habe dass String Verkettung der Form "" + "" + "" schon irgendwie performant sein wird.
Es gibt unterschiedliche Arten wie ein String gebaut werden kann. Verwendest du den Plus-Operator werden in den meisten Sprachen erst alle Strings erstellt. Dann wird aus String 1 und String 2 ein neuer String, Anschliessend aus String1+2 und String 3 der String String1+2+3.
Genauso gibt es Sprachen in denen true und false global nur einmal erstellt wird und andere wo man dieses verhalten erzwingen muss. Aber um solche Probleme zu erkennen, zu verstehen und anschliessend auch beheben zu koennen brauchst du erstmal wissen ueber die implementierung, ueber den compiler, technisches Wissen wie CPUs arbeiten und und und.

Kokujou schrieb:
Ich meine bedenkt ich bin ein Anfänger.
Dafuer dass du ein Anfaenger bist, bist du von dir und deiner Arbeit ganz schoen ueberzeugt.
Ich finde es gut, dass du versuchst dich zu verbessern, aber deine Profs und Kommilitonen pauschal als "Unfaehig" abzustempeln ist dann nicht gerade gut. Vllt koennte man ja doch was von ihnen lernen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: psYcho-edgE
Crast schrieb:
Ich finde es gut, dass du versuchst dich zu verbessern, aber deine Profs und Kommilitonen pauschal als "Unfaehig" abzustempeln ist dann nicht gerade gut. Vllt koennte man ja doch was von ihnen lernen.
Bei der Pauschalisierung stimm ich dir zu, konnte diese Meinung aber manchmal auch nachvollziehen. Manche Dozenten lehren Kram, der jeder Logik widerstrebt. Und damit mein ich noch nicht mal etwas, das unter Umständen versteckt noch sinnvoll sein könnte. (Ich hatte mal nen Dozenten, der Folien aus ideellem Wert benutzt hat und dann die vergilbten Polilux Folien mit Fingerabdrücken an die Wand schmiss. Ich mein sei es ihm gegönnt, aber das war auch so ein Highlight des Studentenlebens xD)
Nichtsdestotrotz sollte man sich mit solchen Aussagen aus TE-Sicht dennoch zurückhalten, weil es einfach nur ein Streitthema ist, dass man nicht objektiv bewerten kann, es kann wahr sein oder einfach verblendet. Irgendwas nimmt man sich ja immer mit, wenn man will. Auch hier wieder das Stichwort "Erfahrung" :D

Beim restlichen Teil des Beitrags stimm ich zu, Dokus sind die Heilbringer eines rudimentär guten Codings.
 
  • Gefällt mir
Reaktionen: psYcho-edgE
Also ich habe endlich das Wunder vollbracht und Git zum Laufen gebracht. Hier das Ergebnis:
https://github.com/Kokujou/Hanafuda
Bin auch schon fleißig am verbessern hier und da.
Ich werde auf jeden Fall NICHT alle statischen Variablen rausschmeißen. Wenn eine Variable an x Orten ymal verwendet wird dann schmeiß ich sie nicht durch x verschiedene Funktionen. Und vor allem ist zu beachten, dass alle durch den Inspektor zugewiesenen Variablen... generell alle Standardwerte bei Instanziierung löscht. Und dann müsste ich alle über .Find-Operationen suchen. Das ist Ineffizient und würde meinen Code verzehnfachen^^
Aber ich bin natürlich gerne bereit mir anzuhören was ihr tun würdet.
Ich rede von dem Spezialfall in der Assets/Resources/Scripts/Global.cs - allCards und allYaku.
die werden sogut wie überall im Code aufgerufen und in verschiedenen Szenen. Die einzige nicht ganz ineffiziente Möglichkeit wäre vielleicht dem Global-Objekt eine Komponente hinzuzufügen die diese Variablen verwaltet. Da bin ich mit der Statik ja auf der sicheren Seite weil ich genau weiß dass die Laufzeit davon minimal ist.

also ich liebe die Dokus :P aber wenn etwas funktioniert schlage ich üblicherweise ja nicht nach obs auch Laufzeiteffizient ist, wäre dem so wäre ich jetzt wohl bereits steinalt ^^ Ich dachte halt ihr kennt typische Performance-Fallen

Und ja ich habs halt zusammengefasst was ich über Profs denke, weil ich keine lange Rede schreiben wollte. Grundsätzlich halte ich mich mit All-Aussagen zurück. Versuche ich zumindest^^
 
Du hast glaube genau das falsche reingehauen. Ich seh nur DLLs. Keinen Quellcode. Die ganzen Build Verzeichnisse haben in GIT nichts verloren. Einzig die Projektmappe mit Code und Ressourcen usw. ist wichtig! :D
 
  • Gefällt mir
Reaktionen: Crast und psYcho-edgE
Nero1 schrieb:
Die ganzen Build Verzeichnisse haben in GIT nichts verloren.

/sign

Man müllt sich das Repo voll und jede Library-Abweichung wird mit commited, obwohl es absolut irrelevant ist, solange die verwendeten Libraries kompatibel sind. Gleiches gilt für eventuell kompilierte binaries. Die Kompilierarbeit darf derjenige, der das Repo klont, gern selbst machen (bzw. muss, wenn er Anpassungen vornimmt, wovon auszugehen ist, wenn das Repo geklont wird).
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Crast
Zurück
Oben