Questo non è un elenco esaustivo, ma considera alcuni dei seguenti fattori quando decidi se un oggetto deve essere passato a un metodo come argomento:
L'oggetto è immutabile? La funzione è "pura"?
Effetti collaterali sono una considerazione importante per la manutenibilità del tuo codice. Quando vedi il codice con un sacco di oggetti stateful mutabili passati in giro dappertutto, quel codice è spesso meno intuitivo (nello stesso modo in cui le variabili di stato globali possono essere spesso meno intuitive), e il debug spesso diventa più difficile e veloce. consumando.
Come regola generale, mirare a garantire, per quanto ragionevolmente possibile, che qualsiasi oggetto che passi a un metodo sia chiaramente immutabile.
Evitare (di nuovo, per quanto ragionevolmente possibile) qualsiasi progetto in cui si prevede che lo stato di un argomento venga modificato come risultato di una chiamata di funzione - uno degli argomenti più forti per questo approccio è Principio di Least Astonishment ; Ad esempio, qualcuno che legge il tuo codice e vede un argomento passato in una funzione è "meno probabile" aspettarsi che il suo stato cambi dopo che la funzione è tornata.
Quanti argomenti ha già il metodo?
I metodi con elenchi di argomenti eccessivamente lunghi (anche se la maggior parte di questi argomenti ha valori "predefiniti") iniziano ad apparire come un odore di codice. A volte tali funzioni sono necessarie, tuttavia, e potresti prendere in considerazione la creazione di una classe il cui unico scopo è quello di agire come un Oggetto Parametro .
Questo approccio può comportare una piccola quantità di mapping di codici di piastre supplementari dal tuo oggetto "sorgente" al tuo oggetto parametro, ma questo è un costo piuttosto basso in termini di prestazioni e complessità, tuttavia, e ci sono una serie di vantaggi in termini di disaccoppiamento e immutabilità dell'oggetto.
L'oggetto passato appartiene esclusivamente a un "livello" all'interno dell'applicazione (ad esempio, un ViewModel o un'entità ORM?)
Pensa a Separation of Concerns (SoC) . A volte chiedersi se l'oggetto "appartiene" allo stesso livello o modulo in cui esiste il tuo metodo (ad esempio una libreria wrapper API rollata a mano o il tuo core business logic layer ecc.) Può informare se quell'oggetto dovrebbe essere realmente passato a quello metodo.
SoC è una buona base per scrivere codice pulito, liberamente accoppiato, modulare. ad esempio, un oggetto di entità ORM (mappatura tra il codice e lo schema del database) idealmente non dovrebbe essere distribuito nel tuo livello aziendale, o peggio nel tuo livello di presentazione / interfaccia utente.
Nel caso di passaggio di dati tra 'strati', i parametri di dati semplici passati in un metodo sono solitamente preferibili al passaggio in un oggetto dal livello 'errato'. Anche se è probabilmente una buona idea avere modelli separati che esistono al livello 'giusto' su cui invece puoi mappare.
La funzione stessa è troppo grande e / o complessa?
Quando una funzione ha bisogno di molti elementi di dati, potrebbe valere la pena considerare se quella funzione sta assumendo troppe responsabilità; cercare potenziali opportunità di refactoring utilizzando oggetti più piccoli e funzioni più brevi e più semplici.
La funzione dovrebbe essere un oggetto comando / query?
In alcuni casi la relazione tra i dati e la funzione potrebbe essere vicina; in questi casi, considera se un Oggetto Comando o un Oggetto Query sia appropriato.
L'aggiunta di un parametro oggetto a un metodo impone alla classe contenitore di adottare nuove dipendenze?
A volte l'argomento più strong per gli argomenti "Plain old data" è semplicemente che la classe ricevente è già ordinatamente autosufficiente, e l'aggiunta di un parametro oggetto a uno dei suoi metodi inquinerebbe la classe (o se la classe è già inquinata, quindi peggiorerà l'entropia esistente)
Hai veramente bisogno di passare attorno a un oggetto completo o hai solo bisogno di una piccola parte dell'interfaccia di quell'oggetto?
Considera il Principio di segregazione dell'interfaccia in relazione alle tue funzioni, ad esempio quando passi in un oggetto , dovrebbe dipendere solo da parti dell'interfaccia di quell'argomento di cui ha effettivamente bisogno la funzione.