Passa l'intero oggetto a un metodo o solo a parti?

4

Ho un oggetto che ha circa 50 proprietà, ma uno dei miei metodi usa solo circa 3 di queste proprietà. È ancora meglio passare l'intero oggetto o parti. Uno scenario sarebbe che stavo usando Dapper per interrogare un database per mappare i dati in un oggetto POCO, ma ho solo bisogno di alcune proprietà, quindi mi trovo di fronte a questi due scenari:

var car = db.Query<Car>("SELECT * FROM Car Where Id = @Id", new {Id}).FirstOrDefault();

Process(car);

o

var car = db.Query<car>("SELECT VIN, Year, Color FROM Car Where Id = @Id", new {Id}).FirstOrDefault();

Process(car.VIN, car.Year, car.Color);

Nel caso precedente, il fatto che io stia usando Dapper è importante? Conosco le meno proprietà che deve mappare al minor tempo necessario. Ma allo stesso tempo, riportando solo un insieme di proprietà, se ho bisogno di qualcos'altro, dovrò modificare la query o aggiungere un nuovo metodo per riportare quello che voglio.

    
posta xaisoft 01.04.2015 - 03:43
fonte

4 risposte

14

I have an object that has about 50 properties,

Ferma! Vai - proprio ora - e aggiustalo.

Di corso ti imbatterai in funzioni che usano solo parte del tuo oggetto, quando il tuo oggetto sta facendo tutto sotto il sole. Nessun oggetto ha bisogno di 50 proprietà indipendenti. Certamente alcuni di loro possono essere organizzati in sotto-oggetti. Quelli tre che la tua funzione richiede sono un buon candidato.

should I pass the whole object to a function or just parts?

Nel caso più generale, dipende . Le migliori pratiche dicono di passare proprio ciò di cui hai bisogno. Le migliori pratiche dicono anche di codificare un'interfaccia (in questo caso, la firma del metodo). Quindi questo è uno di quei casi in cui è necessario valutare le due migliori pratiche contro la probabilità che entrino in gioco.

Il metodo ha senso prendere tutto (dato che potresti usare altre parti in seguito)? Il metodo ha senso per le parti e non importa che provengano da fonti indipendenti?

E l'altra considerazione è simile al consiglio precedente: se ti trovi spesso a prendere i bit da un oggetto, è un segno che quei bit sono il loro stesso oggetto coesivo. Prendi in considerazione la possibilità di crearli come propri oggetti secondari o di dividere in altro modo le responsabilità per allinearsi meglio con il modo in cui stai effettivamente utilizzando il materiale.

Inoltre, questa risposta riguarda specificamente le funzioni. Se stai lavorando oltre i confini della comunicazione, spesso dovrai / ridurre le dimensioni dei dati. L'invio di 50 campi sul filo quando ne occorrono solo 3 è più problematico.

    
risposta data 01.04.2015 - 04:06
fonte
1

Sembra che tu abbia una buona conoscenza dei problemi coinvolti. Non so in modo specifico se Dapper fa la differenza nella tua strategia, ma in generale vuoi solo restituire i dati dal database di cui hai bisogno.

Dovrai modificare la tua query se hai bisogno di un'altra proprietà in futuro? Certo, e questo è il rovescio della medaglia di restituire solo ciò di cui hai bisogno. Se l'esclusione dei dati non utilizzati fa la differenza nella tua applicazione dipende in gran parte dalla scala. A livello di web, aziende come Twitter, Facebook e Google fanno di tutto per ottimizzare tutto, e l'esclusione dei dati non utilizzati da una query è un'ottimizzazione standard.

Come per la chiamata Process (), è meglio passare l'oggetto auto:

Process(car);

ma devi essere in grado di farlo con la query ottimizzata:

var car = db.Query<car>("SELECT VIN, Year, Color FROM Car Where Id = @Id", new {Id}).FirstOrDefault();

Quindi la firma del metodo non deve essere modificata. Quando hai bisogno di una nuova proprietà, devi solo aggiungerla alla stringa della query.

    
risposta data 01.04.2015 - 04:05
fonte
0

Invia l'oggetto al posto della proprietà! Valuterei quale campo usare nel callee piuttosto che dover cambiare 100 chiamate al metodo. Le proprietà interrotte non rappresentano un problema se il codice viene utilizzato e verificato in ogni momento. Se si inviano dati su un canale di comunicazione, potrebbe essere necessario fare altre considerazioni.

    
risposta data 30.05.2017 - 12:26
fonte
-4

Passa un intero oggetto, ma seleziona dal database solo i campi di cui hai veramente bisogno. Otterrai l'oggetto con tre proprietà piene e altre avranno le impostazioni predefinite. In questo modo sarà più semplice riempire altre proprietà con i dati semplicemente aggiungendo il nome del campo alla query, senza modificare la firma del metodo.

    
risposta data 01.04.2015 - 04:07
fonte

Leggi altre domande sui tag