가계도 소프트웨어의주기


1594

나는 일부 가계도 소프트웨어 (C ++ 및 Qt로 작성)의 개발자입니다. 고객 중 한 명이 버그 보고서를 우편으로 보낼 때까지 아무런 문제가 없었습니다. 문제는 고객이 자신의 딸과 함께 두 명의 자녀를 가지고 있기 때문에 오류로 인해 내 소프트웨어를 사용할 수 없다는 것입니다.

이러한 오류는 처리되는 패밀리 그래프에 대한 다양한 주장과 변형의 결과입니다 (예를 들어, 사이클을 걷고 난 후 프로그램은 X가 Y의 아버지와 할아버지가 될 수 없음을 나타냅니다).

모든 데이터 어설 션을 제거하지 않고 이러한 오류를 어떻게 해결할 수 있습니까?



30
가계도를 거꾸로 추적하면이 문제가 원하는 횟수보다 훨씬 자주 발생합니다. 트리 표현을 포기하는 것은 고통 스럽지만 궁극적으로는 더 정확할 것입니다.
Thomas

55
가능성이 낮은 것들에 대한 주장을 추가해서는 안되며 불가능한 것만 추가해야합니다. 주기는 가계도에서 불가능한 명백한 것입니다. 어떤 방법으로도 자신의 조상이 될 수는 없습니다. 이러한 다른 주장은 허위 일 뿐이므로 제거해야합니다.
pgod

44
이것은 애완 동물 사육의 세계에서 전혀 어리석은 질문이 아닙니다. 딸에게 아버지, 어머니에서 아들, 여동생, 손자, 조부모가 표준 기술이며 애완 동물 사육자는 가계도 소프트웨어가 필요합니다. "순종"내 ¤ % # &.
kaleissin 2016 년

31
첫 번째 사촌과 결혼 하는 것은 빅토리아 영국에서, 특히 상류층 사이에서 매우 흔했습니다 (가족 내에서 돈을 유지하는 훌륭한 방법이었습니다). 예를 들어 Charles Darwin은 첫 번째 사촌 Emma Wedgwood와 결혼했습니다. 모든 가계도 소프트웨어는 이와 같은 상황을 지원해야합니다.
rtperson

답변:


727

가계도가 무엇인지에 대한 근본적인 오해가있는 것 같습니다.

또한 포트폴리오에 가계도를 가지고있는 회사에서 일하고 있으며 비슷한 문제로 어려움을 겪고 있습니다.

우리의 경우, 그리고 귀하의 경우에도 문제 는 가정이 무엇인지에 대해 극도로 의견이 많은 GEDCOM 형식 에서 비롯된 것입니다. 그러나이 형식에는 가계도가 실제로 어떻게 보이는지에 대한 심각한 오해가 있습니다.

GEDCOM은 같은 성 관계, 근친상간 등과의 비 호환성 등과 같은 많은 문제를 가지고 있습니다. 실제 생활에서 당신이 상상하는 것보다 더 자주 발생합니다 (특히 1700-1800으로 되돌아 갈 때).

우리는 가계도를 실제 세계에서 일어나는 일 (예 : 출생, 결혼, 약혼, 노동 조합, 사망, 입양 등)로 모델링했습니다. 우리는 논리적으로 불가능한 것을 제외하고는 이것들에 제한을 두지 않습니다 (예를 들어, 자신의 부모가 될 수 없으며 관계에는 두 명의 개인이 필요합니다 ...)

검증의 부재는 우리에게보다 "실제적인"단순하고 유연한 솔루션을 제공합니다.

이 특정 경우에 대해서는 일반적으로 보유하지 않는 어설 션을 제거하는 것이 좋습니다.

문제를 표시하기 위해 (필요한) 동일한 노드를 필요한 횟수만큼 그리는 것이 좋습니다. 중 하나를 선택하면 모든 사본을 조명하여 복제를 암시합니다.


