C'è un file sorgente in un progetto piuttosto grande con diverse funzioni estremamente sensibili alle prestazioni (chiamate milioni di volte al secondo). In effetti, il precedente manutentore ha deciso di scrivere 12 copie di una funzione ciascuna leggermente diversa, in modo da risparmiare il tempo che sarebbe stato speso controllando i condizionali in una singola funzione.
Sfortunatamente, questo significa che il codice è un PITA da mantenere. Vorrei rimuovere tutto il codice duplicato e scrivere solo un modello. Tuttavia, il linguaggio, Java, non supporta i modelli e non sono sicuro che i generici siano adatti a questo.
Il mio piano attuale è di scrivere invece un file che genera le 12 copie della funzione (praticamente un expander template one-use-only). Fornirei ovviamente spiegazioni abbondanti sul motivo per cui il file deve essere generato a livello di codice.
La mia preoccupazione è che ciò porterebbe alla confusione dei futuri manutentori e forse introdurrà dei bug sgradevoli se dimenticheranno di rigenerare il file dopo averlo modificato, o (ancora peggio) se modificano invece il file generato dal programma. Sfortunatamente, a meno di riscrivere il tutto in C ++, non vedo alcun modo per sistemarlo.
I vantaggi di questo approccio superano gli svantaggi? Dovrei invece:
- Ottieni il successo in termini di prestazioni e utilizza un'unica funzione gestibile.
- Aggiungi spiegazioni sul motivo per cui la funzione deve essere ripetuta 12 volte e si presta gentilmente agli oneri di manutenzione.
- Tentativo di utilizzare i generici come modelli (probabilmente non funzionano in questo modo).
- Urlo al vecchio manutentore per la creazione di codice in modo da rendere le prestazioni dipendenti da una singola funzione.
- Altro metodo per mantenere le prestazioni e la manutenibilità?
P.S. A causa della scarsa progettazione del progetto, la profilazione della funzione è piuttosto complicata ... tuttavia, il precedente manutentore mi ha convinto che il successo in termini di prestazioni è inaccettabile. Suppongo che questo significhi più del 5%, anche se questa è una supposizione completa da parte mia.
Forse dovrei elaborare un po '. Le 12 copie svolgono un compito molto simile, ma presentano minime differenze. Le differenze sono in vari punti in tutta la funzione, quindi purtroppo ci sono molte, molte, dichiarazioni condizionali. Vi sono effettivamente 6 "modalità" di funzionamento e 2 "paradigmi" di operazione (parole composte da me stesso). Per usare la funzione, si specifica la "modalità" e il "paradigma" dell'operazione. Questo non è mai dinamico; ogni pezzo di codice usa esattamente una modalità e un paradigma. Tutte le 12 coppie modalità-paradigma vengono utilizzate da qualche parte nell'applicazione. Le funzioni sono giustamente chiamate func1 a func12, con numeri pari che rappresentano il secondo paradigma e numeri dispari che rappresentano il primo paradigma.
Sono consapevole che questo è solo il peggior disegno di sempre se la manutenibilità è l'obiettivo. Ma sembra essere "abbastanza veloce" e questo codice non ha richiesto alcuna modifica per un po '... Vale anche la pena notare che la funzione originale non è stata cancellata (anche se è un codice morto per quanto posso dire) , quindi il refactoring sarebbe semplice.