Esiste un file sorgente in un progetto piuttosto grande con diverse funzioni che sono estremamente sensibili alle prestazioni (chiamate milioni di volte al secondo). In effetti, il precedente manutentore aveva deciso di scrivere 12 copie di una funzione ognuna leggermente diversa, al fine di risparmiare il tempo che sarebbe trascorso a controllare i condizionali in un'unica 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 è quello di scrivere invece un file che genera le 12 copie della funzione (praticamente un expander modello monouso). Ovviamente fornirei una spiegazione abbondante del perché il file deve essere generato a livello di codice.
La mia preoccupazione è che ciò porterebbe alla confusione dei futuri manutentori, e forse introdurrebbe cattivi bug se dimenticano di rigenerare il file dopo averlo modificato, o (anche peggio) se modificano invece il file generato a livello di programmazione. Sfortunatamente, a parte riscrivere il tutto in C ++, non vedo alcun modo per risolvere questo problema.
I vantaggi di questo approccio superano gli svantaggi? Dovrei invece:
- Assumi il colpo di performance e usa un'unica funzione mantenibile.
- Aggiungi spiegazioni sul motivo per cui la funzione deve essere duplicata 12 volte e sopporta con cura gli oneri di manutenzione.
- Tentativo di utilizzare generici come modelli (probabilmente non funzionano in questo modo).
- Urla al vecchio manutentore per aver reso il codice così dipendente dalle prestazioni su una singola funzione.
- Altro metodo per mantenere prestazioni e manutenibilità?
PS A causa della cattiva progettazione del progetto, la profilazione della funzione è piuttosto complicata ... tuttavia, l'ex manutentore mi ha convinto che l'hit di performance è inaccettabile. Suppongo che questo significhi più del 5%, anche se è una mia ipotesi completa da parte mia.
Forse dovrei elaborare un po '. Le 12 copie svolgono un compito molto simile, ma presentano differenze minime. Le differenze sono diverse in tutta la funzione, quindi sfortunatamente ci sono molte, molte dichiarazioni condizionali. Esistono effettivamente 6 "modalità" di operazione e 2 "paradigmi" di operazione (parole inventate da me stesso). Per utilizzare la funzione, si specifica la "modalità" e il "paradigma" dell'operazione. Questo non è mai dinamico; ogni parte di codice utilizza esattamente una modalità e un paradigma. Tutte e 12 le coppie modalità-paradigma sono utilizzate da qualche parte nell'applicazione. Le funzioni sono appropriatamente chiamate func1 a func12, con numeri pari che rappresentano il secondo paradigma e numeri dispari che rappresentano il primo paradigma.
Sono consapevole che questo è il peggior progetto di sempre se l'obiettivo è la manutenibilità. Ma sembra essere "abbastanza veloce", e questo codice non ha avuto bisogno di modifiche da un po 'di tempo ... Vale anche la pena notare che la funzione originale non è stata eliminata (anche se è un codice morto per quanto posso dire) , quindi il refactoring sarebbe semplice.
Makefile
" (o qualunque sistema tu usi) e rimuovilo dopo aver completato la compilazione . In questo modo semplicemente non hanno la possibilità di modificare il file sorgente errato.