Penso che dipenda da quanto grande sarà il progetto complessivo.
Ad un estremo, supponiamo che tu abbia un progetto 1 Mloc. Per un progetto così vasto, è improbabile che un singolo individuo sia un "esperto" in tutte le aree interessate. Quindi, in questo caso, rimarrei con gli stili di codice esistenti per ogni componente principale. I nuovi sviluppatori sceglieranno un'area, la apprenderanno ed è improbabile che vedranno molti altri componenti che possono avere stili di codice diversi.
Se il progetto è molto più piccolo, dove è probabile che gli individui comprendano l'intera base di codice, sceglierei uno stile di codice dominante e lo rispetterei. In questo caso, penso che la coerenza nell'intero progetto abbia più senso perché i nuovi sviluppatori probabilmente lavoreranno in tutte le aree del progetto.
I progetti di medie dimensioni sono forse i più difficili da prendere per questa decisione. In questo caso, devi valutare i costi di ciascun approccio e decidere quello che ritieni sarà il più economico a lungo termine. La sfida è che i progetti di medie dimensioni sono generalmente cresciuti abbastanza da raggiungere un punto in cui un refactoring di stile completo sembra proibitivamente costoso. Potresti voler dare una seconda occhiata alla struttura ad albero del codice per vedere se le cose possono essere organizzate per raggruppare stili di codice particolari insieme.
Ad ogni modo, la decisione finale dovrebbe spettare alla squadra che stai facendo, che sta mettendo insieme questo pacchetto.
Alcuni degli outlier che potrebbero spostare il mio ragionamento dall'alto:
Se uno o più moduli hanno uno stile atroce, allora non ha senso tenerlo presente, anche su un progetto più ampio. Sì, lo stile è soggettivo, ma se tu e i tuoi colleghi partecipanti al progetto davvero, non vi piace davvero il modo in cui scorrono aree particolari, date una nuotata al vecchio stile e dategli uno migliore.
Se tutti gli stili sono ragionevolmente vicini l'uno all'altro, potrebbe essere altrettanto facile dichiarare "ecco il nuovo modo" e usarlo per tutto il nuovo codice e significativi refactoring. Questo può rendere le recensioni un po 'dolorose, ma nella mia esperienza la maggior parte delle persone sono abbastanza capaci di adattarsi a questo approccio. Fornisce anche un segnale rivelatore in cui si trova il vecchio codice.
A volte lo stile viene spostato in base alle nuove funzionalità aggiunte alla lingua. C ++ ha acquisito una serie di funzionalità nel corso degli anni. Può avere senso rifattorizzare secondo necessità lo stile più vecchio in uno stile più nuovo che sfrutti queste funzionalità.
Alcune biblioteche possono avere un approccio o uno stile particolarmente idiomatico. In tal caso, rimarrei con quello stile per quella libreria anche se potrebbe essere in conflitto con il resto del progetto. L'intento qui è di aumentare le probabilità che qualcuno che lavora frobnosticators
su altri progetti lavorerà anche sul tuo progetto.
Alcuni dei commenti menzionano stili imperativi e orientati agli oggetti come una considerazione.
I moduli "pesanti" in uno stile particolare probabilmente dovrebbero rimanere in questo modo se il modulo è di medie dimensioni o più grande. Ho lavorato con i tre stili principali (imperativo, obiettivo e funzionale) e ho trasformato gli stili imperativi pesanti in uno stile OO. Con una quantità media o maggiore di codice, il refactoring può essere (eccezionalmente) difficile. La mia esperienza è stata confusa perché non avevo alcun supporto di strumenti per aiutare nel refactoring.
Immagino che vi sia un'alta correlazione tra i moduli dallo stile fortemente imperativo e quei moduli che sono idiomatici per particolari nicchie di sviluppo, che risale all'ultimo punto che ho sollevato con valori anomali. Quindi qualsiasi modulo che troveresti per quella funzionalità apparirà così, e vuoi che anche gli esperti di quel dominio possano facilmente lavorare sul tuo progetto. Ma se ci sono opzioni e alla tua squadra non piace lo stile di quel modulo, allora analizzerei le opzioni.
Allo stesso modo, ho lavorato con un modulo in stile OO pesante in cui i principi di OO sono stati portati troppo avanti e utilizzati in modo errato. Ad esempio, le interfacce venivano utilizzate in sostituzione dell'ereditarietà multipla. E come ci si potrebbe aspettare, è stata un'implementazione grezza. Sono stato in grado di compiere ragionevoli progressi nel refactoring di quel modulo, ma alla fine ho abbandonato quell'approccio poiché ho trovato pacchetti migliori da utilizzare.