나는 모델링이 약간 벗어난 것 같아요. Mother
과 Child
은 의미 적으로 서로 관련되어 있지만 동일한 객체의 인스턴스입니다. 둘 다 Person
입니다.
Person
의 생성은 Person
에 의해 수행되는 연산입니다. 따라서 Person
에는 public 생성자가 없어야하지만이 논리를 처리하는 팩토리 메소드가 있어야합니다. 이 같은 것은 :
public class Person : ObservableObject
{
private Person()
{
Children = new ObservableCollection<Person>();
}
public Person Mother { get; private set; }
public ObservableCollection<Person> Children { get; private set; }
public Person Procreate()
{
var child = new Person();
child.Mother = this;
this.Children.Add(child);
return child;
}
}
이 모델링은 여전히 제한적입니다. 예를 들어 여기서는 무성 생식에 대해서만 이야기합니다. 그래서 우리는 인간을 효과적으로 모델링하지 못합니다. 아마도 우리는 아버지를 추가해야할까요?
public class Person : ObservableObject
{
private Person()
{
Children = new ObservableCollection<Person>();
}
public Person Mother { get; private set; }
public Person Father { get; private set; }
public ObservableCollection<Person> Children { get; private set; }
public Person Procreate(Person father)
{
var child = new Person();
child.Mother = this;
child.Father = father;
this.Children.Add(child);
father.Children.Add(child);
return child;
}
}
nulls 및 기타 등등을 확인하는 것이 좋습니다. 이제 성별을 지정해야한다는 사실을 발견했습니다. (가족 구조가 상당히 다를 수 있지만, 사람을 만드는 행위는 꽤 잘 성립됩니다.) 그래서 우리는 그런 특징을 계속 추가 할 수 있습니다. 어느 시점에서 실제로 이들을 서브 클래스화할 수 있지만이 서브 클래스는이 Person
수퍼 클래스의 하드 코딩 된 기본값을 갖는 거의 의미 론적 통과 객체가 될 가능성이 높습니다.
그러나 단지 재미를 위해, 확인
public class Person : ObservableObject
{
private Person(Sex gender, Person mother, Person father)
{
// TODO: Check for null mother and father
this.Gender = gender;
this.Mother = mother;
this.Father = father;
Children = new ObservableCollection<Person>();
}
public Sex Gender { get; private set; }
public Person Mother { get; private set; }
public Person Father { get; private set; }
public ObservableCollection<Person> Children { get; private set; }
public Person Procreate(Person father)
{
// TODO: Check for null father, confirm gender of father
var child = new Person(PickRandomGender(), this, father);
this.Children.Add(child);
father.Children.Add(child);
return child;
}
private Sex PickRandomGender() { /.../ }
public enum Sex
{
Female,
Male
}
}
, 그건 재미 ... 이제 성별을 추가 해보자. 일부 논리를 생성자로 이동하여 조금 정리했습니다. 그러나 이제는 또 다른 문제가 있습니다. 아버지가 창궐 할 수 있습니다. 어떤 종류의 고통스러운 소리.
이
public class Person : ObservableObject
{
protected Person(Sex gender, Person mother, Person father)
{
// TODO: Check for null mother and father
this.Gender = gender;
this.Mother = mother;
this.Father = father;
Children = new ObservableCollection<Person>();
}
public Sex Gender { get; private set; }
public Person Mother { get; private set; }
public Person Father { get; private set; }
public ObservableCollection<Person> Children { get; private set; }
protected Sex PickRandomGender() { /.../ }
public enum Sex
{
Female,
Male
}
}
public class Woman : Person
{
// TODO: Override Gender with a hard-coded value
public Person Procreate(Person father)
{
// TODO: Check for null father, confirm gender of father
var child = new Person(PickRandomGender(), this, father);
this.Children.Add(child);
father.Children.Add(child);
return child;
}
}
(우리는뿐만 아니라 Man
를 서브 클래 싱해야 그것은 의미 청소기 보이지만, 어떤 작업이 또는 여자에 의해 공유되지 않는 사람에게 특정 속성 : 우리가 서브 클래스 준비가 것처럼 지금은 보인다? 아마도, 우리 모델은 아직 상세하지 않습니다.)
이 시점에서 Mother
및 Child
의 클래스는 제한적이며 근시안적인 것처럼 보입니다. 여자는 반드시 어머니가 아니며, 모든 사람들은 아이들입니다. 여러분이 상상할 수 있듯이,이 시스템에 추가 할 수있는 많은 기능이 있습니다. 그러나 이와 같은 도메인을 구축하는 일반적인 프로세스를 따라하면이를 수용해야합니다.
어머니가 아이들을 낳지 않습니까? – Jodrell
'mother.GiveBirth (new Child());':) – crashmstr
아마 어머니는 그 아이가 그녀의 콜렉션에 없었을 것입니다! – BenjaminPaul