Recentemente durante l'esecuzione di una revisione del codice mi sono imbattuto in qualcosa del genere:
Codice vecchio:
WriteLabour(useNewVersion);
WritePart();
WriteNonLabour(useNewVersion);
Nuovo codice:
WriteLabour();
WritePart(useNewVersion);
WriteNonLabour();
Ora lascia che ti dia qualche informazione. Questo è un codice molto vecchio, non molto orientato agli oggetti. Ci sono sempre due versioni del file, la versione corrente e la versione precedente. Il flag useNewVersion determina se la versione corrente o precedente deve essere scritta. Il file è destinato al consumo da parte di un cliente e quando viene visualizzata una nuova versione, ci inviano le nuove specifiche, cambiamo il codice per generare il file secondo le nuove specifiche e questa diventa la nuova versione. Quella che era la nuova versione ora diventa la versione precedente, la capacità di scrivere la versione anche precedente a quella viene gettato via per sempre (il codice viene cancellato).
Il programmatore stava aggiornando il codice per la nuova specifica appena ricevuta. Ha trovato dopo aver cancellato il codice per la versione da dimenticare che WriteLabour () e WriteNonLabour () non avevano più codice specifico per la versione, mentre WriteParts () ora doveva avere un codice specifico per la versione. Così ha cambiato le firme del metodo come ho indicato sopra.
Il mio suggerimento nella revisione del codice era che sarebbe stato bello mantenere coerenti le firme dei metodi e fornire sempre il flag useNewVersion, anche se il codice all'interno del metodo non utilizzava il flag. Per me questo ha un senso intuitivo, perché è molto probabile che le future versioni del file richiederanno il passaggio del flag e l'interfaccia per il chiamante rimarrà coerente. La sua argomentazione contro il mio suggerimento era che passare il flag useNewVersion a metodi che non ne avevano bisogno era un design gonfiato. Chissà quali altri parametri potrebbero aver bisogno dei metodi, dovremmo passarli tutti in anticipo?
Il mio istinto era che la sua argomentazione era errata in questo caso particolare, ma non potevo contrastarla in modo efficace. La mia domanda quindi è se ci sono decisioni di progettazione che sappiamo siano in arrivo o da esperienze passate, è sbagliato incorporarle nel progetto attuale anche se potrebbero essere attualmente inutilizzate? Specificamente in termini di interfacce pubbliche, firme dei metodi ecc., Non codice privato.
Ma è importante mantenere il codice snello e non sovrascrivere la progettazione. Non voglio essere l'astronauta dell'architettura.
Nota educata: per favore non deragliare l'argomento suggerendo il rifacimento del codice. Questo non dovrebbe essere una critica del design del nostro codice legacy. Quel codice non è all'altezza degli standard, e lo so.