Asercje nie przetrwają rzeczywistości
Zazwyczaj twierdzenia nie przetrwają kontaktu z danymi ze świata rzeczywistego. Decyzja o tym, z którymi danymi chcesz się zajmować, a które są poza zakresem, jest częścią procesu inżynierii oprogramowania.
Cykliczne wykresy rodzinne
Jeśli chodzi o rodzinne „drzewa” (w rzeczywistości są to pełne wykresy, w tym cykle), istnieje miła anegdota:
Poślubiłem wdowę, która miała dorosłą córkę. Mój ojciec, który często nas odwiedzał, zakochał się w mojej pasierbicy i poślubił ją. W rezultacie mój ojciec stał się moim synem, a moja córka stała się moją matką. Jakiś czas później dałem mojej żonie syna, który był bratem mojego ojca i mojego wuja. Żona mojego ojca (która jest również moją córką i matką) ma syna. W rezultacie mam brata i wnuka w tej samej osobie. Moja żona jest teraz moją babcią, ponieważ jest matką mojej matki. Jestem więc mężem mojej żony, a jednocześnie wnukiem mojej żony. Innymi słowy, jestem moim dziadkiem.
Sprawa staje się jeszcze bardziej dziwna, jeśli weźmie się pod uwagę surogaty lub „rozmyte ojcostwo”.
Jak sobie z tym poradzić
Zdefiniuj cykle jako poza zakresem
Możesz zdecydować, że twoje oprogramowanie nie powinno obsługiwać tak rzadkich przypadków. W takim przypadku użytkownik powinien użyć innego produktu. Dzięki temu radzenie sobie z najczęstszymi przypadkami jest znacznie bardziej niezawodne, ponieważ można zachować więcej asercji i prostszy model danych.
W takim przypadku dodaj do oprogramowania kilka dobrych funkcji importu i eksportu, aby w razie potrzeby użytkownik mógł łatwo migrować do innego produktu.
Zezwalaj na ręczne relacje
Możesz zezwolić użytkownikowi na dodanie relacji ręcznych. Relacje te nie są „pierwszorzędnymi obywatelami”, tzn. Oprogramowanie traktuje ich takimi, jakimi są, nie sprawdza ich i nie obsługuje ich w głównym modelu danych.
Użytkownik może następnie obsługiwać rzadkie przypadki ręcznie. Twój model danych nadal będzie dość prosty, a twoje twierdzenia przetrwają.
Uważaj na relacje manualne. Istnieje pokusa, aby uczynić je całkowicie konfigurowalnymi, a tym samym stworzyć w pełni konfigurowalny model danych. To nie zadziała: Twoje oprogramowanie nie skaluje się, dostaniesz dziwne błędy i ostatecznie interfejs użytkownika stanie się bezużyteczny. Ten anty-wzór nazywa się „miękkim kodowaniem” , a „Daily WTF” jest tego pełen.
Uelastycznij model danych, pomiń twierdzenia, testuj niezmienniki
Ostatnim rozwiązaniem byłoby uelastycznienie modelu danych. Będziesz musiał pominąć prawie wszystkie stwierdzenia i oprzeć swój model danych na w pełni rozwiniętym wykresie. Jak pokazuje powyższy przykład, łatwo jest być własnym dziadkiem, więc możesz nawet mieć cykle.
W takim przypadku powinieneś dokładnie przetestować swoje oprogramowanie. Trzeba było pominąć prawie wszystkie twierdzenia, więc jest spora szansa na dodatkowe błędy.
Użyj generatora danych testowych, aby sprawdzić nietypowe przypadki testowe. Istnieje szybki biblioteki wyboru dla Haskell , Erlang lub C . W Javie / Scali są ScalaCheck i Nyaya . Jednym z pomysłów testowych może być symulacja losowej populacji, niech krzyżuje się losowo, a następnie pozwól oprogramowaniu najpierw zaimportować, a następnie wyeksportować wynik. Oczekuje się, że wszystkie połączenia na wyjściu znajdują się również na wejściu i odwrotnie.
Przypadek, w którym właściwość pozostaje taka sama, nazywa się niezmiennikiem. W tym przypadku niezmiennikiem jest zestaw „romantycznych relacji” między osobami w symulowanej populacji. Spróbuj znaleźć jak najwięcej niezmienników i przetestuj je losowo generowanymi danymi. Niezmienniki mogą być funkcjonalne, np .:
- wujek pozostaje wujem, nawet jeśli dodasz więcej „romantycznych relacji”
- każde dziecko ma rodzica
- populacja z dwoma pokoleniami ma co najmniej jednego dziadka
Lub mogą być techniczne:
- Twoje oprogramowanie nie ulegnie awarii na wykresie do 10 miliardów członków (bez względu na liczbę połączeń)
- Twoje oprogramowanie skaluje się z O (liczba węzłów) i O (liczba krawędzi ^ 2)
- Twoje oprogramowanie może zapisać i ponownie załadować każdy wykres rodzinny do 10 miliardów członków
Uruchamiając symulowane testy, znajdziesz wiele dziwnych przypadków narożnych. Naprawienie ich zajmie dużo czasu. Ponadto stracisz wiele optymalizacji, twoje oprogramowanie będzie działało znacznie wolniej. Musisz zdecydować, czy warto i czy leży to w zakresie twojego oprogramowania.