Ich machte das folgende Codebeispiel, um zu lernen, wie man eine Generics-Methodensignatur verwendet.Ist dies ein Beispiel für das Prinzip der einfachen Verantwortung?
Um Display() -Methode sowohl für Kunden und Mitarbeiter zu bekommen, begann ich tatsächlich meinen IPerson Schnittstelle mit einer Person abstrakten Klasse zu ersetzen.
Aber dann hörte ich auf, um einen Podcast, in dem Onkel Bob Erinnerung erzählt Scott Hanselman über das Einzel Prinzip Verantwortung, in dem Sie viele kleinen Klassen jeder tut eine bestimmte Sache haben sollten, dh dass eine Customer-Klasse sollte nicht ein Print() und Save() und CalculateSalary() Methode aber, dass Sie sollten eine CustomerPrinter Klasse und eine CustomerSaver Klasse und ein KundeSalaryCalculator Klasse.
Das scheint eine seltsame Art zu programmieren. Allerdings loswerden meiner Schnittstelle fühlte auch falsch (da so viele IoC-Container und DI-Beispiele sie inhärent verwenden), so beschloss ich, die Single-Verantwortung-Prinzip zu versuchen.
Also der folgende Code ist anders als ich in der Vergangenheit programmiert habe (ich hätte eine abstrakte Klasse mit einer Display() -Methode gemacht und die Schnittstelle los) aber basierend auf was ich über Entkopplung und gehört habe der SOLIDE Prinzipien, diese neue Art der Codierung (die Schnittstelle und die PersonDisplayer-Klasse) Ich denke, das ist der richtige Weg zu gehen.
Ich würde gern hören, wenn andere auf diese Weise zu diesem Thema denken oder positive oder negative Auswirkungen davon erfahren haben (z. B. eine unhandliche Anzahl von Klassen, die jeweils eine bestimmte Sache tun, usw.).
using System;
namespace TestGeneric33
{
class Program
{
static void Main(string[] args)
{
Container container = new Container();
Customer customer1 = container.InstantiateType<Customer>("Jim", "Smith");
Employee employee1 = container.InstantiateType<Employee>("Joe", "Thompson");
Console.WriteLine(PersonDisplayer.SimpleDisplay(customer1));
Console.WriteLine(PersonDisplayer.SimpleDisplay(employee1));
Console.ReadLine();
}
}
public class Container
{
public T InstantiateType<T>(string firstName, string lastName) where T : IPerson, new()
{
T obj = new T();
obj.FirstName = firstName;
obj.LastName = lastName;
return obj;
}
}
public interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
public class PersonDisplayer
{
private IPerson _person;
public PersonDisplayer(IPerson person)
{
_person = person;
}
public string SimpleDisplay()
{
return String.Format("{1}, {0}", _person.FirstName, _person.LastName);
}
public static string SimpleDisplay(IPerson person)
{
PersonDisplayer personDisplayer = new PersonDisplayer(person);
return personDisplayer.SimpleDisplay();
}
}
public class Customer : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
}
public class Employee : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int EmployeeNumber { get; set; }
}
}
Ähnliche Fragen http://stackoverflow.com/questions/1215442/confused-about-single-responsibility-principle-in-the-following-example –