La decisione su quali parametri deve avere un costruttore è la stessa decisione che dovrebbe avere un parametro di una funzione arbitraria - dovrebbe avere esattamente i parametri necessari per creare uno specifico , idealmente facile da capire, < strong> astrazione . E se la tua astrazione di una macchina racchiude esattamente queste tre cose, la versione 2 riflette molto meglio della versione 1.
Nella prima versione, dovresti fornire il nome del proprietario e i ticket in modo diverso, probabilmente impostando tali proprietà in seguito. Ma se queste proprietà devono sempre essere fornite, è IMHO che un design migliore lo fa rispettare dai parametri del costruttore.
Una cosa di cui ti devi preoccupare è che il numero di parametri passati attraverso la funzione di costruzione non cresce fino al punto in cui il codice diventa difficile da capire. Ad esempio, quando hai molti più parametri per la tua auto come il venditore, il colore, il numero di posti, il numero di porte, la lista dei precedenti proprietari, la patente di guida necessaria per questo tipo di auto, e così via, non dovresti ovviamente passare tutti attraverso il costruttore (almeno, non uno per uno). Un approccio per gestire questo può essere per introdurre uno o più facciate di servizio . Un altro approccio potrebbe essere quello di aggiungere alcune proprietà (per cose che sono opzionali o potrebbero essere modificate in seguito, come descritto nella risposta di @ Stephen).
Per prendere una decisione che è la soluzione migliore, tuttavia, si devono considerare i parametri attuali e il loro significato, non è possibile prendere una decisione corretta solo su "numero e tipi" dei parametri. Presumo che il tuo esempio di "macchina" sia solo un segnaposto per qualcosa di diverso nel tuo programma reale, per cui la situazione potrebbe essere diversa, ma per discuterla in termini di un'auto: il nome del proprietario è tipicamente una proprietà del proprietario, non di l'auto, e l'elenco dei biglietti è AFAIK qualcosa associato al proprietario, anche. Pertanto, potresti prendere in considerazione l'introduzione di una classe Owner
per questo esempio, in cui il proprietario ha un nome e un elenco di ticket. Quindi questo porta a un costruttore
public Car(Owner owner, IEngine engine)
Tuttavia, tenendo conto del parere di Stephen, supponendo che il proprietario di un'automobile possa cambiare durante la vita di un oggetto auto, potrebbe essere davvero meglio attenersi alla versione originale 1, fornire un getter e un setter per il "corrente" proprietario "e implementa la tua funzione PrintOwnerName()
per quanto riguarda il fatto che il proprietario dell'auto potrebbe essere" sconosciuto "(che significa non inizializzato).