Pulizia del codice generato: Refactor o Map?

8

Contesto:

Recentemente ho dovuto gestire un file di classe generato da XSD.exe. Era lungo 3500 righe con nomi di classi / variabili ridicolmente verbosi (pensa someRidiculouslyLongPrefixThenMaybeOneThingUniqueAtTheEnd - difficile da confrontare a colpo d'occhio con someRidiculouslyLongPrefixThenMaybeOneOtherThingChanged ) e annotazioni dappertutto. La conclusione è che mi ci sono voluti anni per capire cosa diavolo stava succedendo. L'ho letto e ho pensato che non avrei mai messo il mio nome accanto a qualcosa così ... Un-clean.

Domanda:

1) È una cattiva pratica fare confusione con il codice generato (cioè pulirlo).

2) Sarebbe una buona pratica scrivere un mapper per mappare le classi generate alle mie classi belle e pulite (con le quali potrei poi lavorare, abbastanza felicemente)?

Modifica

Grazie per tutti i commenti.

Se in realtà stavo facendo qualcosa di interessante con esso (cioè se ci fossero oggetti di dominio che erano tutt'altro che oggetti di trasporto), penso che li mapperei a classi 'più pulite', che dovrei fare comunque per ottenere qualsiasi tipo di funzionalità da loro. In questo caso le classi sono effettivamente DTO quindi forse ha senso che il nome corrisponda agli elementi corrispondenti. Come detto, non ho bisogno di toccarlo - solo per chiamare accessors / mutators prima di passare i dati ad un altro layer per l'elaborazione.

Per ora, penso che li lascerò da soli.

    
posta Tom Tom 29.01.2013 - 13:20
fonte

3 risposte

14

Il pericolo con il codice generato dal refactoring di cancellarlo e riordinarlo è che se viene rigenerato dallo strumento da solo o da un altro sviluppatore, le modifiche andrebbero perse.

Il tuo team potrebbe mettersi in una posizione in cui dovresti generare il codice in un altro file e copiarlo nella versione pulita e nel refactoring per applicare le modifiche che richiedono solo tempo e risorse. (Sono stato lì con la versione originale di Entity Framework.)

Se non riesci a convivere con i nomi generati, cambia la fonte da cui proviene o fai come suggerisci al punto # 2.

    
risposta data 29.01.2013 - 13:27
fonte
10

Come regola generale, non toccare mai il codice generato, perché farlo significa promettendo che non lo genererai mai più, o dovrai rifare tutte le modifiche che hai apportato. Se vuoi che il codice generato appaia più bello, devi automatizzare sia la generazione del codice che la pulizia; ad esempio, se generi un file XML da qualche parte, potresti eseguirlo tramite xmlindent come parte del processo di generazione.

Per motivi simili, il codice generato non appartiene al controllo del codice sorgente. Metti i dati e le regole sotto il controllo del codice sorgente e lascia che il tuo script di compilazione gestisca la generazione del codice.

Qualsiasi modifica al codice generato deve passare attraverso il generatore di codice, ovvero, se si desidera che il codice generato appaia diverso, modificare gli input del generatore di codice, il generatore di codice stesso o applicare la post-elaborazione programmabile. Ma non modificare a mano.

Un'eccezione sono i generatori di codice in stile "scaffolding", in cui si esegue il generatore una volta per darvi uno scheletro dal quale si costruisce ulteriormente. Con questi, non eseguirai mai più il generatore per lo stesso file, quindi devi solo considerare il file generato come un normale file sorgente e dimenticare che proviene da un generatore.

    
risposta data 29.01.2013 - 13:40
fonte
3

Sono totalmente d'accordo con @NikolaiDante (+1) risposta.

In dotnet / c # si ha il concetto di "classi parziali": il codice sorgente per la "classe da utilizzare" consiste di 2 file separati di una parte generata e di una parte aggiunta / modificata manualmente. Le tue api-abbellimenti entrano nel file "manuale" che non verrà sovrascritto dal codificatore.

Nel mondo java / hybris usano l'ereditarietà per il codice non generato:

Ad esempio, hai un cliente di classe con le tue "api-abbellimenti" che eredita da "GeneratedCustomer".

    
risposta data 29.01.2013 - 13:44
fonte

Leggi altre domande sui tag