[英]Design Issue: Two roles for a class. First for instances creating and the other for types
考慮這個類圖:
+--------+ * +------------------+ * afraid-of +------------+
| Garden |------>| Animal |<------------------------| Baby |
+--------+ +------------------+ +------------+
^
|
+----------+------+
| |
+------+------+ +------+-----+
| Cat | | Wolf |
+-------------+ +------------+
Animal有兩個角色:
寶寶應該保留什么? 害怕每只動物的一個例子? (聽起來很糟糕的設計)類型名稱? (我總是盡量避免重構)
該如何解決? (我正在使用C#,我最后才提到它,因為我希望這里有一個通用的,無語言的設計模式或想法)
謝謝
如果嬰兒總是害怕同樣的動物,你就不必保留任何東西。 你可以有一個方法:
public bool IsAfraid(Animal animal)
{
return animal is Wolf;
}
如果嬰兒在不同的地方和時間害怕不同的動物,你應該讓每只動物都有一個屬性AnimalType(flag enum)。 然后寶寶將擁有屬於AnimalType的AfraidOf屬性。 然后,檢查你是否害怕動物很簡單:
bool afraid = this.AfraidOf.HasFlag(animal.AnimalType);
最后,您可能應該為模式中的不同類型的關系(Contains,Inherits,Afraid of)提供不同類型的鏈接到不同的類。
Baby
可以列出他/她害怕的動物名單。 我會指定獨立的方法來添加和刪除列表中的動物因為時間過去可以刪除或添加一些動物。 可以直接通過屬性更改動物列表,但我更喜歡這種情況下的特定方法。
public class Animal { }
public class Cat : Animal { }
public class Wolf : Animal { }
public class Baby
{
public List<Animal> ScaryAnimalsList { get; private set; }
public Baby()
{
ScaryAnimalsList = new List<Animal>();
}
public void AddAnimalToScaryList(Animal animal)
{
ScaryAnimalsList.Add(animal);
}
public void RemoveAnimalFromScaryList(Animal animal)
{
if (ScaryAnimalsList.Contains(animal))
ScaryAnimalsList.Remove(animal);
}
public bool IsAffraidOf(Animal animal)
{
return ScaryAnimalsList.Contains(animal);
}
}
這就是如何使用它
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Wolf wolf = new Wolf();
var babyJo = new Baby();
babyJo.AddAnimalToScaryList(wolf);
babyJo.IsAffraidOf(wolf); //true
babyJo.IsAffraidOf(cat); //false
var babySam = new Baby();
babySam.AddAnimalToScaryList(wolf);
babySam.AddAnimalToScaryList(cat);
babySam.IsAffraidOf(wolf); //true
babySam.IsAffraidOf(cat); //true
var babyBob = new Baby();
babyBob.IsAffraidOf(wolf); //false
babyBob.IsAffraidOf(cat); //false
}
}
另一種選擇是為動物添加功能。
public class Animal
{
public virtual bool EatsSmallChildren { get { return false; } }
}
然后你的寶寶可以檢查動物是否可怕,而不是寶寶是否害怕它。
這會給你的動物類增加負擔,並引入一些概念上的耦合,但也非常直觀,易於理解和維護。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.