Dal punto di vista della struttura del linguaggio: a causa dell'ambito. I parametri passati a una funzione sono validi e accessibili solo all'interno di quella funzione. Le variabili di istanza sono valide e accessibili in ogni funzione.
Inoltre, per definizione i parametri di funzione vengono passati alla funzione da un chiamante. Quindi non risiedono nell'oggetto: risiedono nel chiamante. Devono necessariamente rappresentare due diverse aree fisiche nella memoria.
Suppongo che in linea di principio si possa avere una lingua in cui qualsiasi parametro in una funzione che ha lo stesso nome delle variabili oggetto viene copiato automaticamente prima che venga eseguita la prima riga della funzione. Il mio primo pensiero è che ciò potrebbe causare problemi, perché ci sono sicuramente momenti in cui non vorrai una copia così automatica. Potrebbero esserci test di validità che dovrebbero essere fatti prima di salvare qualsiasi dato. Potremmo voler verificare se un nuovo valore equivale al vecchio valore e quindi ad alcune registrazioni. Etc. Suppongo che qualcuno potrebbe rispondere che in tal caso si potrebbe semplicemente dare al parametro un nome diverso.
Per due o tre variabili, in genere lo vedo come un grosso problema. Sì, quando ci sono 15 variabili passate e tutte devono essere assegnate alla variabile oggetto corretta, è un dolore. Sarei interessato a vedere una lingua che aveva una funzione per farlo in modo pulito.
Francamente, quello che faccio di solito è creare l'oggetto e poi avere una serie di dichiarazioni di assegnazione. Come
myfoo=new Foo();
myfoo.bar=42;
myfoo.plugh="fwacbar";
... etc ...
Questo può essere più chiaro di avere una lunga stringa di valori nel costruttore, dove potrebbe non essere ovvio a quale variabile ogni valore va. (Soprattutto piccoli numeri interi e booleani.) È solo un po 'più di battitura a scrivere le istruzioni di assegnazione piuttosto che una lunga lista di parametri. Nel caso non raro in cui il costruttore viene chiamato una o due volte, potrebbe essere meno digitante, in quanto elimina l'elenco dei parametri e sposta semplicemente i compiti dal costruttore al chiamante.
Ovviamente ha lo svantaggio che funziona solo se tutti i valori sono assegnamenti semplici senza alcuna validazione o manipolazione. E in alcuni casi possiamo dire che un costruttore con tutti i valori produce un oggetto valido e utilizzabile; mentre questa tecnica significa che quasi certamente non lo fa, che alcuni considerano una violazione del contratto di costruzione.