gpt4 book ai didi

c# - 这是单一职责原则的一个例子吗?

转载 作者:太空狗 更新时间:2023-10-29 21:00:33 25 4
gpt4 key购买 nike

我制作了以下代码示例来学习如何使用泛型方法签名。

为了获得 Customer 和 Employee 的 Display() 方法,我实际上开始用 Person 抽象类替换我的 IPerson 接口(interface)>。

但后来我停了下来,想起一个播客,Bob 叔叔在播客中告诉 Scott Hanselman 单一职责原则,在这个原则中你应该有很多小类,每个类都做一件特定的事情,即一个客户类不应该有 Print()Save()CalculateSalary() 方法,但你应该有一个 CustomerPrinter 类 和一个CustomerSaver 类 和一个CustomerSalaryCalculator 类

这似乎是一种奇怪的编程方式。然而,摆脱我的界面也感觉不对(因为很多 IoC 容器和 DI 示例固有地使用它们)所以我决定尝试一下单一职责原则。

所以下面的代码与我过去编写的代码不同(我会用 Display() 方法创建一个抽象类并去掉接口(interface))但是基于我所拥有的听说过去耦和 S.O.L.I.D.原则,这种新的编码方式(接口(interface)和 PersonDisplayer 类)我认为这是正确的方法

想听听其他人在这个问题上是否也有同样的想法,或者是否经历过这方面的积极或消极影响(例如,每个类(class)都做一件特定的事情,等等)。

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; }
}
}

最佳答案

我喜欢想到 Single Responsibility Principle作为 separation of duties 的实现.在我像你们一样开始拆分我的类(class)之前,我试着想一想每个类(class)应该负责什么。

如您所述,您的类非常简单,很适合作为具有实现的 Print()Save() 函数的抽象类。我倾向于保留该设计而不是您当前的设计。

但是,如果打印和保存是更复杂的任务,可能以不同的方式执行,那么专用的 PrinterSaver 类将是必要的,因为现在这个责任是更复杂。创建一个新类的“复杂度”阈值是非常主观的,将取决于具体情况,但最终,代码只是我们低等人类理解的抽象,所以让它成为最直观的。

您的 Container 类有点误导。它实际上并不“包含”任何东西。它实际上实现了 Factory Method Pattern并会因被命名为工厂而受益。

此外,您的 PersonDisplayer 从未被实例化并且可以通过静态方法提供其所有功能,那么为什么不将其设为静态类呢? utility classes 并不少见例如打印机或储户是静态的。除非您需要具有不同属性的打印机的单独实例,否则请保持静态。

关于c# - 这是单一职责原则的一个例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/659232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com