Dipende e cerco di discuterne usando un esempio più realistico.
Ad esempio, supponiamo di avere un oggetto Person
con attributi come FirstName
, Surname
, NameAffix
, DateOfBirth
, Gender
. E stai per creare alcuni metodi per elaborare quei dati (ad esempio, per un rapporto formattato).
Per prima cosa, pensiamo a un metodo GetFullPersonNameFormatted
, che dovrebbe restituire una combinazione di FirstName
, Surname
e NameAffix
in una stringa specificatamente formattata (supponiamo che non abbia senso mettere il metodo direttamente in la classe Person
per alcuni motivi). Passerai gli attributi uno alla volta o l'intero oggetto Person
? Beh, probabilmente passerei l'oggetto Person
a un intero, poiché questo metodo crea un'astrazione sulle persone, e se la persona cambia internamente, voglio solo cambiare GetFullPersonNameFormatted
internamente, non il codice chiamante.
Ora pensiamo a un metodo GetDateOfBirthFormatted
, dovrebbe restituire la data di nascita in un modo specificamente formattato. Passerai l'attributo o l'intero oggetto Persona? Probabilmente inizierei con un metodo più generale FormatDate(date)
, non specifico per Persone, che sarebbe molto più riutilizzabile di un metodo GetDateOfBirthFormatted(person)
, ma potrebbe anche avere senso avere un ulteriore
string GetDateOfBirthFormatted(Person person)
{
return FormatDate(person.DateOfBirth);
}
metodo per lo stesso motivo del primo esempio: creare un'astrazione sulle persone. Se hai davvero bisogno di quel metodo, dipende (per esempio, se ci sarebbe solo una chiamata a GetDateOfBirthFormatted
nell'intero programma, potresti evitare di creare quel metodo e usare invece FormatDate(person.DateOfBirth)
invece.
Quindi la risposta per "dovrebbe il tuo metodo prendere l'intero oggetto o no?" dipende principalmente da "quanto ha bisogno il tuo metodo da quell'oggetto?", ma anche da "che tipo di astrazione creerai?". Un grande indicatore per utilizzare meglio gli oggetti è quando ci sono molti metodi per ottenere lo stesso gruppo di attributi più e più volte, ad esempio, quando si passa FirstName
, Surname
, NameAffix
in diversi metodi. Questo può anche essere un indicatore che questi attributi appartengono a una classe appena creata (pensate a un programma in cui non avete una classe Person finora: metodi come quello potrebbero essere un indicatore che dovresti crearne uno).
Ci può essere un'altra ragione non per passare oggetti, ma solo attributi: disaccoppiamento. Diciamo che GetFullPersonNameFormatted
è nel modulo A, e la definizione di classe di Person
è nel modulo B, e la chiamata a GetFullPersonNameFormatted
è nel modulo C che fa riferimento a A e B. Se non vuoi fare riferimento a B da A, per mantenere questi due moduli completamente indipendenti l'uno dall'altro, è necessario definire GetFullPersonNameFormatted
senza alcun parametro Person
.
Riassumendo: non è sempre una semplice decisione in bianco e nero, e ci sono diverse sfumature di grigio.