여기에 내가 다루기가 항상 좌절하는 일반적인 시나리오가 있습니다.
부모 개체가있는 개체 모델이 있습니다. 부모는 자식 개체를 포함합니다. 이 같은.
public class Zoo
{
public List<Animal> Animals { get; set; }
public bool IsDirty { get; set; }
}
각 자식 개체에는 다양한 데이터와 메서드가 있습니다
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void MakeMess()
{
...
}
}
자식이 변경되면 (이 경우 MakeMess 메서드가 호출 될 때) 부모의 일부 값을 업데이트해야합니다. Animal의 특정 임계 값이 엉망이되면 Zoo의 IsDirty 플래그를 설정해야합니다.
이 시나리오를 처리하는 몇 가지 방법이 있습니다 (내가 아는 것).
1) 각 동물은 변경 사항을 알리기 위해 부모 동물원 참조를 가질 수 있습니다.
public class Animal
{
public Zoo Parent { get; set; }
...
public void MakeMess()
{
Parent.OnAnimalMadeMess();
}
}
Animal을 부모 객체에 연결하기 때문에 최악의 옵션처럼 느껴집니다. 집에 사는 동물을 원한다면 어떻게해야합니까?
2) 다른 옵션은 C #과 같은 이벤트를 지원하는 언어를 사용하는 경우 부모가 이벤트 변경을 구독하도록하는 것입니다.
public class Animal
{
public event OnMakeMessDelegate OnMakeMess;
public void MakeMess()
{
OnMakeMess();
}
}
public class Zoo
{
...
public void SubscribeToChanges()
{
foreach (var animal in Animals)
{
animal.OnMakeMess += new OnMakeMessDelegate(OnMakeMessHandler);
}
}
public void OnMakeMessHandler(object sender, EventArgs e)
{
...
}
}
이것은 작동하는 것처럼 보이지만 경험상 유지하기가 어렵습니다. 동물이 동물원을 변경하면 이전 동물원에서 이벤트를 구독 취소하고 새 동물원에서 다시 구독을 취소해야합니다. 컴포지션 트리가 깊어 질 때만 악화됩니다.
3) 다른 옵션은 로직을 상위로 이동하는 것입니다.
public class Zoo
{
public void AnimalMakesMess(Animal animal)
{
...
}
}
이것은 매우 부자연스럽고 논리가 중복됩니다. 예를 들어 Zoo와 공통 상속 부모를 공유하지 않는 House 객체가있는 경우
public class House
{
// Now I have to duplicate this logic
public void AnimalMakesMess(Animal animal)
{
...
}
}
아직 이러한 상황을 처리하기위한 좋은 전략을 찾지 못했습니다. 다른 무엇을 사용할 수 있습니까? 어떻게 이것을 더 간단하게 만들 수 있습니까?