我很難理解是否有時可以接受打破單一責任原則,或者不惜一切代價避免它。SRP應該受到尊重嗎?
請注意以下代碼已被簡化爲只保留相關部分。
我有Hero
類,表示一個字符,它可以擁有多個不同的Items
。
我有從Items
繼承的倍數類,例如QuestItems
和BackpackItems
。
當我想在我的Hero
上添加Item
時,根據Item
的種類,我應採取不同的行爲。
我已經試過2個不同的方式做到這一點的第一種尊重SRP:
public abstract class Item
{
private string _Name{get;set;}
public string Name
{
get
{
return _Name;
}
protected set
{
if (_Name != value)
{
_Name = value;
}
}
}
}
public class QuestItem: Item
{
public QuestItem(String name)
{
Name = name;
}
}
public class BackpackItem: Item
{
public BackpackItem(String name)
{
Name = name;
}
}
public class Hero
{
public void AddItem(Item item){
if(item is QuestItem){
//Do stuff to add QuestItem
return;
}
if(item is BackpackItem){
//Do stuff to add BackpackItem
return;
}
}
}
優點:SRP尊重
缺點:如果我創建一個新項目實物Item
繼承和忘記改變我AddItem
函數Hero
我冒着很多麻煩。
我的AddItem功能成爲
public void AddItem(Item item){
item.AddToHero(this);
}
我的項目類變成:
我的不尊重SRP第二個解決方案
public abstract class Item
{
private string _Name{get;set;}
public string Name
{
get
{
return _Name;
}
protected set
{
if (_Name != value)
{
_Name = value;
}
}
}
public abstract void AddToHero(Hero hero);
}
public class QuestItem: Item
{
public QuestItem(String name)
{
Name = name;
}
public override void AddToHero(Hero hero)
{
//Do my stuff to add my QuestItem to Hero
}
}
public class BackpackItem: Item
{
public BackpackItem(String name)
{
Name = name;
}
public override void AddToHero(Hero hero)
{
//Do my stuff to add my BackpackItem to Hero
}
}
優勢:我無法忘記從add方法一個新的Item類,因爲我在編譯時會出錯。 缺點:我不尊重SRP,但現在我不明白爲什麼它會如此糟糕。
我更喜歡使用什麼實現? (另一個?)
你只是感興趣的SRP,或所有的SOLID?因爲在第一個例子中,Hero.AddItem方法違反了打開/關閉原則。 –
我對如何學習/應用最佳實踐感興趣,以提高我的代碼質量。 所以我應該/可以改變的任何事情。 – Belterius