32
이것은 올바른 접근 방식처럼 보이며 더 복잡한 문제를 감지하기 위해 쉽게 확장 할 수 있습니다. 이벤트 사이의 "A가 B보다 먼저 발생했습니다"관계를 해결할 수 있습니다. 예를 들어, 사람이 관련된 다른 사건보다 먼저 태어났다는 것입니다. 이것은 유향 그래프입니다. 그런 다음 그래프에 사이클이 없는지 확인할 수 있습니다. StackOverflow 에서이 질문을 참조하십시오. 시간 여행이 발명 될 때까지 이것은 괜찮습니다.
Paul Harrison

41
@ paul-harrison 그것이 간단한 경우에만. 오래된 기록 (신규 기록)에는 날짜 불일치가 있습니다. 출생 전의 침례, 복수의 출생 기록 등 ... 공식적인 기록에는 어느 정도 시간 여행이 있습니다. 이 일치하지 않는 데이터를 허용합니다. 우리는 사용자가 중복 된 경우 응용 프로그램에서 "생명"으로 간주해야 할 사항을 표시 할 수 있습니다. 발견 된 타임 라인이 표시됩니다.
Bert Goethals

38
@ ben-voigt GEDCOM은 예수 그리스도 후기 성도 교회에서 만든 형식입니다. 이 명세서에는 결혼 (MARR)이 남성과 여성 사이에 있어야한다고 명시되어 있습니다. 동성 결혼이나 근친상간을 위해 ASSO 태그 (ASSOCIATES)를 사용해야하며, 우정이나 이웃을 나타내는 데에도 사용됩니다. 동성 결혼이이 규격 내에서 2 급 관계라는 것은 분명하다. 보다 중립적 인 사양은 남성 여성 관계를 요구하지 않습니다.
Bert Goethals

1
@Bert Goethals : GEDCOM을 동성 결혼을 지원하지 않는 특정 프로그램 (PAF, 레거시)과 혼동하고 있습니다. GEDCOM은 "0 @ F1 @ FAM / 1 HUSB @ I1 @ / 1 HUSB @ I2 @"와 같은 구성을 배제하지 않으므로 소프트웨어가 원하는 경우 동성 결혼을 지원합니다.
Pierre

1
@Pierre 실제로 시스템을 속일 수 있습니다. 이것은 5.5.1 문서에서 직접 나온 것입니다. "MARR {MARRIAGE} : = 남편과 아내로서 남녀의 가족 단위를 만드는 법적, 관습 또는 관습 적 사건." 보시다시피, 여기에서 동성 결혼은 없습니다. ( 홈페이지 .rootsweb.ancestry.com / ~ pmcbride / gedcom / 55gcappa.htm )
Bert Goethals

563

당신의 주장을 편히하십시오.

규칙을 변경하는 것이 아니라 데이터를 입력 할 때 실수를 발견하는 고객의 99.9 %에게 매우 도움이 될 것입니다.

대신, "관계를 추가 할 수 없음"오류에서 "추가로"추가 경고로 변경하십시오.


143
매우 드물게 발생하는 상황, 즉 사용자가 대개 실수로만 하는 상황 이 발생 하면 사용자에게 경고를 표시하는 것이 좋습니다. 좋은 피드백입니다. 그러나 그들이 경우 사용자가 앞서 가자 정말 확실히 그들이 원하는. 그래서 나는 이것이 어떻게 너트와 볼트에 들어 가지 않더라도 좋은 대답이라고 생각합니다.
thomasrutter

15
좋은 대답입니다! 이런 종류의 소프트웨어가 어떻게 "나는 내 할아버지 야"( youtube.com/watch?v=eYlJH81dSiw ) 상황을 어떻게 처리 할까 궁금합니다.
Zaur Nasibov

4
이것은 실제로 대답이 아닙니다. 왜냐하면 문제는 실제로 나무를 횡단하는 것에서 비롯된 것 같습니다. 그러나 좋은 제안입니다.
bdwakefield 2016 년

3
@bdwakefield : 문제는 "모든 데이터 어설 션을 제거하지 않고 이러한 오류를 어떻게 해결합니까?"였습니다. 나는 내가 대답했다고 생각합니다.
벤 Voigt

