Si consideri la seguente classemetodi di classe dovrebbe accettare parametri o proprietà della classe di uso
public class Class1
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult()
{
return A + B;
}
}
Per poter utilizzare GetComplexResult
, un consumatore di questa classe avrebbe dovuto sapere per impostare A
e B
prima di chiamare il metodo. Se GetComplexResult
accede a molte proprietà per calcolare il suo risultato, questo può portare a valori di ritorno errati se il consumatore non imposta prima tutte le proprietà appropriate. Così si potrebbe scrivere questa classe come questo, invece
public class Class2
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult(int a, int b)
{
return a + b;
}
}
In questo modo, un chiamante per GetComplexResult
è costretto a passare in tutti i valori richiesti, garantendo il valore di rendimento atteso è correttamente calcolato. Ma se ci sono molti valori richiesti, anche l'elenco dei parametri cresce e questo non sembra nemmeno un buon progetto. Sembra anche rompere il punto di incapsulare A
, B
e GetComplexResult
in una singola classe. Potrei anche essere tentato di rendere statico GetComplexResult
poiché non richiede un'istanza della classe per fare il suo lavoro. Non voglio andare in giro a fare un sacco di metodi statici.
Ci sono termini per descrivere questi 2 diversi modi di creare classi? Entrambi sembrano avere pro e contro - c'è qualcosa che non capisco che dovrebbe dirmi che un modo è migliore dell'altro? In che modo i test unitari influenzano questa scelta?
Provo sempre a chiamare getter invece di accedere direttamente ai membri e nel registro immetto un messaggio se restituisco un valore nullo. Usavo le asserzioni, ma poi abbiamo scoperto che alcuni dei nostri clienti eseguivano affermazioni abilitate in produzione (!). – TMN