Твердження не переживають реальності
Зазвичай твердження не переживають контакту з реальними даними світу. Це частина процесу інженерії програмного забезпечення, щоб вирішити, з якими даними ви хочете мати справу та з якими виходять за межі сфери.
Циклічні сімейні графіки
Щодо родинних "дерев" (насправді це повноцінні графіки, включаючи цикли), є приємний анекдот:
Я одружився з вдовою, яка мала дорослу дочку. Мій батько, який часто бував у нас, закохався в мою вітчима і одружився з нею. В результаті батько став моїм сином, а моя дочка стала моєю мамою. Через деякий час я дав дружині сина, який був братом мого батька, і дядька. Дружина мого батька (яка теж моя дочка і моя мама) отримала сина. В результаті я отримав брата та онука в одній людині. Моя дружина зараз моя бабуся, бо вона є мамою моєї матері. Отже, я чоловік своєї дружини, і одночасно пасинок моєї дружини. Іншими словами, я власний дідусь.
Все стає ще більш дивним, коли ти береш сурогати чи "нечітке батьківство".
Як з цим боротися
Визначте цикли як поза рамки
Ви можете вирішити, що ваше програмне забезпечення не має стосуватися таких рідкісних випадків. Якщо такий випадок трапляється, користувач повинен використовувати інший продукт. Це робить розгляд більш поширених випадків набагато більш надійним, оскільки ви можете зберегти більше тверджень і простішу модель даних.
У цьому випадку додайте до свого програмного забезпечення кілька хороших функцій імпорту та експорту, щоб користувач міг легко перейти до іншого продукту, коли це необхідно.
Дозволити ручні відносини
Ви можете дозволити користувачеві додавати відносини вручну. Ці відносини не є "першокласними громадянами", тобто програмне забезпечення приймає їх такими, які є, не перевіряє їх і не обробляє їх у головній моделі даних.
Потім користувач може обробляти рідкісні випадки вручну. Ваша модель даних залишатиметься досить простою, і ваші твердження збережуться.
Будьте обережні з ручними відносинами. Існує спокуса зробити їх повністю настроюваними, а отже, створити повністю настроювану модель даних. Це не буде працювати: Ваше програмне забезпечення не буде масштабуватися, ви отримаєте дивні помилки, і нарешті користувальницький інтерфейс стане непридатним. Цей антидіапазон називається "м'яким кодуванням" , і "Щоденний WTF" є рядом прикладів для цього.
Зробіть свою модель даних гнучкішою, пропустіть твердження, тестуйте інваріанти
Останнє рішення дозволить зробити вашу модель даних гнучкішою. Вам доведеться пропустити майже всі твердження та базувати свою модель даних на повному роздутому графіку. Як показано в наведеному вище прикладі, бути власним дідом легко, тому ви навіть можете мати цикли.
У цьому випадку вам слід провести широку перевірку свого програмного забезпечення. Вам довелося пропустити майже всі твердження, тому є хороший шанс для додаткових помилок.
Використовуйте генератор тестових даних для перевірки незвичних тестових випадків. Є швидкі бібліотеки перевірки на Haskell , Erlang або C . Для Java / Scala є ScalaCheck і ньяя . Однією з ідей тесту було б імітувати випадкову сукупність, нехай вона навмання перетинається, а потім нехай ваше програмне забезпечення спочатку імпортує, а потім експортує результат. Сподівання було б, що всі з'єднання у виході також є у вхідному та зворотному вірші.
Випадок, коли властивість залишається однаковою, називається інваріантом. У цьому випадку інваріант - це сукупність "романтичних відносин" між індивідами в модельованій сукупності. Спробуйте знайти якомога більше інваріантів і протестуйте їх за допомогою випадкових даних. Інваріанти можуть бути функціональними, наприклад:
- дядько залишається дядьком, навіть коли ти додаєш ще "романтичні стосунки"
- у кожної дитини є батько
- населення з двома поколіннями має принаймні одного онука
Або вони можуть бути технічними:
- Ваше програмне забезпечення не вийде з ладу на графіку до 10 мільярдів членів (незалежно від кількості взаємозв'язків)
- Ваша програма масштабує з O (кількість вузлів) та O (число ребер ^ 2)
- Ваше програмне забезпечення може зберегти та повторно завантажити кожен графік сім'ї до 10 мільярдів членів
Запустивши імітовані тести, ви знайдете безліч дивних кутових справ. Виправлення їх займе багато часу. Також ви втратите багато оптимізацій, ваше програмне забезпечення буде працювати набагато повільніше. Ви повинні вирішити, чи варто це, і якщо це входить у сферу вашого програмного забезпечення.