2
@Ben 어설 션의 용도에 따라 다릅니다. 무한 루프 나 치명적인 오류가 발생하지 않으면 어설 션 제거를 효과적으로 제안하는 것입니다. 그들이 잠재적 인 실수를 사용자에게 경고하기 위해 거기에 있다면, 당신의 대답은 좋은 것입니다.
rm999

224

가계도의 문제는 다음과 같습니다. 나무가 아닙니다. 이들은 비순환 그래프 또는 DAG로 보내집니다. 인간 생식 생물학의 원리를 올바르게 이해한다면 어떤 주기도 없을 것입니다.

내가 아는 한, 심지어 그리스도인들도 사촌들 사이의 결혼 (그리고 아이들)을 받아 들여 가계도를 가족 DAG로 바꿀 것입니다.

이야기의 교훈은 올바른 데이터 구조를 선택하는 것입니다.


7
시험 관내 및 성적 복제를 위해 1 또는 2 개의 최대 노드를 가리키는 모든 노드에 대한 추가 제한이 필요하다. 실생활에는 더 사실이지만 아버지 쪽에서 불확실한 후손에 대해 여러 개의 파선을 허용 할 수 있습니다 (어머니가 누구인지는 분명하지만 DNA 테스트만으로는 아버지가 누구인지를 확인할 수 있으며 오늘날에도 거의 이루어지지 않습니다). 또는 두 가지 모두 채택이 고려됩니다.
manixrock 2016 년

7
@ manixrock-이 질문은 드문 경우에 관한 것이므로 어머니가 누구인지 항상 명확하지는 않다고 주장하고 싶습니다. 입양, 버려진 아기, 대리모 등은 모두 문제를 복잡하게 만들 수 있습니다.
피터 Recore

9
반드시 비주기적인 것은 아닙니다. 남자 결혼 할머니.
Ed Ropple

13
할머니와 결혼하는 사람은 자신을 할아버지로 만들지 않고 사이클을 추가하지 않습니다. 자녀가있는 경우 순환되지 않은 정규 그래프 가장자리가됩니다.
exDM69

11
실제로는 두 개의 ADG입니다. 부모 그래프와 법적 관계 그래프가 있습니다. 일반적으로 동일하지만 둘 이상이 기대할 수 있습니다.
JSacksteder

115

수표의 기준이 될 사람을 고유하게 식별하는 가치가 있다고 생각합니다.

이것은 까다로운 것입니다. 구조를 나무로 유지하려고한다고 가정하면 다음과 같이 제안합니다.

이것을 가정하십시오 : A자신의 딸과 함께 아이들 이 있습니다.

A같은 프로그램에 자신을 추가 A하고 B. 아버지의 역할을 한 후에는 그것을 남자 친구라고 불러 봅시다.

is_same_for_out()프로그램의 출력 생성 부분에 B내부적으로 가는 모든 링크 A가 데이터를 표시 할 것임을 알려주 는 기능을 추가하십시오 .

이렇게하면 사용자에게 추가 작업이 필요하지만 IT를 구현하고 유지 관리하기가 비교적 쉽다고 생각합니다.

그에서 구축, 당신은 코드를 맞추지에서 일할 수 AB회피 불일치.

이 솔루션은 완벽하지는 않지만 첫 번째 방법입니다.


9
아마도 이러한 "프록시"노드가 실제로 적합한 솔루션 일 것입니다. 그러나 나는 사용자를 화나게하지 않고 어떻게 사용자 인터페이스에 넣을 수 있는지 전혀 모른다. 실제 사람들 (특히 고객)을 다루는 소프트웨어를 작성하는 것은 쉽지 않다고 말할 수 있습니다.
Partick Höse

6
B의 새로운 아들은 자신의 삼촌이 될 것입니다. 프로그램에 대한 전액 환불을 고려하겠습니다!
보 퍼슨

3
@ 윌 A : 그리고 그가 자신의 어머니임을 알고, 자신의 젊은 자아를 타임 에이전시로 모집합니까?
널 설정

2
한 시스템 내에서 데이터의 복제 (및 동기화)는 좋지 않습니다. 솔루션이 최적이 아니며 재검토되어야 함을 나타냅니다. 추가 (중복) 노드를 작성해야하는 경우이를 프록시로 표시하고 데이터 읽기 및 쓰기를 원래 노드에 위임하십시오.
Bert Goethals

