Ho diverse domande relative ai contratti di codice e alle best practice per il loro utilizzo. Diciamo che abbiamo una classe, con diverse proprietà (vedi sotto per esempio):Best practice del contratto di codice
class Class1
{
// Fields
private string _property1; //Required for usage
private List<object> _property2; //Not required for usage
// Properties
public string Property1
{
get
{
return this._property1;
}
set
{
Contract.Requires(value != null);
this._property1 = value;
}
}
public List<object> Property2
{
get
{
return this._property2;
}
set
{
Contract.Requires(value != null);
this._property2 = value;
}
}
public Class1(string property1, List<object> property2)
{
Contract.Requires(property1 != null);
Contract.Requires(property2 != null);
this.Property1 = property1;
this.Property2 = property2;
}
public Class1(string property1)
: this(property1, new List<object>())
{ }
}
Qualche spiegazione su ciò che voglio raggiungere:
(a) proprietà1 è un campo obbligatorio. property2 non è richiesto esplicitamente per l'utilizzo normale dell'oggetto.
Ho le seguenti domande:
Devo ancora perdere tempo con i contratti per Property2; perché property2 non è un campo obbligatorio, dovrebbe avere un contratto. Il collocamento di un contratto sulla proprietà2 indica che è in effetti richiesto per il normale utilizzo dell'oggetto;
Anche se la proprietà2 non è richiesta esplicitamente, non vi è alcuna ragione possibile per essere nullo, quindi il contratto definito al setter. Non definire il contratto sulla proprietà2 riduce i controlli nulli nel codice chiamante? Questo dovrebbe ridurre i bug e migliorare la manutenibilità del codice: questa supposizione è corretta?
Se è giusto, come faccio a garantire il codice di chiamata che proprietà2 non sarà mai nullo? Devo usare Contract.Invariant (property2! = Null); o Contract.Ensures (proprietà2! = null) nel costruttore, o Contract.Ensures (proprietà2! = null) in Init(), o Contract.Ensures (proprietà! = null) nel setter? (Ad esempio, se si utilizza Contract.Ensures (proprietà2! = null), dove viene inserito)?
Le mie scuse se le domande sembrano semplici. Sto solo cercando pensieri sull'argomento, e cosa voi considerate la migliore pratica.
Sono d'accordo con il contratto sulla proprietà 2, per le ragioni che hai elencato. –