Ensuite, il y a un feu vert, et dans un effort pour nettoyer les choses, quelqu'un écrit un GameManager. Probablement pour tenir un tas de GameStates, peut-être pour stocker quelques GameObjects, rien d’énorme, vraiment. Un mignon petit gestionnaire.
Vous savez, alors que je lisais ceci, de petites alarmes se sont déclenchées dans ma tête. Un objet nommé "GameManager" ne sera jamais mignon ou petit. Et quelqu'un a fait ça pour nettoyer le code? À quoi ressemblait-il avant? OK, blague à part: le nom d'une classe devrait indiquer clairement ce que la classe fait, et cela devrait être une chose (alias: principe de responsabilité unique ).
En outre, vous pouvez toujours vous retrouver avec un objet tel que GameManager, mais il est clair qu'il existe à un niveau très élevé et qu'il devrait concerner des tâches de haut niveau. Maintenir un catalogue d'objets de jeu? Peut-être. Faciliter la communication entre les objets du jeu? Sûr. Calculer des collisions entre objets? Non! C'est aussi pour cette raison que le nom de Manager est mal vu - il est trop large et permet beaucoup d'abus sous cette bannière.
Une règle rapide sur la taille des classes: si vous rencontrez plusieurs centaines de lignes de code par classe, quelque chose commence à mal tourner. Sans être trop zélé, rien de plus, disons, 300 LOC, c’est une odeur de code pour moi, et si vous dépassez les 1 000, les sonneries d’avertissement devraient sonner. En croyant que 1000 lignes de code sont plus simples à comprendre que 4 classes bien structurées de 250 chacune, vous vous leurrez.
Lorsque le temps devient un problème, il est impossible d'écrire une classe séparée ou de diviser ce gestionnaire géant en sous-gestionnaires.
Je pense que ce n'est le cas que parce que le problème est autorisé à se propager au point que tout est un gâchis total. La pratique de la refactorisation est vraiment ce que vous recherchez - vous devez améliorer en permanence la conception du code, par incréments infimes .
Que suggéreriez-vous pour empêcher cela?
Le problème n’est pas d’ordre technologique, vous ne devez donc pas chercher de solution technique à ce problème. Le problème est le suivant: votre équipe a tendance à créer des morceaux de code monolithiques et à croire qu’il est bénéfique à moyen / long terme de fonctionner de la sorte. Il semble également que l'équipe manque d'un chef solide en architecture, qui dirigerait l'architecture du jeu (ou du moins, cette personne est trop occupée pour effectuer cette tâche). Fondamentalement, le seul moyen de sortir est de faire reconnaître aux membres de l’équipe que cette pensée est fausse. Il ne favorise personne. La qualité du produit va se détériorer et l'équipe ne passera que plus de nuits à réparer.
La bonne nouvelle est que les avantages immédiats et tangibles de l'écriture de code propre sont si importants que presque tous les développeurs réalisent leurs avantages très rapidement. Convaincre l’équipe de travailler de cette manière pendant un moment, les résultats feront le reste.
La partie difficile est que développer une idée de ce qui constitue un mauvais code (et un talent pour concevoir rapidement un meilleur design) est l’une des compétences les plus difficiles à acquérir en développement. Ma suggestion s'articule autour de l'espoir d'avoir dans l'équipe une personne suffisamment expérimentée pour le faire - il est beaucoup plus facile de convaincre les gens de cette façon.
Edit - Un peu plus d'infos:
En général, je ne pense pas que votre problème se limite au développement de jeux. À la base, c'est un problème d'ingénierie logicielle, d'où mes commentaires dans ce sens. Ce qui peut être différent, c’est la nature de l’industrie du développement de jeux, qu’elle soit davantage axée sur les résultats et sur les délais que d’autres types de développement, je ne suis pas sûre.
En ce qui concerne plus particulièrement le développement de jeux, la réponse acceptée à cette question sur StackOverflow concernant les conseils «en particulier d’architecture de jeu» est la suivante:
Suivez les principes solides de la conception orientée objet .
C'est essentiellement exactement ce que je dis. Lorsque je suis sous pression, je me retrouve également à écrire de gros morceaux de code, mais je me suis dit que c'était une dette technique. Ce qui a tendance à bien fonctionner pour moi est de passer la première moitié (ou les trois quarts) de la journée à produire une grande quantité de code de qualité moyenne, puis de prendre un peu de recul et d'y réfléchir pendant un certain temps; faire un peu de conception dans ma tête, ou sur papier / tableau blanc, sur la façon d’améliorer un peu le code. Souvent, je remarque du code répétitif et je suis en mesure de réduire le nombre total de lignes de code en décomposant, tout en améliorant la lisibilité. Ce temps investi a été rentabilisé si rapidement que le qualifier d '"investissement" semble bête - bien souvent, je ramasserai des bugs qui auraient pu perdre une demi-journée (une semaine plus tard), si je l'avais laissé continuer.
- Corrigez les choses le même jour où vous les codez.
- Vous serez heureux de l'avoir fait en quelques heures.
Venir à croire réellement ce qui précède est difficile; J'ai réussi à le faire pour mon propre travail uniquement parce que j'ai expérimenté, encore et encore, les effets. Même dans ce cas, il m'est toujours difficile de justifier la modification du code alors que je pourrais en produire davantage ... Donc, je comprends vraiment d'où vous venez. Malheureusement, ce conseil est peut-être trop générique et difficile à faire. J'y crois fortement, cependant! :)
Pour répondre à votre exemple spécifique:
Clean Code d' Oncle Bob résume à merveille le code de bonne qualité. Je suis d'accord avec presque tout de son contenu. Ainsi, lorsque je pense à votre exemple d'une classe de gestionnaire de 30 000 LOC, je ne peux pas vraiment accepter la partie "bonne raison". Je ne veux pas paraître offensant, mais penser de cette façon conduira au problème. Il n'y a pas de bonne raison d'avoir autant de code dans un seul fichier - c'est presque 1000 pages de texte! Tout avantage lié à la localité (vitesse d'exécution ou "simplicité" de la conception) sera immédiatement annulé par le fait que les développeurs sont complètement embourbés à vouloir naviguer dans cette monstruosité, et ce, même avant que nous discutions de la fusion, etc.
Si vous n'êtes pas convaincu, ma meilleure suggestion serait de prendre un exemplaire du livre ci-dessus et de le parcourir. Appliquer ce type de pensée à des personnes crée volontairement un code propre et explicite, bien structuré.