84

소프트웨어의 가치를 높이는 데 중점 을 두어야합니다 . 라이센스 가격에 가치가있는 한 명의 소비자를 위해 시간을 소비합니까? 아마 아닐 것입니다.

이 고객에게 사과하고 자신의 상황이 소프트웨어 범위를 벗어났다고 말하고 환불을 요청하는 것이 좋습니다.


3
매우 사실입니다. 그러나 다른 사람들이 제기 한 비슷한 문제로 다른 잠재적 인 문제를 평가합니다.
Falken 교수 계약은

2
물론이야. 그 이유는 중요하지 않은 응용 프로그램에서 드문 경우라면 아무것도 고치거나 구현할 필요가 없습니다. 그것이 실제로 사용자에게 해를 끼친다면, 그 일에 가치가 있습니다.
christopheml 2016 년

10
아마 모든 사람이 조상의 어딘가 근친상간이있을 수 있습니다. 가족 역사를 깊이 파헤 치면 그 충격에 부딪치게됩니다.
datenwolf

1
이상한 상황 (계급, Fritzl 등)의 계보 트리를 만드는 것은 소프트웨어의 유효한 사용입니다.
Bulwersator

1
두 번째 사촌과 결혼 할 수없는 가계도 소프트웨어는 쓸모가 없습니다. 거의 모든 가족이이 중 하나의 사례를 가지고 있습니다. 그렇기 때문에 원래 예제가 효과를 발휘한다고 생각합니다.
Fuzzy76

79

당신은 설정해야 Atreides의 (중, 현대 가족 모래 언덕 , 또는 고대, 오이디푸스 렉스 테스트 케이스 등을). 위생 처리 된 데이터를 테스트 사례로 사용하여 버그를 찾을 수 없습니다.


2
안타깝게도 너무 많은 사람들이 시스템을 망가 뜨리는 최첨단 사례 대신 '확인'데이터를 먼저 생각합니다.
sjas

59

