kimmi hat geschrieben:Ok, ein Beispiel, was ich innerhalb von 1 Minute suchen gefunden habe: MeshController::Commit hat eine Looptiefe von etwa 4 ohne einen für mich hilfreichen Kommentar. Dazu sind viele structs gestreut, deren Sinn man nicht auf Anhieb versteht. Als Anwender muß ich mehrmals darüber nachdenken, was das alles soll und was da passiert. Sollte ich da einen Bug fixen müssen, hätte ich eine ziemlich große Einarbeitungszeit ( wo finde ich was etc. ).
Such doch mal nach Code-Reading in Google. Da findest du viele Dinge, die gerade auf Lesbarkeit abzielen, wenn du Hinweise haben möchtest.
Die
structs sind eigentlich nicht gestreut, sondern in ihrer Verschachtelung ein exaktes Abbild der Datenstruktur, die jeweils aufgebaut wird. Dass sich in der Mitte nochmal ein
struct-Block findet, liegt daran, dass die entsprechende Datenstruktur erst im dort nachfolgenden Code Verwendung findet. Dass du im Falle einer Veränderung darüber nachdenken müsstest, ist unzweifelhaft, immerhin ist die Datenstruktur alles andere als trivial. Als bloßer Anwender siehst du vom Inhalt der gesamten Datei im Übrigen nichts. Es ist klar, dass der Code wenig dokumentiert ist; immerhin steht nicht in Aussicht, dass in allzu naher Zukunft viele Fremde daran werkeln werden.
Dass es wünschenswert wäre, die Datei nochmal in einen Verwaltungs- und einen Rendering-Teil zu unterteilen, hatte ich ja bereits angesprochen, da sind wir uns denke ich einig. Spannender ist deine Bemerkung zur Komplexität von
Commit. Ich weiß, dass es zu den weit verbreiteten Best Practices gehört, verschachtelte Schleifen in eigene Funktionen/Methoden zu verpacken. Die dort aufgebaute Datenstruktur enthält einige Querverbindungen via Zeiger/Indizes; das was dort aufgebaut wird, hat einen starken Zusammenhang. Ist es nun transparenter, die Datenstruktur in wenigen kompakten Blöcken aufzubauen, oder den Aufbau gemäß Best Practices in kleine überschaubare Häppchen zu unterteilen?
Da du es so konkret ansprichst, hier das Experiment:
Commit() vorher und
nachher.
Auffällig ist, dass der Code vorher wesentlich kompakter (überschaubarer?) war. Dafür sind die Geltungsbereiche nun wesentlich klarer. Relevante Information wird in den Funktionsköpfen wiederholt (ins Gedächtnis gerufen?). Der Code enthält neben trivialen Verben nun auch kurze Halbsätze in den Funktionsnamen, die eine gewisse Absichtserklärung enthalten. Fazit: Der Ablauf ist nun klarer. Ist die Datenstruktur als Ganzes, mit ihren Zusammenhängen und Invarianten, ebenfalls leichter zu erfassen geworden?