Afirmações não sobrevivem à realidade
Normalmente, afirmações não sobrevivem ao contato com dados do mundo real. É parte do processo de engenharia de software decidir com quais dados você deseja lidar e quais estão fora do escopo.
Gráficos da família cíclica
Em relação às "árvores" da família (na verdade, são gráficos completos, incluindo ciclos), há uma boa anedota:
Casei-me com uma viúva que tinha uma filha crescida. Meu pai, que frequentemente nos visitava, se apaixonou por minha enteada e se casou com ela. Como resultado, meu pai se tornou meu filho e minha filha se tornou minha mãe. Algum tempo depois, dei à minha esposa um filho, que era irmão de meu pai e meu tio. A esposa do meu pai (que também é minha filha e minha mãe) teve um filho. Como resultado, eu tenho um irmão e um neto na mesma pessoa. Minha esposa agora é minha avó, porque ela é a mãe de minha mãe. Então, eu sou o marido da minha esposa e, ao mesmo tempo, o neto da minha esposa. Em outras palavras, eu sou meu próprio avô.
As coisas ficam ainda mais estranhas quando você leva em consideração os substitutos ou a "paternidade confusa".
Como lidar com isso
Definir ciclos como fora do escopo
Você pode decidir que seu software não deve lidar com casos tão raros. Se esse caso ocorrer, o usuário deve usar um produto diferente. Isso torna o tratamento dos casos mais comuns muito mais robusto, porque você pode manter mais asserções e um modelo de dados mais simples.
Nesse caso, adicione alguns bons recursos de importação e exportação ao seu software, para que o usuário possa migrar facilmente para um produto diferente quando necessário.
Permitir relações manuais
Você pode permitir que o usuário adicione relações manuais. Essas relações não são "cidadãos de primeira classe", ou seja, o software as aceita como estão, não as verifica e não as trata no modelo de dados principal.
O usuário pode então lidar com casos raros manualmente. Seu modelo de dados ainda permanecerá bastante simples e suas afirmações sobreviverão.
Tenha cuidado com as relações manuais. Existe uma tentação de torná-los completamente configuráveis e, portanto, criar um modelo de dados totalmente configurável. Isso não funcionará: seu software não será dimensionado, você receberá bugs estranhos e, finalmente, a interface do usuário ficará inutilizável. Esse anti-padrão é chamado de "codificação flexível" e "O diário WTF" está cheio de exemplos para isso.
Torne seu modelo de dados mais flexível, ignore asserções, teste invariáveis
O último recurso seria tornar seu modelo de dados mais flexível. Você precisaria pular quase todas as asserções e basear seu modelo de dados em um gráfico completo. Como mostra o exemplo acima, é facilmente possível ser seu próprio avô, assim você pode até ter ciclos.
Nesse caso, você deve testar extensivamente seu software. Você teve que pular quase todas as afirmações, para que haja uma boa chance de erros adicionais.
Use um gerador de dados de teste para verificar casos de teste incomuns. Há bibliotecas Verificação rápida para Haskell , Erlang ou C . Para Java / Scala, existem ScalaCheck e Nyaya . Uma idéia de teste seria simular uma população aleatória, deixá-la cruzar aleatoriamente, depois deixar o software primeiro importar e depois exportar o resultado. A expectativa seria que todas as conexões na saída também estivessem na entrada e vice-versa.
Um caso em que uma propriedade permanece a mesma é chamado de invariável. Nesse caso, o invariante é o conjunto de "relações românticas" entre os indivíduos na população simulada. Tente encontrar o máximo de invariantes possível e testá-los com dados gerados aleatoriamente. Invariantes podem ser funcionais, por exemplo:
- um tio permanece um tio, mesmo quando você adiciona mais "relações românticas"
- toda criança tem um pai
- uma população com duas gerações tem pelo menos um avô
Ou eles podem ser técnicos:
- Seu software não trava em um gráfico de até 10 bilhões de membros (não importa quantas interconexões)
- Seu software é dimensionado com O (número de nós) e O (número de arestas ^ 2)
- Seu software pode salvar e recarregar todos os gráficos da família até 10 bilhões de membros
Ao executar os testes simulados, você encontrará muitos casos de canto estranhos. Consertá-los levará muito tempo. Além disso, você perderá muitas otimizações, seu software será executado muito mais lentamente. Você precisa decidir se vale a pena e se isso está no escopo do seu software.