이것이 "Go"와 같은 언어에 어설 션이없는 이유 중 하나입니다. 그것들은 당신이 아마 생각하지 않은 경우를 너무 자주 처리하는 데 사용됩니다. 당신은 단순히 불가능한 것이 아니라 불가능한 것을 주장해야합니다 . 후자를하는 것은 주장에 나쁜 평판을주는 것입니다. 사용자가 입력 할 때마다 assert(10 분을 위해 도보 거리에 정말 생각해보십시오.

특히 혼란스러운 경우에는 그러한 주장이 드물지만 가능한 상황에서 가짜가 될 수 있습니다. 따라서 "이 소프트웨어는 제시 한 시나리오를 처리하도록 설계되지 않았습니다"라고 말하는 경우에만 앱에서 처리하십시오.

당신의 위대하고 위대하신 할아버지가 아버지가 될 수 없다고 주장하는 것은 합리적인 일입니다.

소프트웨어 테스트를 위해 고용 된 테스트 회사에서 일하고 있다면 물론 그 시나리오를 제시했을 것입니다. 왜? 모든 청소년이지만 지능적인 '사용자'는 정확히 동일한 작업 을 수행 하고 결과 '버그 보고서'를 좋아합니다.


5
'어설 션을 사용할 때'인수에 동의하십시오. '어떤 언어에는 주장이 있지만 Go는 그렇지 않습니다.'와 어떻게 관련이 있는지 모릅니다.
phooji

2
@Red Hue-때때로 컴파일러는 불가능한 것을 가능하게합니다. gcc의 일부 버전은 abs () 구현에서 -10 == 10으로 생각합니다.
Tim Post

2
@Red Hue : 주장의 요점은 항상 참 (또는 거짓)이어야하는 조건을 문서화하고 테스트하는 것입니다. 그것은 당신과 다른 사람들이 불가능한 상황이 발생하는 방식으로 물건을 "고정"하는 것을 방지하는 데 도움이됩니다. "불가능한"사건이 나타나는 정당한 이유가 있다면 너무 많이 주장한 것입니다.
cHao

1
@cHao @Tim Post 저는 어설 션이없는 것이 왜 좋은지 이해하려고 노력하고 있습니다.
Arlen

5
어설 션 (또는 어설 션과 유사한 코드)은 관련이 없습니다. Go와 같은 언어로 된 코드는 데이터 구조에 대해 가정 할 수 있으며 가정 할 것입니다. 단언으로 이러한 가정을 문서화하고 시행 할 수는 없습니다. 결론 : 응용 프로그램에 버그가 있습니다.
Tommy McGuire 2016 년

41

나는 그런 혼란스러운 상황에 대해 언급하는 것을 싫어하지만 모든 불변량을 재조정하지 않는 가장 쉬운 방법은 근친상간 아빠에게 프록시 역할을하는 팬텀 버텍스를 그래프에 만드는 것입니다.


37

그래서 패밀리 트리 소프트웨어에 대한 작업을 수행했습니다. 당신이 해결하려고하는 문제는 무한 루프에 빠지지 않고 나무를 걸을 수 있어야한다는 것입니다. 즉, 나무는 비 주기적이어야합니다.

그러나 사람과 조상 중 하나 사이에 경로가 하나만 있다고 주장하는 것처럼 보입니다. 그러면 사이클이 없지만 너무 엄격합니다. 생물학적으로 말하면, 자손은 방향성 비순환 그래프입니다. DAG ( )입니다. 당신이 가지고있는 경우는 분명히 퇴화 된 경우이지만, 그 유형의 일은 항상 큰 나무에서 발생합니다.

예를 들어, n 세대에있는 2 ^ n 조상을 보면, 중복이 없다면, AD 1000 년에 살아있는 사람보다 조상이 더 많습니다. 따라서 겹치게됩니다.

그러나 데이터가 잘못되었거나 유효하지 않은주기를 얻는 경향이 있습니다. 트리를 순회하는 경우주기를 처리해야합니다. 각 개별 알고리즘 또는로드시이를 수행 할 수 있습니다. 나는 그것을로드했다.

트리에서 실제주기를 찾는 것은 몇 가지 방법으로 수행 할 수 있습니다. 잘못된 방법은 주어진 개인의 모든 조상을 표시하고 순회 할 때 다음 단계로 넘어갈 사람이 이미 표시되어 있으면 링크를 자릅니다. 이것은 잠재적으로 정확한 관계를 끊을 것입니다. 올바른 방법은 각 개인부터 시작하여 각 조상에게 해당 개인의 경로를 표시하는 것입니다. 새 경로에 현재 경로가 하위 경로로 포함되어 있으면 순환 경로이므로 끊어야합니다. 경로를 벡터 <bool> (MFMF, MFFFMF 등)로 저장할 수 있으므로 비교 및 ​​저장 속도가 매우 빠릅니다.

두 개의 이터레이터를 보내거나 서브셋 테스트와 충돌하는지 확인하는 등 사이클을 감지하는 몇 가지 다른 방법이 있지만 로컬 스토리지 방법을 사용했습니다.

또한 실제로 링크를 끊을 필요는 없으며 일반 링크에서 '약한'링크로 변경하면됩니다.이 링크는 일부 알고리즘이 따르지 않습니다. 또한 약한 것으로 표시 할 링크를 선택할 때주의를 기울여야합니다. 생년월일 정보를보고주기가 중단되는 위치를 파악할 수있는 경우도 있지만 너무 많은 데이터가 없어서 아무것도 파악할 수없는 경우가 있습니다.


이러한 가정에주의하십시오. 사람들이 적응할 때 남성 하나 개는 여성의 부모는 주어진이 아니거나 가까운 장래에, 부모 스스로 생각 lesibans 그들은 심지어 정말 할 수있을 여자의이어야 생물학적 부모. 그 문제에 대해, 우리가 인간에게 돌리를 적용한다면, "사람이 두 명의 별개의 부모를 가졌다"는 가정조차 나오지 않습니다.
Agrajag

1
@Agrajag, 그렇기 때문에 사이클 감지에 "생물학적으로 말하기"를 지정했습니다. 생물학적으로도 대리모 및 인공 수정과 같은 가능한 문제가 많이 있습니다. 부모를 정의하기 위해 입양과 다른 비 생물학적 방법을 허용한다면, 나무에서 유효한 진정한주기를 가질 수 있습니다. 예를 들어 누군가는 나이가 들어 조부모를 입양하고 더 이상 스스로 돌볼 수 없을 수도 있습니다. . 사람들의 가정 생활에 대한 가정은 항상 복잡합니다. 그러나 소프트웨어를 작성할 때 몇 가지 가정을해야합니다.
tfinniga

36

바보 같은 질문에 대한 또 다른 모의 심각한 답변 :

실제 답변은 적절한 데이터 구조를 사용하는 것입니다. 인간 계보는주기가없는 순수한 나무를 사용하여 완전히 표현할 수 없습니다. 어떤 종류의 그래프를 사용해야합니다. 또한, 인류 학자와 대화하기 전에 "서부 가부장제 일부일처 제 결혼"의 가장 간단한 경우에도 계보를 모델링하려고 할 때 비슷한 오류가 발생할 수 있기 때문에 다른 더 많은 장소가 있기 때문입니다.

여기서 논의한 바와 같이 로컬 금기 관계를 무시하고 싶더라도 가계도에주기를 도입하는 완전히 합법적이고 완전히 예기치 않은 방법이 많이 있습니다.

예를 들면 다음과 같습니다. http://en.wikipedia.org/wiki/Cousin_marriage

기본적으로, 사촌 결혼은 흔하고 예상되는 것이 아니라, 인간이 수천 명의 소규모 가족 그룹에서 전 세계 60 억 인구로 이동 한 이유입니다. 다른 방법으로는 작동하지 않습니다.

계보, 가족 및 계보에 관해서는 보편적 인 요소가 거의 없습니다. 이모가 될 수있는 사람, 또는 누가 상속을 목적으로 합법화되는지, 누가 이모가 될 수 있는지를 제시하는 규범에 대한 거의 모든 가정은 세계 또는 역사의 어느 곳에서 예외로 인해 화를 낼 수 있습니다.


9
당신의 의견으로 일부 다처제를 생각하게되었습니다. 유성 생식만을 모델링하는 계보 소프트웨어는 정자와 난자에 붙어있는 이름이 필요할 수 있지만 가족 구조의 더 넓은 정의는 필요하지 않습니다.
Steve Kalemkiewicz 2016 년

계보 소프트웨어는 종종 모델에서 둘 이상의 배우자를 허용합니다. 뷰에서 모델을 표시하는 방법은 제공된 "모드"에 따라 하나의 프로그램 내에서도 크게 다릅니다.
토드 홉 킨슨

20

잠재적 인 법적 영향을 제외하고는 노드가 유일한 사람이 될 수 있다고 가정하기보다는 가계도의 '노드'를 선행 인물로 취급해야 할 것 같습니다.

트리 노드에 후임자와 함께 사람이 포함되도록하고 다른 후임자가있는 동일한 사람을 포함하는 트리 아래에 다른 노드를 가질 수 있습니다.


13

몇 가지 답변은 어설 션 / 불변을 유지하는 방법을 보여 주었지만 이것은 어설 션 / 불변을 오용하는 것처럼 보입니다. 주장은 진실해야하는 것이 사실인지 확인하는 것이며, 변하지 않는 것은 변하지 않아야합니다.

여기서 당신이 주장하는 것은 근친상간 관계가 존재하지 않는다는 것입니다. 분명히 그들은 어떻게 당신의 주장이 잘못 그래서 존재한다. 이 어설 션을 해결할 수 있지만 실제 버그는 어설 션 자체에 있습니다. 어설 션을 제거해야합니다.



5

계보 데이터는 주기적이며 비 주기적 그래프에 맞지 않으므로주기에 대한 어설 션이있는 경우이를 제거해야합니다.

사용자 정의보기를 작성하지 않고보기에서이를 처리하는 방법은 순환 상위를 "고스트"상위로 취급하는 것입니다. 즉, 사람이 같은 사람의 아버지이자 할아버지 인 경우 할아버지 노드는 정상적으로 표시되지만 아버지 노드는 다음과 같은 간단한 레이블이있는 "유령"노드로 렌더링됩니다 ( "할아버지"참조). ) 할아버지를 가리 킵니다.

