Słusznie lub nie, jestem obecnie przekonany, że zawsze powinienem starać się, aby mój kod był jak najbardziej niezawodny, nawet jeśli oznacza to dodanie zbędnego kodu / czeków, o których wiem, że nie będą w tej chwili przydatne, ale one może być x ilość lat w dół linii.
Na przykład obecnie pracuję nad aplikacją mobilną, która zawiera ten fragment kodu:
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...
}
Patrząc konkretnie na drugą część, wiem, że jeśli pierwsza sekcja jest prawdziwa, to druga sekcja również będzie prawdziwa. Nie mogę wymyślić żadnego powodu, dla którego sekcja pierwsza byłaby fałszywa, a sekcja druga oceniała jako prawdę, co sprawia, że drugie if
zdanie jest zbędne.
Jednak w przyszłości może się zdarzyć, że to drugie if
stwierdzenie jest rzeczywiście potrzebne i ze znanego powodu.
Niektórzy ludzie mogą na to spojrzeć początkowo i myślą, że programuję z myślą o przyszłości, co oczywiście jest dobrą rzeczą. Znam jednak kilka przypadków, w których ten rodzaj kodu „ukrył” przede mną błędy. Oznacza to, że jeszcze dłużej zajęło mi ustalenie, dlaczego funkcja xyz
działa, abc
kiedy powinna def
.
Z drugiej strony istniało także wiele przypadków, w których ten rodzaj kodu znacznie, znacznie ułatwia ulepszanie kodu za pomocą nowych zachowań, ponieważ nie muszę wracać i zapewniać, że wszystkie odpowiednie kontrole są na miejscu.
Czy istnieją jakieś ogólne zasada-of-kciuk wytyczne dla tego rodzaju kodu? (Chciałbym również dowiedzieć się, czy byłoby to uważane za dobrą czy złą praktykę?)
Uwaga: Można to uznać za podobne do tego pytania, jednak w przeciwieństwie do tego pytania, chciałbym uzyskać odpowiedź, zakładając, że nie ma żadnych terminów.
TLDR: Czy powinienem posunąć się do dodawania zbędnego kodu, aby uczynić go potencjalnie bardziej niezawodnym w przyszłości?
if(rows.Count == 0)
to się nigdy nie wydarzy, możesz wtedy podnieść wyjątek - i sprawdź, dlaczego twoje założenie się nie spełniło.
rows
być zawsze zerowy? Nigdy nie ma dobrego powodu, przynajmniej w .NET, aby kolekcja była pusta. Puste , jasne, ale nie puste . Rzuciłbym wyjątek, jeśli rows
jest pusty, ponieważ oznacza to, że dzwoniący ma przerwę w logice.