Câu hỏi Chu kỳ trong phần mềm cây gia đình


Tôi là nhà phát triển phần mềm cây gia đình (viết bằng C ++ và Qt). Tôi không gặp vấn đề gì cho đến khi một trong những khách hàng của tôi gửi cho tôi một báo cáo lỗi. Vấn đề là khách hàng có hai con với con gái riêng của họ, và kết quả là, anh ta không thể sử dụng phần mềm của tôi vì lỗi.

Những lỗi đó là kết quả của các xác nhận và bất biến khác nhau của chúng tôi về biểu đồ gia đình đang được xử lý (ví dụ, sau khi đi bộ một chu kỳ, chương trình nói rằng X không thể là cả cha và ông của Y).

Làm thế nào tôi có thể giải quyết các lỗi đó mà không xóa tất cả các xác nhận dữ liệu?


1594
2018-05-28 18:39


gốc


Có vẻ như bạn nên giới hạn việc bán phần mềm cho những người tránh gặp phải tình huống gia đình khó khăn! Làm thế nào để có con với con gái của mình - Tôi hy vọng bạn đang nói về con dâu của mình! - Will A
Bạn nên ghi rõ phần mềm của mình với bài hát của Ray Stevens. - Peter K.
Đây có thể là một trong những trường hợp bạn cần tự hỏi: Tôi có thực sự muốn làm ăn với anh chàng đó không?  Một giải pháp khác là báo chí buộc tội hình sự chống lại ông. Incest bị cấm ở hầu hết thế giới, sau khi tất cả. Cuối cùng, phần mềm của bạn bị hỏng, bởi vì bạn có thể (hợp pháp) có chu kỳ trong một cây gia đình: anh em họ được phép kết hôn ở hầu hết (tất cả?) Các nước phương Tây. - sbi
Bạn không nên thêm xác nhận cho những điều không thể, chỉ những điều không thể. Chu kỳ là những điều hiển nhiên mà không thể có trong biểu đồ cây gia đình ... không ai có thể là tổ tiên của riêng mình thông qua bất kỳ phương pháp nào. Những xác nhận khác chỉ là không có thật và cần được loại bỏ. - pgod
Có lẽ lần sau bạn sẽ thử một ví dụ trừu tượng hơn. Mọi người ở đây không thể bỏ qua phần loạn luân và chỉ đóng nó, ngay cả khi nó là một câu hỏi hợp lệ liên quan đến sự đại diện của cây như dữ liệu. - stesch


Các câu trả lời:


Có vẻ như bạn (và / hoặc công ty của bạn) có một sự hiểu lầm cơ bản về những gì một cây gia đình được cho là.

Hãy để tôi làm rõ, tôi cũng làm việc cho một công ty có (là một trong những sản phẩm của nó) một cây gia đình trong danh mục đầu tư của nó, và chúng tôi đã đấu tranh với những vấn đề tương tự.

Vấn đề, trong trường hợp của chúng tôi, và tôi giả định trường hợp của bạn, xuất phát từ GEDCOM định dạng đó là cực kỳ ý kiến ​​về những gì một gia đình nên được. Tuy nhiên, định dạng này chứa một số quan niệm sai lầm nghiêm trọng về một cây gia đình thực sự trông như thế nào.

GEDCOM có nhiều vấn đề, chẳng hạn như không tương thích với quan hệ tình dục cùng, loạn luân, vv ... Điều gì trong cuộc sống thực xảy ra thường xuyên hơn bạn tưởng tượng (đặc biệt là khi quay ngược thời gian đến 1700-1800).

Chúng tôi đã lập mô hình cây gia đình của mình cho những gì xảy ra trong thế giới thực: Sự kiện (ví dụ: sinh, đám cưới, tham gia, đoàn thể, tử vong, nhận nuôi, v.v.). Chúng tôi không đặt bất kỳ hạn chế nào về những điều này, ngoại trừ những điều không thể thực hiện được (ví dụ, một người không thể là cha mẹ của chính mình, các mối quan hệ cần hai cá nhân, v.v ...)

