단언은 현실에서 살아남지 못한다
일반적으로 어설 션은 실제 데이터와의 접촉에서 살아남지 않습니다. 처리하려는 데이터와 범위를 벗어난 데이터를 결정하는 것은 소프트웨어 엔지니어링 프로세스의 일부입니다.
주기적 패밀리 그래프
가족 "나무"(실제로 사이클을 포함하여 전체 그래프가 표시됨)와 관련하여 멋진 일화가 있습니다.
딸이있는 미망인과 결혼했습니다. 우리를 자주 방문한 아버지는 의붓 딸과 사랑에 빠졌고 결혼했습니다. 그 결과 아버지는 아들이되었고 딸은 어머니가되었습니다. 얼마 후 나는 아내에게 아버지의 동생이었던 아들과 삼촌을 주었다. 아버지의 아내 (나의 딸이자 어머니이기도하다)는 아들을 얻었다. 결과적으로 나는 같은 사람에게 형제와 손자를 얻었습니다. 아내는 어머니의 어머니이기 때문에 이제 할머니입니다. 그래서 저는 아내의 남편이며 동시에 아내의 계부입니다. 다시 말해, 나는 내 할아버지입니다.
대리모 또는 "퍼지의 아버지"를 고려할 때 상황이 더욱 이상해 집니다.
그것을 다루는 방법
범위를 벗어난 것으로 사이클 정의
소프트웨어가 이러한 드문 경우를 처리하지 않도록 결정할 수 있습니다. 이러한 경우에는 다른 제품을 사용해야합니다. 더 많은 어설 션과 더 간단한 데이터 모델을 유지할 수 있기 때문에보다 일반적인 경우를 훨씬 더 강력하게 처리 할 수 있습니다.
이 경우 소프트웨어에 좋은 가져 오기 및 내보내기 기능을 추가하여 필요한 경우 사용자가 다른 제품으로 쉽게 마이그레이션 할 수 있습니다.
수동 관계 허용
사용자가 수동 관계를 추가하도록 허용 할 수 있습니다. 이러한 관계는 "일등 시민"이 아닙니다. 즉, 소프트웨어는 그대로 가져 와서 확인하지 않고 주 데이터 모델에서 처리하지 않습니다.
사용자는 손으로 드문 경우를 처리 할 수 있습니다. 데이터 모델은 여전히 단순하게 유지되며 어설 션은 유지됩니다.
수동 관계에주의하십시오. 그것들을 완전히 구성 할 수있게하려는 유혹이있어 완전히 구성 가능한 데이터 모델을 만듭니다. 작동하지 않습니다. 소프트웨어가 확장되지 않고 이상한 버그가 발생하여 사용자 인터페이스를 사용할 수 없게됩니다. 이 안티 패턴을 "소프트 코딩" 이라고하며 " 일일 WTF" 는 그에 대한 예제로 가득합니다.
데이터 모델을보다 유연하게 만들고 어설 션을 건너 뛰고 변형을 테스트하십시오.
마지막 수단은 데이터 모델을보다 유연하게 만드는 것입니다. 거의 모든 어설 션을 건너 뛰고 데이터 모델을 완전한 그래프를 기반으로해야합니다. 위의 예에서 알 수 있듯이 할아버지가 될 수 있으므로 사이클을 할 수도 있습니다.
이 경우 소프트웨어를 광범위하게 테스트해야합니다. 거의 모든 어설 션을 건너 뛰어야하므로 추가 버그가 발생할 가능성이 높습니다.
테스트 데이터 생성기를 사용하여 비정상적인 테스트 사례를 확인하십시오. Haskell , Erlang 또는 C에 대한 빠른 검사 라이브러리가 있습니다 . Java / Scala의 경우 ScalaCheck 와 Nyaya가 있습니다. 한 가지 테스트 아이디어는 무작위 모집단을 시뮬레이션하고 무작위로 상호 간섭 한 다음 소프트웨어가 먼저 가져오고 결과를 내보내도록하는 것입니다. 출력의 모든 연결도 입력 및 그 반대가 될 것으로 예상됩니다.
속성이 동일하게 유지되는 경우를 불변이라고합니다. 이 경우, 불변은 모의 모집단의 개인들 사이의 "로맨틱 한 관계"의 집합입니다. 가능한 많은 불변량을 찾고 무작위로 생성 된 데이터로 테스트하십시오. 변형은 기능적 일 수 있습니다. 예 :
- "로맨틱 한 관계"를 더 추가해도 삼촌은 삼촌을 유지합니다
- 모든 어린이에게는 부모가 있습니다
- 두 세대를 가진 인구는 적어도 하나의 조부모가
또는 그들은 기술적 인 것일 수 있습니다 :
- 소프트웨어는 상호 연결 수에 관계없이 최대 100 억 명의 그래프에서 충돌하지 않습니다.
- 소프트웨어는 O (node-of-nodes) 및 O (edge-of-edges ^ 2)로 확장됩니다.
- 귀하의 소프트웨어는 모든 가족 그래프를 최대 100 억 명의 회원으로 저장하고 다시로드 할 수 있습니다
시뮬레이션 된 테스트를 실행하면 이상한 코너 사례가 많이 발견됩니다. 문제를 해결하는 데 많은 시간이 걸립니다. 또한 많은 최적화가 손실되고 소프트웨어가 훨씬 느리게 실행됩니다. 가치가 있는지, 이것이 소프트웨어 범위에 있는지 결정해야합니다.