03C Frauen Gebären und sich Scheiden lassen
Contents
4. Frauen Gebären
Woher kommen die Kinder?
Das soll jetzt kein Vortrag über das Kinderkriegen werden, aber wenn unser Modell Menschen beschreibt, dann sollte es auch Kinder produzieren können.
Im Einfachsten Fall bekommt eine Frau ein Kind und ihr Ehepartner ist der Vater. Die Signatur sieht etwa so aus:
|
|
Offenbar brauchen wir auch das Geschlecht und den Geburtstag des Kindes. Das Ergebnis sollte ein Kind sein, also eine Person.
Was brauchen wir für das Kind?
Das gleiche wie für die meisten Personen: einen Familiennamen, einen Vornamen, ein Geburtsdatum, ein Geschlecht, Eltern (soweit bekannt).
Den Familiennamen können wir von der Mutter nehmen (man kann den ja hinterher auch nochmal ändern).
Was sollte man nun beim Gebären beachten?
|
|
Damit Kinder keine Kinder bekommen, habe ich willkürlich eine Grenze von mindestens 15 Jahren gezogen. Man kann die auch höher ansetzen.
Die Mutter muss weiblich sein, d.h. wenn die übergebene Person weiblich ist, dann ist das die Mutter, ansonsten versuchen wir die Partnerin.
Der Familienname wird von der Person übernommen, die gebärt. Das muss nicht immer stimmen, aber man kann den Familiennamen auch nach der Geburt ändern.
father=father
bedeutet, dass die Person in der Variable father
als Person.father
verwendet wird. Damit müssen wir uns nicht merken, an welcher Stelle der Vater steht. Bei mother=mother
gilt das entsprechend.
4.1 Funktioniert das?
|
|
Ausgabe:
|
|
Also klappt es.
4.2 Was passiert, wenn die Frau nicht verheiratet ist?
Dann wird offenbar kein Vater zugewiesen. Das ist aber kein Problem, da man den Vater auch noch später zuweisen kann, wenn er bekannt ist.
|
|
|
|
Hmm, irgendwie müssten wir statt “null” eher “unbekannt” schreiben.
5. Wie kann man sich scheiden lassen?
Naja, das kommt nicht immerzu vor, muss aber im Programm auch eingeplant werden.
Zum Scheiden muss man offenbar verheiratet sein. Eigentlich müssen die 2 Ehepartner die Scheidung beantragen, aber damit das Programm einfacher zu bedienen ist, reicht uns eine Person, die dann von ihrem/ihrer Ehepartner/in geschieden wird, etwa so:
|
|
So einfach kann das im Computer gehen.
Was bedeutet das !!
?
Hmm, normalerweise kann der/die Partner/in null
sein. Dieser Fall ist aber oben bereits ausgeschlossen. Trotzdem erkennt der Compiler nicht immer, dass das gegeben ist. Deshalb kann man ihn mit !!
überzeugen, dass das so ist.
Was passiert, wenn ich den Compiler belüge?
Tja, dann mach er im guten Glauben, wovon du ihn überzeugt hast, und wahrscheinlich geht es irgendwann schief (“NullpointerException”).
9.b Selber probieren
So jetzt bist du dran. Versuch doch mal, deinen Familienstammbaum zu rekonstruieren. Dazu fängst du am besten bei dem/der ältesten Verwandten an, den/die du kennst, z.B. deinem Opa.
|
|
Wenn du Personen nicht kennst (z.B. die Großmutter deiner Mutter), dann kannst du sie vielleicht weglassen. Wenn du nur den Vornamen nicht kennst, kannst du vielleicht die Verwandtschaftsbeziehung schreiben, z.B. Person("Oma", "Haberda", ...)
.
Also, kennst du deine Verwandten? Kannst du sie dem Computer erklären?
6. Verwandte höheren Grades
6.1 Warum haben wir die Geschwister nicht im Modell eingetragen?
Naja, weil das Modell dann noch unübersichtlicher wird. Andererseits kann man die Geschwister auch rekonstruieren, wenn die Eltern bekannt sind: Die Kinder, außer mir selbst, von meinen Eltern sind meine Geschwister.
|
|
Was ist ein Set
?
Englisch “Set” heisst Menge auf Deutsch. Das benutzen wir, um jedes Geschwister nur einmal aufzuzählen. Wenn nämlich die Eltern schon immer verheiratet waren, dann haben sie die gleichen Kinder. Wenn wir also erst alle Kinder der Mutter und dann alle Kinder des Vaters hinzufügen, dann hätten wir jedes Kind doppelt. Außerdem heißt mutableSetOf
, dass wir die Menge auch verändern wollen, z.B. die verschiedenen Kinder hinzufügen.
Warum steht da siblings.remove(this)
?
Naja, wenn wir melli.siblings()
aufrufen, dann ist this==melli
, d.h. erst fügen wir alle Kinder von Mutter und Vater hinzu, und dann entfernen wir melli
wieder. Klar, oder? (melli
ist nicht sein eigenes Geschwister.)
Was kommt denn in deinem Familienstammbaum heraus?
6.2 Warum stürzt das bei mir ab?
Oh, gut, dass du es ausprobiert hast. Ich habe den Fehler gefunden: Wenn man Person
en in Mengen organisieren will, müssen sie ein paar wichtige Eigenschaften erfüllen:
|
|
Also eine Person ist gleich einem anderen Objekt, wenn das andere Objekt eine Person ist und wenn Vorname, Geschlecht und Geburtstag übereinstimmen. (&&
bedeutet ‘und’, also dass zum einen das Linke wahr sein muss und dann noch getestet wird, ob das Rechte wahr ist.)
Warum vergleichen wir nicht den Familiennamen?
Weil sich der Familienname im Laufe des Lebens ändern kann. (Das Geschlecht hoffentlich nicht.)
Wieso hashCode
?
Tja, die Implementation von Set
muss jedes Objekt in einen HashCode umwandeln und sortiert dann zunächst diese ein. Die sollten weitgehend, müssen aber nicht streng verschieden sein, z.B. gibt es mehr Vornamen als ganze Zahlen auf dem Computer.
B) Es funktioniert aber immer noch nicht :-(
Dann sollten wir für den zweiten Typ PartialDate
die gleichen Funktionen noch definieren, etwa so:
|
|
Was bedeuten die vielen Fälle bei equals
?
Wenn alle Daten vollständig bekannt sind, dann wird einfach Jahr, Monat und Tag jeweils verglichen. Wenn der Tag in einem Datum nicht definiert ist (also null
), dann wird der ignoriert. Wenn der Monat in einem Datum nicht definiert ist, dann wird auch der ignoriert. ||
bedeutet ‘oder’, d.h. es wird erst das Linke überprüft und wenn es wahr ist, dann ist der ganze Ausdruck wahr, ansonsten wir noch das Rechte überprüft und wenn das wahr ist, ist das ganze wahr, ansonsten falsch.
6.3 Wie kann man die Großeltern finden?
Also Großeltern sind die Eltern der Eltern, also muss man von der Person die Eltern finden (falls die bekannt sind) und dann deren Eltern sammeln. Das geht etwa so:
|
|
Und im Hauptprogramm schreibt man dann:
|
|
|
|
Wie sieht es mit deinen Großeltern aus?
Viel Spaß beim Probieren.
Datenschutz
Wenn du das Programm nur für dich schreibst oder für dich und deine Familie, dann ist es im Prinzip egal, welche Daten du dort eintippst. Aber bitte die Geburtsdaten deiner Eltern oder Großeltern nicht im Internet veröffentlichen.