【发布时间】:2009-03-18 17:11:52
【问题描述】:
我制作了以下代码示例来学习如何使用泛型方法签名。
为了为 Customer 和 Employee 获得一个 Display() 方法,我实际上开始用 Person 抽象类替换我的 IPerson 接口 >。
但后来我停了下来,想起了一个播客,其中 Bob 叔叔告诉 Scott Hanselman 关于单一职责原则,你应该有很多小班,每个班都做一件特定的事情,即客户类不应该有 Print() 和 Save() 和 CalculateSalary() 方法,但你应该有一个 CustomerPrinter 类和一个 CustomerSaver 类和一个 CustomerSalaryCalculator 类。
这似乎是一种奇怪的编程方式。然而,摆脱我的界面也感觉不对(因为有这么多 IoC 容器和 DI 示例固有地使用它们)所以我决定尝试单一职责原则。
所以以下代码与我过去编写的代码不同(我会使用 Display() 方法创建一个抽象类并摆脱接口)但基于我所拥有的听说过解耦和 SOLID原则,这种新的编码方式(界面和 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; }
}
}
【问题讨论】:
标签: c# design-patterns solid-principles