Es fällt mir schwer zu verstehen, ob es manchmal akzeptabel ist, das Prinzip der einfachen Verantwortung zu brechen, oder ob es um jeden Preis vermieden werden sollte.Sollte SRP immer respektiert werden?
Bitte beachten Sie, dass der folgende Code vereinfacht wurde, um nur den relevanten Teil zu behalten.
Ich habe Hero
Klasse, die ein Zeichen darstellen, kann es mehrere verschiedene Items
besitzen.
Ich habe mehrere Klassen, die von Items
erben, zum Beispiel QuestItems
und BackpackItems
.
Wenn ich eine Item
auf meiner Hero
hinzufügen möchte, je nach Art der Item
sollte ich anders handeln.
Ich habe 2 verschiedene Art und Weise versucht, dass die erste zu tun, um die SRP zu respektieren:
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;
}
}
}
Vorteile: SRP
Nachteil respektiert wird: wenn ich ein neues Element erben Art von Item
und vergessen eröffne mein zu ändern AddItem
Funktion in Hero
Ich riskiere eine Menge Ärger.
Meine zweite Lösung, die nicht SRP nicht respektiert:
meine AddItem Funktion
public void AddItem(Item item){
item.AddToHero(this);
}
werden meine Artikel Klasse geworden:
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
}
}
Vorteil: Ich kann die Methode add vergessen aus eine neue Item Art, da ich zur Kompilierzeit einen Fehler habe. Nachteil: Ich respektiere SRP nicht, aber ich verstehe im Moment nicht wirklich, warum es so schlimm wäre.
Welche Implementierung sollte ich bevorzugen? (ein anderer?)
Sind Sie nur interessiert an SRP oder alle von SOLID? Weil im ersten Beispiel die Hero.AddItem-Methode das Open/Close-Prinzip bricht. –
Ich bin daran interessiert, wie ich die Best Practice lernen/anwenden kann, um meine Codequalität zu verbessern. Also alles was ich wirklich ändern sollte/könnte. – Belterius