계산을 수행하려면주기가있는 경우 노드가 두 번 이상 방문되지 않도록 주기적 그래프를 처리하는 논리를 개선해야 할 수도 있습니다.


4

가장 중요한 것은 avoid creating a problem이므로 사이클을 피하기 위해 직접적인 관계사용해야 한다고 생각합니다 .

@markmywords가 말했듯이 #include "fritzl.h".

마침내 나는 말해야한다 recheck your data structure. 어쩌면 뭔가 잘못되었을 수도 있습니다 (양방향 연결 목록으로 문제를 해결할 수 있습니다).


4

단언은 현실에서 살아남지 못한다

일반적으로 어설 션은 실제 데이터와의 접촉에서 살아남지 않습니다. 처리하려는 데이터와 범위를 벗어난 데이터를 결정하는 것은 소프트웨어 엔지니어링 프로세스의 일부입니다.

주기적 패밀리 그래프

가족 "나무"(실제로 사이클을 포함하여 전체 그래프가 표시됨)와 관련하여 멋진 일화가 있습니다.

딸이있는 미망인과 결혼했습니다. 우리를 자주 방문한 아버지는 의붓 딸과 사랑에 빠졌고 결혼했습니다. 그 결과 아버지는 아들이되었고 딸은 어머니가되었습니다. 얼마 후 나는 아내에게 아버지의 동생이었던 아들과 삼촌을 주었다. 아버지의 아내 (나의 딸이자 어머니이기도하다)는 아들을 얻었다. 결과적으로 나는 같은 사람에게 형제와 손자를 얻었습니다. 아내는 어머니의 어머니이기 때문에 이제 할머니입니다. 그래서 저는 아내의 남편이며 동시에 아내의 계부입니다. 다시 말해, 나는 내 할아버지입니다.

