Cofnijmy się i skorzystajmy z innego przykładu, który oblicza średnią arytmetyczną tablicy wartości.
Jeśli tablica wejściowa jest pusta (lub zerowa), czy możesz w uzasadniony sposób spełnić żądanie osoby dzwoniącej? Nie. Jakie masz opcje? Cóż, możesz:
- przedstawić / zwrócić / wyrzucić błąd. używając konwencji bazy kodu dla tej klasy błędów.
- dokument, że zostanie zwrócona wartość taka jak zero
- dokument, że wyznaczona niepoprawna wartość zostanie zwrócona (np. NaN)
- dokument, że zostanie zwrócona magiczna wartość (np. min. lub maks. dla danego typu lub jakaś wartość, która może być wskazująca)
- ogłosić, że wynik nie jest określony
- zadeklaruj, że akcja jest niezdefiniowana
- itp.
Mówię, że daj im błąd, jeśli podali ci nieprawidłowe dane wejściowe, a prośba nie może zostać zrealizowana. Mam na myśli poważny błąd od pierwszego dnia, aby zrozumieli wymagania twojego programu. W końcu twoja funkcja nie jest w stanie odpowiedzieć. Jeśli operacja może się nie powieść (np. Skopiować plik), wówczas Twój interfejs API powinien dać im błąd, z którym mogą sobie poradzić.
Dzięki temu można zdefiniować sposób obsługi źle sformułowanych żądań i żądań, które mogą się nie powieść.
Bardzo ważne jest, aby kod był spójny w zakresie obsługi tych klas błędów.
Kolejną kategorią jest decyzja, w jaki sposób Twoja biblioteka będzie obsługiwać nonsensowne żądania. Wracając do przykładu podobny do Ciebie - użyjmy funkcję, która określa, czy plik istnieje w ścieżce: bool FileExistsAtPath(String)
. Jeśli klient przekaże pusty ciąg, jak poradzić sobie z tym scenariuszem? Co powiesz na pustą lub zerową tablicę przekazaną void SaveDocuments(Array<Document>)
? Wybierz bibliotekę / bazę kodów i zachowaj spójność. Zdarza mi się brać pod uwagę te przypadki błędów i zabraniam klientom wysuwania bzdurnych żądań, oznaczając je jako błędy (poprzez asercję). Niektórzy ludzie zdecydowanie oprą się temu pomysłowi / działaniu. Uważam, że to wykrywanie błędów jest bardzo pomocne. Jest bardzo dobry do lokalizowania problemów w programach - z dobrą lokalizacją dla szkodliwego programu. Programy są znacznie bardziej przejrzyste i poprawne (rozważ ewolucję bazy kodu) i nie nagrywaj cykli w ramach funkcji, które nic nie robią. Kod jest mniejszy / czystszy w ten sposób, a kontrole są generalnie wypychane do miejsc, w których problem może zostać wprowadzony.