Je pense que cela dépend de la taille du projet dans son ensemble.
À un extrême, disons que vous avez un projet de 1 Mloc. Pour un projet aussi vaste, il est peu probable qu'une seule personne soit un "expert" dans tous les domaines concernés. Donc, dans ce cas, je m'en tiendrai aux styles de code existants pour chaque composant principal. Les nouveaux développeurs choisiront une zone, l'apprendront et il est peu probable qu'ils voient de nombreux autres composants qui peuvent avoir des styles de code différents.
Si le projet est beaucoup plus petit, où il est probable que les individus comprennent l'intégralité de la base de code, je choisirais un style de code dominant et je m'en tiendrai à cela. Dans ce cas, je pense que la cohérence dans l'ensemble du projet est plus logique, car les nouveaux développeurs seront susceptibles de travailler dans tous les domaines du projet.
Les projets de taille moyenne sont peut-être les plus difficiles à prendre pour cette décision. Dans ce cas, vous devez peser les coûts de chaque approche et décider de celle qui, selon vous, sera la moins chère à long terme. Le défi est que les projets de taille moyenne se sont généralement développés juste assez pour qu'un refactoring de style complet semble prohibitif. Vous voudrez peut-être jeter un deuxième coup d'œil à la structure de l'arborescence de code pour voir si les choses peuvent être organisées pour regrouper des styles de code particuliers.
Quoi qu'il en soit, la décision finale devrait appartenir à l'équipe sur laquelle vous composez ce package.
Certaines des valeurs aberrantes qui pourraient déplacer mon raisonnement d'en haut:
Si un ou plusieurs des modules ont un style atroce, alors cela n'a aucun sens de le garder, même sur un projet plus important. Oui, le style est subjectif, mais si vous et vos collègues participants au projet n'aimez vraiment, vraiment pas la façon dont les zones particulières coulent, nuquez l'ancien style et donnez-lui un meilleur.
Si tous les styles sont raisonnablement proches les uns des autres, il pourrait être tout aussi facile de déclarer «voici la nouvelle façon» et de l'utiliser pour tout nouveau code et refactorisations importantes. Cela peut rendre les critiques un peu pénibles, mais d'après mon expérience, la plupart des gens sont assez capables de s'adapter à cette approche. Il fournit également un signe révélateur de l'emplacement de l'ancien code.
Parfois, le style est modifié en fonction de nouvelles fonctionnalités ajoutées au langage. C ++ a repris un certain nombre de fonctionnalités au fil des ans. Il peut être judicieux de refactoriser au besoin l'ancien style en un style plus récent qui tire parti de ces fonctionnalités.
Certaines bibliothèques peuvent avoir une approche ou un style particulièrement idiomatique. Si c'est le cas, je m'en tiendrai à ce style pour cette bibliothèque même s'il peut entrer en conflit avec le reste du projet. L'intention ici est d'augmenter les chances qu'une personne qui travaille sur frobnosticators
d'autres projets travaille également sur votre projet.
Certains commentaires ont mentionné les styles impératifs et orientés objet comme étant une considération.
Les modules qui sont "lourds" dans un style particulier devraient probablement le rester si le module est de taille moyenne ou plus grande. J'ai travaillé avec les trois styles principaux (impératif, objectif et fonctionnel), et j'ai refactorisé les styles impératifs lourds en un style OO. Avec une quantité de code moyenne ou supérieure, la refactorisation peut être (exceptionnellement) difficile. Mon expérience a été confondue car je n'avais aucun support d'outillage pour aider au refactoring.
J'imagine qu'il existe une forte corrélation entre les modules de style fortement impératif et ces modules étant idiomatiques pour des niches de développement particulières, ce qui remonte au dernier point que j'ai soulevé avec les valeurs aberrantes. Donc, tout module que vous trouverez pour cette fonctionnalité ressemblera à cela, et vous voulez que les experts de ce domaine puissent également travailler facilement sur votre projet. Mais s'il y a des options et que votre équipe n'aime pas le style de ce module, alors j'examinerais les options.
De même, j'ai travaillé avec un module de style OO lourd où les principes OO ont été poussés trop loin et mal utilisés. Par exemple, les interfaces étaient utilisées comme substitut à l'héritage multiple. Et comme vous vous en doutez, c'était une implémentation grossière. J'ai pu faire des progrès raisonnables dans la refonte de ce module, mais j'ai finalement abandonné cette approche car j'ai trouvé de meilleurs packages à utiliser à la place.