Giustamente o erroneamente, al momento sono convinto che dovrei sempre provare a rendere il mio codice il più robusto possibile, anche se questo significa aggiungere codice / controlli ridondanti che so che non saranno utili in questo momento, ma loro potrebbe essere un numero di anni x lungo la linea.
Ad esempio, sto attualmente lavorando su un'applicazione mobile con questo pezzo di codice:
public static CalendarRow AssignAppointmentToRow(Appointment app, List<CalendarRow> rows)
{
//1. Is rows equal to null? - This will be the case if this is the first appointment.
if (rows == null) {
rows = new List<CalendarRow> ();
}
//2. Is rows empty? - This will be the case if this is the first appointment / some other unknown reason.
if(rows.Count == 0)
{
rows.Add (new CalendarRow (0));
rows [0].Appointments.Add (app);
}
//blah...
}
Guardando specificamente alla sezione due, so che se la sezione uno è vera, allora anche la sezione due sarà vera. Non riesco a pensare a nessun motivo per cui la sezione uno sarebbe falsa e la sezione due valuti vero, il che rende la seconda if
affermazione ridondante.
Tuttavia, in futuro potrebbe esserci un caso in cui questa seconda if
affermazione è effettivamente necessaria e per un motivo noto.
Alcune persone potrebbero guardarlo inizialmente e pensare che sto programmando pensando al futuro, il che è ovviamente una buona cosa. Ma conosco alcuni casi in cui questo tipo di codice mi ha "nascosto" bug. Significa che mi ci è voluto ancora di più per capire perché la funzione xyz
sta facendo abc
quando dovrebbe effettivamente farlo def
.
D'altra parte, ci sono stati anche numerosi casi in cui questo tipo di codice ha reso molto, molto più semplice migliorare il codice con nuovi comportamenti, perché non devo tornare indietro e assicurarmi che tutti i controlli pertinenti siano in atto.
Ci sono generale regola empirica linee guida per questo tipo di codice? (Sarei anche interessato a sapere se questo sarebbe considerato una buona o cattiva pratica?)
NB: Questo potrebbe essere considerato simile a questa domanda, tuttavia a differenza di quella domanda, vorrei una risposta supponendo che non ci siano scadenze.
TLDR: dovrei spingermi al punto di aggiungere codice ridondante per renderlo potenzialmente più robusto in futuro?
if(rows.Count == 0)
che non accadrà mai, allora potresti sollevare un'eccezione quando succede - e quindi verificare perché la tua ipotesi è sbagliata.
rows
mai sarebbe nullo? Non c'è mai una buona ragione, almeno in .NET, per rendere nulla una raccolta. Vuoto , sicuro, ma non nullo . Darei un'eccezione se rows
è nullo, perché significa che c'è un intervallo logico da parte del chiamante.