Creo que depende de cuán grande sea el proyecto en general.
En un extremo, digamos que tiene un proyecto de 1 Mloc. Para un proyecto tan grande, es poco probable que un solo individuo sea un "experto" en todas las áreas involucradas. Entonces, en este caso, me quedaría con los estilos de código existentes para cada componente principal. Los nuevos desarrolladores elegirán un área, aprenderán eso y es poco probable que vean muchos otros componentes que pueden tener diferentes estilos de código.
Si el proyecto es mucho más pequeño, donde es probable que las personas comprendan toda la base del código, entonces elegiría un estilo de código dominante y seguiría con eso. En este caso, creo que la coherencia en todo el proyecto tiene más sentido porque es probable que los nuevos desarrolladores trabajen en todas las áreas del proyecto.
Los proyectos medianos son quizás los más difíciles de tomar esta decisión. En este caso, debe sopesar los costos de cada enfoque y decidir cuál cree que será menos costoso a largo plazo. El desafío es que los proyectos medianos generalmente han crecido lo suficiente como para que una refactorización de estilo completa parezca prohibitivamente costosa. Es posible que desee echar un segundo vistazo a la estructura de árbol de código para ver si se pueden organizar las cosas para agrupar estilos de código particulares.
De cualquier manera, la decisión final debe recaer en el equipo en el que estás que está armando este paquete.
Algunos de los valores atípicos que podrían cambiar mi razonamiento desde arriba:
Si uno o más de los módulos tienen un estilo atroz, entonces no tiene sentido mantener eso, incluso en un proyecto más grande. Sí, el estilo es subjetivo, pero si a ti y a tus compañeros participantes del proyecto realmente no les gusta la forma en que fluyen áreas particulares, destruye el viejo estilo y dale uno mejor.
Si todos los estilos están razonablemente cerca uno del otro, podría ser igual de fácil declarar "aquí está la nueva forma" y usarla para todos los códigos nuevos y refactorizaciones significativas. Esto puede hacer que las revisiones sean un poco molestas, pero en mi experiencia la mayoría de las personas son bastante capaces de adaptarse a este enfoque. También proporciona una señal indicadora de dónde está el código anterior.
A veces, el estilo cambia según la nueva funcionalidad agregada al lenguaje. C ++ ha recogido una serie de características a lo largo de los años. Puede tener sentido refactorizar, según sea necesario, el estilo más antiguo a un estilo más nuevo que aproveche esas características.
Algunas bibliotecas pueden tener un enfoque o estilo particularmente idiomático. Si es así, me quedaría con ese estilo para esa biblioteca, incluso si puede entrar en conflicto con el resto del proyecto. La intención aquí es aumentar las probabilidades de que alguien que trabaja frobnosticatorsen otros proyectos también trabaje en su proyecto.
Algunos de los comentarios mencionaron los estilos imperativos y orientados a objetos como una consideración.
Los módulos que son "pesados" en un estilo particular probablemente deberían permanecer así si el módulo es mediano o más grande. He trabajado con los tres estilos principales (imperativo, objetivo y funcional), y he refactorizado los estilos imperativos pesados en un estilo OO. Con una cantidad de código media o mayor, la refactorización puede ser (excepcionalmente) difícil. Mi experiencia fue confusa porque no tenía ningún soporte de herramientas para ayudar en la refactorización.
Me imagino que existe una alta correlación entre los módulos de estilo imperativo y aquellos módulos que son idiomáticos para nichos de desarrollo particulares, lo que se remonta al último punto que planteé con valores atípicos. Por lo tanto, cualquier módulo que encuentre para esa funcionalidad se verá así, y desea que los expertos de ese dominio también puedan trabajar fácilmente en su proyecto. Pero si hay opciones y a su equipo no le gusta el estilo de ese módulo, entonces investigaría las opciones.
Del mismo modo, he trabajado con un módulo de estilo OO pesado donde los principios OO se llevaron demasiado lejos y se usaron incorrectamente. Como ejemplo, las interfaces se estaban utilizando como un sustituto de la herencia múltiple. Y como era de esperar, fue una implementación cruda. Pude hacer un progreso razonable en la refactorización de ese módulo, pero finalmente abandoné ese enfoque ya que encontré mejores paquetes para usar.