대리모 또는 "퍼지의 아버지"를 고려할 때 상황이 더욱 이상해 집니다.

그것을 다루는 방법

범위를 벗어난 것으로 사이클 정의

소프트웨어가 이러한 드문 경우를 처리하지 않도록 결정할 수 있습니다. 이러한 경우에는 다른 제품을 사용해야합니다. 더 많은 어설 션과 더 간단한 데이터 모델을 유지할 수 있기 때문에보다 일반적인 경우를 훨씬 더 강력하게 처리 할 수 ​​있습니다.

이 경우 소프트웨어에 좋은 가져 오기 및 내보내기 기능을 추가하여 필요한 경우 사용자가 다른 제품으로 쉽게 마이그레이션 할 수 있습니다.

수동 관계 허용

사용자가 수동 관계를 추가하도록 허용 할 수 있습니다. 이러한 관계는 "일등 시민"이 아닙니다. 즉, 소프트웨어는 그대로 가져 와서 확인하지 않고 주 데이터 모델에서 처리하지 않습니다.

사용자는 손으로 드문 경우를 처리 할 수 ​​있습니다. 데이터 모델은 여전히 ​​단순하게 유지되며 어설 션은 유지됩니다.

수동 관계에주의하십시오. 그것들을 완전히 구성 할 수있게하려는 유혹이있어 완전히 구성 가능한 데이터 모델을 만듭니다. 작동하지 않습니다. 소프트웨어가 확장되지 않고 이상한 버그가 발생하여 사용자 인터페이스를 사용할 수 없게됩니다. 이 안티 패턴을 "소프트 코딩" 이라고하며 " 일일 WTF" 는 그에 대한 예제로 가득합니다.

데이터 모델을보다 유연하게 만들고 어설 션을 건너 뛰고 변형을 테스트하십시오.

