Đây là một kịch bản phổ biến luôn làm tôi khó chịu.
Tôi có một mô hình đối tượng với một đối tượng cha. Cha mẹ chứa một số đối tượng con. Một cái gì đó như thế này.
public class Zoo
{
public List<Animal> Animals { get; set; }
public bool IsDirty { get; set; }
}
Mỗi đối tượng con có dữ liệu và phương thức khác nhau
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void MakeMess()
{
...
}
}
Khi đứa trẻ thay đổi, trong trường hợp này khi phương thức MakeMess được gọi, một số giá trị trong cha mẹ cần được cập nhật. Giả sử khi một ngưỡng nhất định của Động vật gây ra sự lộn xộn, thì cờ IsDenty của Sở thú cần được đặt.
Có một vài cách để xử lý tình huống này (mà tôi biết).
1) Mỗi Động vật có thể có một tài liệu tham khảo Sở thú mẹ để truyền đạt những thay đổi.
public class Animal
{
public Zoo Parent { get; set; }
...
public void MakeMess()
{
Parent.OnAnimalMadeMess();
}
}
Cảm giác này giống như một lựa chọn tồi tệ nhất vì nó kết hợp Animal với đối tượng cha của nó. Nếu tôi muốn một con vật sống trong một ngôi nhà thì sao?
2) Một tùy chọn khác, nếu bạn đang sử dụng ngôn ngữ hỗ trợ các sự kiện (như C #) là đăng ký phụ huynh để thay đổi sự kiện.
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)
{
...
}
}
Điều này có vẻ để làm việc nhưng từ kinh nghiệm trở nên khó để duy trì. Nếu Động vật từng thay đổi Sở thú, bạn phải hủy đăng ký các sự kiện tại Sở thú cũ và đăng ký lại tại Sở thú mới. Điều này chỉ trở nên tồi tệ hơn khi cây thành phần sâu hơn.
3) Tùy chọn khác là di chuyển logic lên tới cha mẹ.
public class Zoo
{
public void AnimalMakesMess(Animal animal)
{
...
}
}
Điều này có vẻ rất không tự nhiên và gây ra sự trùng lặp của logic. Ví dụ: nếu tôi có một đối tượng Nhà không chia sẻ bất kỳ cha mẹ thừa kế chung nào với Zoo ..
public class House
{
// Now I have to duplicate this logic
public void AnimalMakesMess(Animal animal)
{
...
}
}
Tôi chưa tìm thấy một chiến lược tốt để xử lý các tình huống này. Những gì khác có sẵn? Làm thế nào điều này có thể được thực hiện đơn giản hơn?