제네릭 메서드 서명을 사용하는 방법을 배우려면 다음 코드 예제를 작성했습니다. 모두 고객과 직원을위한 표시() 메소드를 얻기 위하여이것은 단일 책임 원칙의 예입니까?
, 나는 실제로 사람 추상 클래스 내 IPerson에 인터페이스를 대체하기 시작했다.
하지만 그때 내가있는 삼촌 밥은 당신이 각각 하나의 특정 일을 작은 클래스를 많이해야하는 단일 책임 원칙에 대해 스콧 Hanselman은 이야기 한 팟 캐스트를 기억, 중지, 고객 클래스가 안된다고 즉 인쇄() 및 저장() 및 CalculateSalary() 방법하지만 당신은 CustomerPrinter 클래스과 CustomerSaver 클래스과을해야한다고CustomerSalaryCalculator 클래스.
그건 이상하게 생각합니다. 그러나 내 인터페이스를 제거하는 것은 잘못된 (너무 많은 IoC 컨테이너와 DI 예제가 본질적으로 사용하기 때문에)로 느껴져서 단일 책임 원칙을 시도하기로 결정했습니다.
그래서 다음 코드는 이전에 프로그래밍 한 것보다(나는 Display() 메서드로 추상 클래스를 만들고 인터페이스를 제거했을 것입니다.)하지만 디커플링에 대해 단단한 원리, 이 새로운 코딩 방법 (인터페이스와 PersonDisplayer 클래스) 이것이 올바른 방법이라고 생각합니다..
다른 사람들이이 문제에 대해 동일한 방법으로 생각하거나이 문제에 긍정적 또는 부작용이있는 경우 (예 : 하나의 특정 작업을 수행하는 클래스가 다루기 힘든 경우 등) 듣고 싶습니다.
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; }
}
}
비슷한 질문 http://stackoverflow.com/questions/1215442/confused-about-single-responsibility-principle-in-the-following-example 인터페이스가있는 –