Việc thiếu hiệu lực cho chúng ta một giải pháp "thế giới thực" hơn, đơn giản và linh hoạt hơn.

Đối với trường hợp cụ thể này, tôi sẽ đề xuất xóa các xác nhận vì chúng không giữ phổ biến.

Để hiển thị các vấn đề (sẽ phát sinh) tôi sẽ đề nghị vẽ cùng một nút nhiều lần nếu cần, gợi ý về sự trùng lặp bằng cách chiếu sáng tất cả các bản sao khi chọn một trong số chúng.


727
2018-06-01 08:25



Điều này có vẻ giống như cách tiếp cận đúng, và nó đủ dễ dàng để mở rộng để phát hiện các vấn đề phức tạp hơn. Bạn có thể tìm ra một tập hợp các mối quan hệ "A đã xảy ra trước B" giữa các sự kiện. Ví dụ, một người được sinh ra trước bất kỳ sự kiện nào khác liên quan đến họ. Đây là đồ thị có hướng. Sau đó bạn có thể kiểm tra xem biểu đồ có chứa chu trình không. Xem câu hỏi này trên StackOverflow.  Điều này sẽ ổn cho đến khi du hành thời gian được phát minh. - Paul Harrison
@ paul-harrison Nếu nó chỉ đơn giản mà thôi. Trong hồ sơ cũ hơn (ngay cả những bản ghi mới) có những mâu thuẫn trong ngày. Rửa tội trước khi sinh, nhiều hồ sơ sinh vv ... Vì vậy, đến một mức độ, trong hồ sơ chính thức, có thời gian đi lại. Chúng tôi cho phép dữ liệu không nhất quán này. Chúng tôi cho phép người dùng chỉ ra ứng dụng nên xem xét "hồ sơ sinh" trong trường hợp trùng lặp. Và chúng tôi sẽ chỉ ra các mốc thời gian bị hỏng nếu tìm thấy. - Bert Goethals
@ Ben-voigt GEDCOM là một định dạng được tạo ra bởi Giáo Hội Các Thánh Hữu Ngày Sau của Chúa Giê Su Ky Tô. Đặc điểm kỹ thuật nêu rõ rằng hôn nhân (MARR) là giữa nam và nữ. Đối với hôn nhân cùng giới tính hoặc loạn luân, thẻ ASSO nên được sử dụng (ASSOCIATES), cũng được sử dụng để chỉ tình bạn hoặc là hàng xóm. Rõ ràng hôn nhân đồng giới là mối quan hệ thứ hai trong phạm vi thông số này. Một đặc điểm trung lập hơn sẽ không đòi hỏi mối quan hệ nam nữ. - Bert Goethals
@Bert Goethals: Bạn đang bối rối GEDCOM với một số chương trình không hỗ trợ hôn nhân đồng tính (PAF, Legacy). GEDCOM không loại trừ các cấu trúc như "0 @ F1 @ FAM / 1 HUSB @ I1 @ / 1 HUSB @ I2 @", và do đó hỗ trợ hôn nhân đồng tính nếu phần mềm của bạn chọn. - Pierre
@Pierre Bạn có thể lừa hệ thống thực sự. Điều này là trực tiếp từ các tài liệu 5.5.1: "MARR {MARRIAGE}: = Một sự kiện pháp lý, phổ biến, hoặc thường lệ của việc tạo ra một đơn vị gia đình của một người đàn ông và một người phụ nữ như vợ chồng." (homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htmNhư bạn có thể thấy, không có hôn nhân giới tính ở đây. - Bert Goethals


Hãy thư giãn xác nhận của bạn.

Không phải bằng cách thay đổi các quy tắc, phần lớn có thể rất hữu ích đối với 99,9% khách hàng của bạn trong việc bắt gặp những sai lầm khi nhập dữ liệu của họ.

Thay vào đó, hãy thay đổi từ lỗi "không thể thêm mối quan hệ" vào cảnh báo bằng "thêm bất kỳ" nào.


564
2018-05-28 19:20



Khi gặp phải một rất khó tình huống, đó là, nơi người dùng sẽ thông thường chỉ làm điều đó do nhầm lẫn, đó là một ý tưởng tốt để hiển thị cảnh báo cho người dùng. Đó là phản hồi tốt. Nhưng sau đó để người dùng tiếp tục nếu họ có thật không chắc chắn họ muốn. Vì vậy, tôi nghĩ rằng đây là một câu trả lời tốt, ngay cả khi nó không nhận được vào các loại hạt và bu lông như thế nào. - thomasrutter
Câu trả lời tốt! Tôi tự hỏi, làm thế nào loại phần mềm này sẽ xử lý "Tôi là ông của riêng tôi" (youtube.com/watch?v=eYlJH81dSiw) tình hình? - Zaur Nasibov
Đây không thực sự là một câu trả lời, bởi vì tôi nghĩ vấn đề xuất phát từ việc thực sự vượt qua cây? Tuy nhiên, đó là một gợi ý tốt. - bdwakefield
@bdwakefield: Câu hỏi là "Làm cách nào để giải quyết các lỗi này, mà không xóa tất cả các xác nhận dữ liệu?" Tôi tin rằng tôi đã trả lời điều đó. - Ben Voigt
@Ben Nó phụ thuộc vào những gì các khẳng định được cho. Nếu chúng ngăn chặn các vòng lặp vô hạn hoặc các lỗi nghiêm trọng xảy ra, thì bạn đang có hiệu quả gợi ý loại bỏ các xác nhận. Nếu họ chỉ ở đó để cảnh báo người dùng về một sai lầm tiềm ẩn, thì câu trả lời của bạn là một câu trả lời hay. - rm999


Đây là vấn đề với cây gia đình: chúng không phải là cây cối. Chúng được định hướng theo đồ thị tuần hoàn hoặc DAG. Nếu tôi hiểu nguyên tắc sinh học của sự sinh sản của con người một cách chính xác, sẽ không có bất kỳ chu kỳ nào.

Theo như tôi biết, ngay cả các Kitô hữu cũng chấp nhận hôn nhân (và do đó trẻ em) giữa những người anh em họ, điều này sẽ biến cây gia đình thành một DAG của gia đình.

Đạo đức của câu chuyện là: chọn đúng cấu trúc dữ liệu.


224
2018-06-01 09:58



Nó sẽ cần một hạn chế hơn nữa của mỗi nút có 1 hoặc 2 nút tối đa trỏ đến nó cho in vitro và sinh sản tình dục. Mặc dù đúng hơn với cuộc sống thực, bạn có thể cho phép nhiều đường đứt nét cho hậu duệ không chắc chắn ở bên cha (luôn luôn rõ ràng ai là mẹ, nhưng chỉ xét nghiệm ADN mới có thể bảo đảm người cha là ai, và hiếm khi được thực hiện ngay cả ngày hôm nay), hoặc thậm chí cho cả hai là việc chấp nhận được tính đến. - manixrock
@manixrock - vì câu hỏi này là về các trường hợp hiếm hoi, tôi muốn khẳng định rằng không phải lúc nào cũng rõ ràng ai là mẹ. nhận con nuôi, trẻ em bị bỏ rơi, bà mẹ thay thế, vv có thể tất cả các vấn đề phức tạp. - Peter Recore
Nó không nhất thiết phải tuần hoàn, phải không? Man-marries-bà ngoại. - Ed Ropple
Người đàn ông kết hôn với bà ngoại của mình sẽ không làm cho mình ông nội của mình và thêm một chu kỳ. Nếu họ có con, nó sẽ là một cạnh đồ thị thường xuyên không đi xe đạp. - exDM69
Nó thực sự là HAI ADG. Có biểu đồ cha mẹ và biểu đồ quan hệ pháp lý. Thông thường, nhưng khác nhau nhiều hơn một người có thể mong đợi. - JSacksteder


Tôi đoán rằng bạn có một số giá trị xác định duy nhất một người mà bạn có thể căn cứ vào séc của mình.

Đây là một khó khăn. Giả sử bạn muốn giữ cấu trúc một cái cây, tôi đề nghị điều này:

Giả sử điều này: A có con với con gái của mình.

A tự thêm vào chương trình A và như B. Một lần trong vai trò của cha, hãy gọi nó là bạn trai.

Thêm một is_same_for_out() chức năng cho phần đầu ra tạo ra chương trình của bạn rằng tất cả các liên kết sẽ B nội bộ nên đi đến A về việc trình bày dữ liệu.

Điều này sẽ làm cho một số công việc phụ cho người sử dụng, nhưng tôi đoán nó sẽ được tương đối dễ dàng để thực hiện và duy trì.

Xây dựng từ đó, bạn có thể làm việc trên mã synching A và B để tránh mâu thuẫn.

Giải pháp này chắc chắn không hoàn hảo, nhưng là một cách tiếp cận đầu tiên.


115
2018-05-28 18:50



Có lẽ các nút "proxy" như vậy thực sự là giải pháp phù hợp. Tuy nhiên tôi không có ý tưởng làm thế nào những người có thể được đưa vào giao diện người dùng mà không có người dùng vi phạm. Tôi có thể nói với bạn rằng việc viết phần mềm giao dịch với những người thực sự (đặc biệt là khách hàng của bạn) không phải là dễ dàng. - Partick Höse
Nó không bao giờ kết thúc - con trai mới của B sẽ là chú của chính mình. Tôi sẽ xem xét một khoản hoàn lại đầy đủ cho chương trình! - Bo Persson
Jup nó là một loại tình huống sai lầm. Là prolog nội tuyến có thể trong C + +? - Eduard Thamm
@ Will A: Và sau đó nhận ra anh ta cũng là mẹ của anh ta, và tuyển dụng bản thân trẻ hơn của mình vào cơ quan thời gian? - Null Set
Sao chép (và đồng bộ) dữ liệu trong một hệ thống là thực hành không tốt. Nó chỉ ra rằng giải pháp là phụ tối ưu và cần được xem xét lại. Nếu cần thêm các nút (trùng lặp), hãy chỉ ra nó như một proxy và ủy quyền dữ liệu đọc và ghi vào nút gốc. - Bert Goethals


Bạn nên tập trung vào những gì thực sự làm cho giá trị cho phần mềm của bạn. Đã dành thời gian để làm cho nó hoạt động cho MỘT người tiêu dùng có đáng giá của giấy phép không? Có khả năng là không.

Tôi khuyên bạn nên xin lỗi khách hàng này, nói với anh ấy rằng tình trạng của anh ấy nằm ngoài phạm vi cho phần mềm của bạn và hoàn lại tiền cho anh ấy.


84
2018-06-01 08:51



Rất đúng. Nhưng cũng cân nhắc các vấn đề tiềm năng khác với những rắc rối tương tự mà những người khác đã đưa ra. - Prof. Falken
Tất nhiên. Lý do là: nếu đó là một trường hợp hiếm gặp trên một ứng dụng không quan trọng, bạn không cần phải sửa chữa hoặc thực hiện bất cứ điều gì. Nếu nó thực sự làm tổn thương người dùng của bạn, có giá trị khi làm việc trên đó. - christopheml
Có lẽ tất cả mọi người có một số trường hợp loạn luân một nơi nào đó trong tổ tiên của mình. Vì vậy, bạn sẽ nhấn rằng vết sưng nếu một trong những digs lịch sử gia đình (quá) sâu. - datenwolf
Làm cây phả hệ của một số tình huống kỳ lạ (tiền bản quyền, Fritzl, vv) là việc sử dụng hợp lệ phần mềm. - Bulwersator
Một phần mềm cây gia đình sẽ không cho phép người anh em họ thứ hai kết hôn là vô ích. Gần như tất cả các gia đình đều có ít nhất một trường hợp này. Đó là lý do tại sao tôi nghĩ rằng ví dụ ban đầu được tạo ra để có hiệu lực. - Fuzzy76


Bạn nên thiết lập Atreides gia đình (hiện đại, Cồn cát, hay cổ đại, Oedipus Rex) như một trường hợp thử nghiệm. Bạn không tìm thấy lỗi bằng cách sử dụng dữ liệu vệ sinh như một trường hợp thử nghiệm.


79
2018-06-01 16:10



Đáng buồn thay, cách quá nhiều người đầu tiên nghĩ về dữ liệu 'ok' thay vì các trường hợp cạnh phá vỡ hệ thống của họ. - sjas


Đây là một trong những lý do tại sao các ngôn ngữ như "Go" không có xác nhận. Chúng được sử dụng để xử lý các trường hợp mà bạn có thể không nghĩ đến, tất cả là quá thường xuyên. Bạn chỉ nên khẳng định điều không thể, không đơn giản là không chắc. Làm điều sau là điều cho phép khẳng định một danh tiếng xấu. Mỗi lần bạn nhập assert(, đi bộ mười phút và có thật không suy nghĩ về nó.

Trong trường hợp đặc biệt đáng lo ngại của bạn, đó là cả hai có thể hiểu được và kinh khủng rằng một khẳng định như vậy sẽ là không có thật trong trường hợp hiếm hoi nhưng có thể. Do đó, xử lý nó trong ứng dụng của bạn, nếu chỉ để nói "Phần mềm này không được thiết kế để xử lý kịch bản mà bạn trình bày".

Khẳng định rằng ông tuyệt vời, vĩ đại, vĩ đại của bạn là cha của bạn là điều không thể là một điều hợp lý để làm.

Nếu tôi đang làm việc cho một công ty thử nghiệm đã được thuê để kiểm tra phần mềm của bạn, tất nhiên tôi đã trình bày kịch bản đó. Tại sao? Mọi người chưa thành niên thông minh 'người dùng' sẽ làm điều tương tự và tận hưởng 'báo cáo lỗi' kết quả.


59
2018-06-01 06:10



Đừng quên tinh trùng đông lạnh ... - Prof. Falken
Đồng ý với đối số 'khi nào sử dụng xác nhận'; không thấy nó liên quan đến 'một số ngôn ngữ đã khẳng định như thế nào, Go không.' - phooji
@Red Hue - đôi khi các trình biên dịch làm cho điều không thể ... có thể xảy ra. Một số phiên bản của gcc nghĩ -10 == 10 trong việc thực hiện abs (). - Tim Post♦
@Red Huế: Toàn bộ điểm xác nhận là để ghi lại và kiểm tra các điều kiện luôn phải đúng (hoặc sai). Nó giúp giữ cho bạn (và những người khác) từ "sửa chữa" những thứ theo cách mà những trường hợp không thể xảy ra, như sau đó họ sẽ rõ ràng (thay vì tinh tế) phá vỡ các ứng dụng. Nếu có một lý do hợp lệ cho một trường hợp "không thể" xuất hiện, thì bạn đã khẳng định quá nhiều. - cHao
Có xác nhận (hoặc mã xác nhận) không liên quan. Mã bằng các ngôn ngữ như Go có thể và sẽ đưa ra các giả định về cấu trúc dữ liệu; nó chỉ không thể làm tài liệu và thực thi những giả định đó với các xác nhận. Tóm lại: ứng dụng có lỗi. - Tommy McGuire


Tôi ghét nhận xét về một tình huống khó khăn như vậy, nhưng cách dễ nhất để không rejigger tất cả các bất biến của bạn là tạo ra một đỉnh ma trong biểu đồ của bạn hoạt động như một proxy trở lại cha loạn luân.


41
2018-05-28 18:55