Bonjour.
Je crée ce sujet pour poursuivre une digression qui a eu lieu dans les commentaires de la news sur les commentaires dans un code source.
Celle-ci portait sur la comparaison entre :
- un code découpé en plusieurs fonctions séparées dans des modules/classes distinctes,
- et ce même code laissé en un seul morceau.
Pour rappel, voici les interventions des protagonistes :
Sérieusement, ce qui peut être fautif dans le principe général : "aucune méthode de plus de N lignes", ce ne sont pas les cycles qu'on va perdre mais le fait que 70 lignes de code, s'exécutant de manière séquentielle, dans une seule fonction, sont nettement plus faciles à lire, comprendre, et débuguer que 7 méthodes "uniques mais surement réutilisables un jour, enfin peut être" de 10 lignes, éparpillées dans trois modules distincts, avec des noms qui ne sont pas forcément si évocateurs pris hors contexte.
Et si on applique un peu trop servilement ces principes de découplage (comme avec une application trop naive du principe de responsabilité unique), on se retrouve, dès que le programme devient un peu gros, un peu ancien, avec des verrues, avec ces abominables hiérarchies de classes qui donnent l'impression d'avoir été pensées par un bègue sous acide...
Comme beaucoup d'autres l'ont dit, un code doit rester lisible, et, veut veut pas, il est plus confortable de lire un roman qu'un programme dont vous êtes le héros...Plus faciles à débugger à la rigueur, plus faciles à lire et comprendre... on ne doit pas vivre dans le même monde. Quand il faut remonter 70 lignes plus haut pour voir à quelle valeur une variable a été initialisée, s'y retrouver dans 4 niveaux de if imbriqués, bref quand il faut que notre cerveau jongle avec des dizaines de symboles plutôt que quelques-uns dans une méthode courte et focalisée, j'ai du mal à voir où est le gain de lisibilité. J'ai toujours considéré comme évident que plusieurs petits problèmes bien découpés étaient plus facilement gérables qu'un gros touffu, mais c'est intéressant de voir que ce n'est pas l'avis de tout le monde.Je tiens à lancer le débat : plusieurs fonctions courtes, ou une seule fonction longue ?On ne peut être que d'accord...
Maintenant, si le problème est simple, et que sa solution est bien découpée en un nombre pas trop important de petits morceaux explicites et faciles à comprendre, le code sera facile à comprendre et maintenir, que tu l'aies découpé en petites tranches fines, ou gardé en gros paquets séparés par des commentaires (et des initialisations locales de paramètres, et pas de if imbriqués... ce n'est pas parce qu'on code de grosses fonctions qu'on doit forcément coder illisible, ou idiot). Bref, c'est le pays joyeux des codeurs heureux, des devs gentils, c'est le paradis...
Si maintenant, le problème, ou plutôt sa solution, est compliqué, avec toutes sortes de cas particuliers tordus, qui interréagissent, et des effets de bords - si on est dans la vraie vie, quoi - on fait comment?
Ma sensation, c'est que le découpage en petits bouts ne rendra pas le code plus facile à comprendre. On échange un gros machin difficile, par une collection de petits machins simples, dont on ne comprend plus l'interaction (parce que si c'était facile, on serait dans le cas où le problème ne se pose pas). Et si tous ces éléments sont dispersés dans une collection de modules, et on tout un tas de propriétés que le développeur d'origine a ajouté "des fois que", ça devient vite très compliqué.
Avec ce code délocalisé, il est également beaucoup plus facile de tout casser en ne voyant pas un effet de bord (oui je sais, quand les problèmes sont simples, et bien découpés, cela n'existe pas... mais dans le monde réel...)
Une fois de plus, la caricature de cela, ce sont les hiérarchies de classes démentes, avec plein de petites classes qui font des petites choses minuscules, toutes très faciles à comprendre, mais qui cachent l'organisation générale du traitement effectué.
Ce type d'organisation est séduisante: quand on commence à le lire, on a l'impression de tout comprendre, que tout est simple.... jusqu'au moment où on se demande "comment ca marche", ou "comment le faire évoluer"...
Personnellement, dans le cas d'un traitement compliqué, je préfère nettement avoir une grosse "fonction coeur", avec une documentation éventuellement assez compliquée, et marqué en gros au dessus : "attention code tordu" pour éviter les interventions intempestives, qu'une organisation décentralisée.
A vrai dire, ce débat a déjà une réponse définitive et totalement tranchée, basée sur des éléments totalement objectifs. Et je suis sûr que cette réponse, et ses raisons, en surprendront plus d'un.
Mais je suis curieux de savoir ce que les membres du forum en pensent. Il me semble que la majorité d'entre vous, et surtout ceux qui font de l'OO, privilégieront le choix de plusieurs fonctions courtes.
A vos claviers !
Partager