Spesso mi ritrovo a chiedermi quali sono le migliori pratiche di programmazione applicate alla programmazione in solitario, poiché la maggior parte delle volte sono l'unico programmatore di un progetto. Ho appena iniziato a sperimentare con i Contratti di codice C # 4.0, e ho pensato di chiedere alla community quale utilità possono avere per un programmatore solista.
Ecco da dove vengo. Il più delle volte, quando incontro un'eccezione, significa che c'è un bug nel mio codice. Ci sono eccezioni definite (non è previsto il gioco di parole) a questo, come quando ho a che fare con qualcosa di esterno, come un file di testo, database o servizio, ma per la maggior parte, eccezioni significano I ha fatto qualcosa di sbagliato.
Segui questo semplice metodo:
public void MapEntity(PersonModel model, PersonEntity entity)
{
entity.Name = model.Name;
entity.Age = model.Age;
entity.Updated = DateTime.Now;
}
Se model
o entity
sono nulli, questo metodo genererà un NullReferenceException
.
Come unico consumatore del mio codice, so che non dovrei passare un riferimento null, ma se in qualche modo lo faccio, io voglio un'eccezione da lanciare, e io vuoi il debugger per saltare direttamente alla fonte dell'errore, così posso vedere cosa è successo.
Detto questo, potrei scrivere:
public void MapEntity(PersonModel model, PersonEntity entity)
{
Contract.Requires(model != null);
Contract.Requires(entity != null);
entity.Name = model.Name;
entity.Age = model.Age;
entity.Updated = DateTime.Now;
}
Questo ha il vantaggio di indicare esplicitamente (a me stesso) che i due argomenti non possono essere nulli. Tuttavia, è molto improbabile che farei questo errore (perché so come funziona il metodo). Inoltre, se capisco correttamente cosa fa Requires()
, il comportamento in fase di esecuzione se si incontra un argomento nullo sarebbe praticamente lo stesso. Quindi, non posso fare a meno di chiedermi, cosa ho ottenuto oltre a due linee di codice?
Come contrappunto, ecco un caso in cui vedo un valore definito nell'essere esplicito:
public User FindUser(string emailAddress)
{
if (string.IsNullOrWhiteSpace(emailAddress)) return null;
var users = DbContext.Users.Where(u => u.EmailAddress == emailAddress);
Contract.Assert(users.Count() <= 1,
"The database appears to be corrupted:
More than one user was found for the provided email address.
Email addresses are supposed to be unique.");
return users.SingleOrDefault();
}
Ma in questo caso, la ragione per cui vedo il valore nell'usare un contratto di codifica è indicare che qualcosa è andato storto che non è un bug di per sé (anche se potrebbe essere il risultato di un bug in un altro punto del sistema). / p>
Mi piacerebbe sapere se sono sulla strada giusta con il mio pensiero, o se c'è più valore nei contratti di codice di quanto mi rendo conto. Paga per utilizzare i contratti quando puoi esaminare e eseguire il debug del codice da solo o solo quando il codice verrà utilizzato da una terza parte?