Dann gibt es ein grünes Licht und in dem Bestreben, die Dinge zu bereinigen, schreibt jemand einen GameManager. Wahrscheinlich, um ein paar GameStates zu haben, vielleicht, um ein paar GameObjects zu speichern, eigentlich nichts Großes. Ein süßer, kleiner Manager.
Wissen Sie, als ich das las, ging mir ein kleiner Alarm durch den Kopf. Ein Objekt mit dem Namen "GameManager" wird niemals süß oder klein sein. Und jemand hat das getan, um den Code zu bereinigen? Wie sah es vorher aus? OK, Scherze beiseite: Der Name einer Klasse sollte ein klarer Hinweis darauf sein, was die Klasse tut, und dies sollte eine Sache sein (auch bekannt als Prinzip der einmaligen Verantwortung ).
Es kann auch vorkommen, dass Sie am Ende ein Objekt wie GameManager haben, das jedoch auf einer sehr hohen Ebene vorhanden ist und sich mit Aufgaben auf hoher Ebene befassen sollte. Einen Katalog mit Spielobjekten pflegen? Vielleicht. Erleichterung der Kommunikation zwischen Spielobjekten? Sicher. Berechnen Sie Kollisionen zwischen Objekten? Nein! Dies ist auch der Grund, warum der Name Manager verpönt ist - er ist zu weit gefasst und lässt unter diesem Banner viel Missbrauch zu.
Eine kurze Faustregel für Klassengrößen: Wenn Sie auf mehrere hundert Codezeilen pro Klasse stoßen, beginnt etwas schief zu laufen. Ohne übereifrig zu sein, ist irgendetwas über 300 LOC ein Codegeruch für mich, und wenn Sie über 1000 gehen, sollten Warnglocken losgehen. Indem Sie glauben, dass 1000 Codezeilen einfacher zu verstehen sind als 4 gut strukturierte Klassen zu je 250, täuschen Sie sich.
Wenn die Zeit zum Problem wird, besteht keine Möglichkeit, eine separate Klasse zu schreiben oder diesen riesigen Manager in Untermanager aufzuteilen.
Ich denke, das ist nur der Fall, weil das Problem sich so weit ausbreiten darf, dass alles völlig durcheinander ist. Die Praxis des Refactorings ist genau das, wonach Sie suchen - Sie müssen das Design des Codes in winzigen Schritten kontinuierlich verbessern .
Was würden Sie vorschlagen, um dies zu verhindern?
Das Problem ist kein technologisches Problem, daher sollten Sie nicht nach technologischen Lösungen suchen. Das Problem ist das Folgende: In Ihrem Team besteht die Tendenz, monolithische Codeteile zu erstellen, und die Überzeugung, dass es mittel- und langfristig von Vorteil ist, so zu arbeiten. Es scheint auch, dass dem Team ein starker architektonischer Vorsprung fehlt, der die Architektur des Spiels steuern würde (oder zumindest ist diese Person zu beschäftigt, um diese Aufgabe auszuführen). Grundsätzlich besteht der einzige Ausweg darin, dass die Teammitglieder erkennen, dass dieses Denken falsch ist. Es tut niemandem den Gefallen. Die Qualität des Produkts wird sich verschlechtern und das Team wird nur noch mehr Nächte damit verbringen, Dinge zu reparieren.
Die gute Nachricht ist, dass die unmittelbaren, greifbaren Vorteile des Schreibens von sauberem Code so groß sind, dass fast alle Entwickler ihre Vorteile sehr schnell erkennen. Überzeugen Sie das Team, eine Weile auf diese Weise zu arbeiten. Die Ergebnisse werden den Rest erledigen.
Der schwierige Teil ist, dass das Entwickeln eines Gefühls für das, was schlechten Code ausmacht (und das Talent, schnell ein besseres Design zu finden), eine der schwierigeren Fähigkeiten ist, die in der Entwicklung zu erlernen sind. Mein Vorschlag hängt mit der Hoffnung zusammen, dass Sie jemanden im Team haben, der das kann - es ist viel einfacher, die Leute auf diese Weise zu überzeugen.
Bearbeiten - Ein bisschen mehr Info:
Im Allgemeinen glaube ich nicht, dass sich Ihr Problem auf die Spieleentwicklung beschränkt. Im Kern handelt es sich um ein Software-Engineering-Problem, daher meine Kommentare in diese Richtung. Was möglicherweise anders ist, ist die Art der Spieleentwicklungsbranche, ob sie ergebnis- und terminorientierter ist als andere Entwicklungstypen, da bin ich mir nicht sicher.
Speziell für die Spieleentwicklung lautet die akzeptierte Antwort auf diese Frage zu StackOverflow in Bezug auf Tipps zur "Speziellen Spielarchitektur":
Befolgen Sie die Solid-Prinzipien des objektorientierten Designs ....
Dies ist im Wesentlichen genau das, was ich sage. Wenn ich unter Druck stehe, schreibe ich auch große Teile des Codes, aber mir ist klar, dass dies eine technische Schuld ist. Was für mich in der Regel gut funktioniert, ist, die erste Hälfte (oder drei Viertel) des Tages damit zu verbringen, eine große Menge von Code mittlerer Qualität zu produzieren, sich dann zurückzulehnen und eine Weile darüber nachzudenken. Mach ein bisschen Design in meinem Kopf oder auf Papier / Whiteboard, um den Code ein bisschen zu verbessern. Oft stelle ich fest, dass sich Code wiederholt, und kann die Gesamtzahl der Codezeilen tatsächlich reduzieren, indem ich Dinge aufteile, während ich gleichzeitig die Lesbarkeit verbessere. Diesmal macht sich die Investition so schnell bezahlt, dass es albern klingt, es als "Investition" zu bezeichnen - ziemlich oft stelle ich Fehler fest, die meinen halben Tag (eine Woche später) verschwendet hätten, wenn ich sie weitergehen lassen hätte.
- Beheben Sie die Probleme am selben Tag, an dem Sie sie codieren.
- Sie werden froh sein, dass Sie es innerhalb weniger Stunden getan haben.
Es ist schwierig zu glauben, dass dies tatsächlich der Fall ist. Ich habe es nur für meine eigene Arbeit geschafft, weil ich die Auswirkungen immer wieder erlebt habe. Trotzdem ist es für mich immer noch schwierig, das Reparieren von Code zu rechtfertigen, wenn ich mehr herausbringen könnte ... Also verstehe ich definitiv, woher Sie kommen. Leider ist dieser Rat vielleicht zu allgemein und nicht einfach zu befolgen. Ich glaube jedoch fest daran! :)
Um Ihr spezielles Beispiel zu beantworten:
Onkel Bobs Clean Code macht eine erstaunliche Arbeit darin, zusammenzufassen, wie guter Qualitätscode ist. Ich bin mit fast allen Inhalten einverstanden. Wenn ich also an Ihr Beispiel einer 30 000-LOC-Manager-Klasse denke, kann ich dem Teil "Gute Gründe" nicht wirklich zustimmen. Ich möchte nicht beleidigend klingen, aber so zu denken wird zum Problem führen. Es gibt keinen guten Grund, so viel Code in einer einzigen Datei zu haben - es sind fast 1000 Seiten Text! Jeder Vorteil der Lokalität (Ausführungsgeschwindigkeit oder "Einfachheit" des Designs) wird sofort zunichte gemacht, wenn die Entwickler völlig festgefahren sind, um durch diese Monstrosität zu navigieren, und das noch bevor wir über das Zusammenführen usw. sprechen.
Wenn Sie nicht überzeugt sind, ist mein bester Vorschlag, sich ein Exemplar des obigen Buches zu schnappen und es durchzublättern. Das Anwenden dieser Art des Denkens auf Menschen führt dazu, dass sie freiwillig sauberen, selbsterklärenden Code erstellen, der gut strukturiert ist.