마지막 수단은 데이터 모델을보다 유연하게 만드는 것입니다. 거의 모든 어설 션을 건너 뛰고 데이터 모델을 완전한 그래프를 기반으로해야합니다. 위의 예에서 알 수 있듯이 할아버지가 될 수 있으므로 사이클을 할 수도 있습니다.

이 경우 소프트웨어를 광범위하게 테스트해야합니다. 거의 모든 어설 션을 건너 뛰어야하므로 추가 버그가 발생할 가능성이 높습니다.

테스트 데이터 생성기를 사용하여 비정상적인 테스트 사례를 확인하십시오. Haskell , Erlang 또는 C에 대한 빠른 검사 라이브러리가 있습니다 . Java / Scala의 경우 ScalaCheckNyaya가 있습니다. 한 가지 테스트 아이디어는 무작위 모집단을 시뮬레이션하고 무작위로 상호 간섭 한 다음 소프트웨어가 먼저 가져오고 결과를 내보내도록하는 것입니다. 출력의 모든 연결도 입력 및 그 반대가 될 것으로 예상됩니다.

속성이 동일하게 유지되는 경우를 불변이라고합니다. 이 경우, 불변은 모의 모집단의 개인들 사이의 "로맨틱 한 관계"의 집합입니다. 가능한 많은 불변량을 찾고 무작위로 생성 된 데이터로 테스트하십시오. 변형은 기능적 일 수 있습니다. 예 :

  • "로맨틱 한 관계"를 더 추가해도 삼촌은 삼촌을 유지합니다
  • 모든 어린이에게는 부모가 있습니다
  • 두 세대를 가진 인구는 적어도 하나의 조부모가

또는 그들은 기술적 인 것일 수 있습니다 :

  • 소프트웨어는 상호 연결 수에 관계없이 최대 100 억 명의 그래프에서 충돌하지 않습니다.
  • 소프트웨어는 O (node-of-nodes) 및 O (edge-of-edges ^ 2)로 확장됩니다.
  • 귀하의 소프트웨어는 모든 가족 그래프를 최대 100 억 명의 회원으로 저장하고 다시로드 할 수 있습니다

시뮬레이션 된 테스트를 실행하면 이상한 코너 사례가 많이 발견됩니다. 문제를 해결하는 데 많은 시간이 걸립니다. 또한 많은 최적화가 손실되고 소프트웨어가 훨씬 느리게 실행됩니다. 가치가 있는지, 이것이 소프트웨어 범위에 있는지 결정해야합니다.


3

모든 어설 션을 제거하는 대신 여전히 부모 또는 다른 불가능한 상황에있는 사람이 있는지 확인하고 오류를 제시해야합니다. 가능하지 않은 경우 경고를 표시하여 사용자가 여전히 일반적인 입력 오류를 감지 할 수 있지만 모든 것이 올바른 경우 작동합니다.

데이터를 각 사람에 대한 영구 정수로 벡터에 저장하고 부모와 자식을 개인 객체에 저장합니다. 상기 int는 벡터의 인덱스입니다. 이것은 세대간에 매우 빠르지 만 이름 검색과 같은 경우에는 느립니다. 객체는 생성 된 순서대로 정렬됩니다.


-3

아버지를 복제하십시오 (또는 symlink / reference 사용).

예를 들어 계층 데이터베이스를 사용하는 경우 :

$ #each person node has two nodes representing its parents.
$ mkdir Family
$ mkdir Family/Son
$ mkdir Family/Son/Daughter
$ mkdir Family/Son/Father
$ mkdir Family/Son/Daughter/Father
$ ln -s Family/Son/Daughter/Father Family/Son/Father
$ mkdir Family/Son/Daughter/Wife
$ tree Family
Family
└── Son
    ├── Daughter
       ├── Father
       └── Wife
    └── Father -> Family/Son/Daughter/Father

4 directories, 1 file

3
ln -s명령은 그런 식으로 작동하지 않습니다; 링크의 해상도 는 명령 을 실행 한 위치가 아닌 링크가있는 위치 에서 Family/Son/Father찾습니다 . Family/Son/Daughter/FatherFamily/Son.ln -s
musiphil

48
복제는 제네바 협약에 의해 금지됩니다
MikeIsrael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.