Passa all'oggetto composto per i parametri

5

Ho diversi moduli dati, che prendono un paio di parametri da un elenco di configurazione. Pensi che sia ok passare un oggetto di configurazione nel suo complesso module1(config) e lasciare che il modulo scelga ciò di cui ha bisogno, o dovrei piuttosto passare i singoli parametri module1(config.a, config.c, config.f) ? Il primo caso non richiede la modifica delle interfacce nel caso in cui avessi bisogno di più parametri di configurazione, ma il secondo caso incapsula di più?

    
posta Gerenuk 14.06.2012 - 20:11
fonte

4 risposte

5

Il modello di oggetto parametro è ampiamente utilizzato in .NET e in altri framework orientati agli oggetti.

Questo è essenzialmente ciò che stai descrivendo che cosa sta succedendo passare in un singolo oggetto ed è considerato una buona pratica, purché i singoli parametri abbiano buone impostazioni predefinite (quindi i moduli funzioneranno anche quando solo alcuni dei parametri sono passati in ).

Se i tuoi moduli non hanno un uso per tutti gli articoli nell'oggetto di configurazione, chiamerei comunque un odore di codice. Se non sono necessari, perché passarli? L'oggetto di configurazione dovrebbe corrispondere alle esigenze del modulo.

    
risposta data 14.06.2012 - 20:14
fonte
1

Quindi vuoi scrivere questo metodo Module1, che dipende da qualche sottoinsieme delle proprietà di un oggetto Configuration.

Alcuni motivi per cui Module1 può prendere l'oggetto Configuration come un singolo parametro:

  • Le future versioni di Module1 potrebbero utilizzare proprietà aggiuntive dell'oggetto Configuration. Ciò richiederebbe modifiche a ogni sito di chiamata se si utilizzano parametri individuali. (Questo potrebbe non essere importante se Module1 è esposto solo internamente al tuo progetto, e hai IDE con funzionalità di refactoring avanzate. Importa molto se fa parte di un'API pubblicata pubblicamente.)

  • Nei luoghi in cui si desidera chiamare Module1, si dispone di un oggetto Configuration disponibile ed è più conveniente passare semplicemente l'intero oggetto piuttosto che passare in ogni proprietà pertinente.

Potresti volere che Module1 assuma le proprietà rilevanti come parametri individuali se:

  • Nei punti in cui si desidera chiamare Module1, non si dispone di un oggetto Configuration disponibile e si possono fornire valori per le proprietà pertinenti ma non tutte le proprietà. (Questo è un motivo valido se sei sicuro che le versioni future non utilizzeranno più proprietà.)

Quindi, in realtà dipende da come prevedi che il metodo possa cambiare in futuro e da quanto sia pesante cambiare i siti di chiamata se la firma cambia.

    
risposta data 14.06.2012 - 21:13
fonte
1

Potresti prendere in considerazione l'utilizzo di un'interfaccia per il tuo parametro stesso. L'oggetto di configurazione implementerà l'interfaccia, ma l'interfaccia dovrebbe includere solo le proprietà che è possibile utilizzare su questo metodo.

Lo chiamiamo usando interfacce di ruolo ed è una parte importante del principio di segregazione dell'interfaccia . Significa che quando l'oggetto di configurazione cambia, puoi scegliere a quale proprietà questo particolare metodo è interessato e aggiungere tali proprietà all'interfaccia. Non è richiesto alcun ulteriore refactoring. E non hai ancora l'odore del codice di aver passato molte informazioni che non ti servono.

    
risposta data 14.06.2012 - 21:26
fonte
0

Ho trovato più semplice rendere statici gli oggetti di configurazione. In questo modo, non devi passarli in giro.

L'assunto dietro static è che hai una singola configurazione per ogni processo. Per me, finora, questa ipotesi vale.

    
risposta data 14.06.2012 - 20:31
fonte

Leggi altre domande sui tag