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.