Утверждения не выживают в реальности
Обычно утверждения не выдерживают контакта с данными реального мира. Это часть процесса разработки программного обеспечения, чтобы решить, с какими данными вы хотите иметь дело, а какие выходят за рамки.
Циклические семейные графы
Что касается родословных "деревьев" (по сути, это полноценные графы, включая циклы), есть интересный анекдот:
Я женился на вдове, у которой была взрослая дочь. Мой отец, который часто навещал нас, влюбился в мою падчерицу и женился на ней. В результате отец стал моим сыном, а дочь - мамой. Некоторое время спустя я подарил жене сына, который приходился брату моему отцу и дяде. У жены моего отца (которая также является моей дочерью и моей матерью) родился сын. В результате у меня появились брат и внук в одном лице. Моя жена теперь моя бабушка, потому что она мама моей матери. Итак, я муж своей жены и одновременно сводный внук моей жены. Другими словами, я сам себе дедушка.
Все становится еще более странным, если принять во внимание суррогаты или «нечеткое отцовство».
Как с этим справиться
Определить циклы как выходящие за рамки
Вы можете решить, что ваше программное обеспечение не должно иметь дело с такими редкими случаями. В таком случае пользователь должен использовать другой продукт. Это делает работу с более распространенными случаями намного более надежной, потому что вы можете сохранить больше утверждений и более простую модель данных.
В этом случае добавьте в свое программное обеспечение несколько хороших функций импорта и экспорта, чтобы при необходимости пользователь мог легко перейти на другой продукт.
Разрешить ручные отношения
Вы можете разрешить пользователю добавлять вручную отношения. Эти отношения не являются «гражданами первого класса», т.е. программа принимает их как есть, не проверяет и не обрабатывает в основной модели данных.
Затем пользователь может обрабатывать редкие случаи вручную. Ваша модель данных останется довольно простой, а ваши утверждения останутся в силе.
Будьте осторожны с ручными отношениями. Есть соблазн сделать их полностью настраиваемыми и, следовательно, создать полностью настраиваемую модель данных. Это не сработает: ваше программное обеспечение не будет масштабироваться, вы будете получать странные ошибки, и, наконец, пользовательский интерфейс станет непригодным для использования. Этот анти-шаблон называется "мягким кодированием" и " Ежедневный WTF " полон примеров для этого.
Сделайте свою модель данных более гибкой, пропустите утверждения, тестируйте инварианты
Последнее средство - сделать вашу модель данных более гибкой. Вам придется пропустить почти все утверждения и построить модель данных на полном графике. Как показывает приведенный выше пример, вы легко можете быть собственным дедушкой, так что у вас даже могут быть циклы.
В этом случае вам следует тщательно протестировать свое программное обеспечение. Вам пришлось пропустить почти все утверждения, так что велика вероятность появления дополнительных ошибок.
Используйте генератор тестовых данных для проверки необычных тестовых случаев. Существуют библиотеки быстрой проверки для Haskell, Erlang или C. Для Java / Scala существуют ScalaCheck и Ньяя. Одна из идей тестирования - смоделировать случайную популяцию, позволить ей случайным образом скрещиваться, а затем позволить вашему программному обеспечению сначала импортировать, а затем экспортировать результат. Ожидается, что все соединения на выходе также будут на входе и наоборот.
Случай, когда свойство остается неизменным, называется инвариантом. В этом случае инвариантом является набор «романтических отношений» между особями моделируемой популяции. Постарайтесь найти как можно больше инвариантов и протестировать их на случайно сгенерированных данных. Инварианты могут быть функциональными, например:
- дядя остается дядей, даже если добавить еще «романтических отношений»
- у каждого ребенка есть родитель
- у населения с двумя поколениями есть хотя бы один дедушка
Или они могут быть техническими:
- Ваше программное обеспечение не выйдет из строя на графике до 10 миллиардов участников (независимо от количества соединений)
- Ваше программное обеспечение масштабируется с помощью O (количество узлов) и O (количество ребер ^ 2)
- Ваше программное обеспечение может сохранять и повторно загружать каждую семейную диаграмму до 10 миллиардов членов.
Запустив смоделированные тесты, вы обнаружите множество странных угловых случаев. На их исправление уйдет много времени. Также вы потеряете много оптимизаций, ваше программное обеспечение будет работать намного медленнее. Вы должны решить, стоит ли оно того и входит ли это в сферу применения вашего программного обеспечения.
person
stefan.schwetschke
schedule
26.01.2015