我最近开始学习SOLID Principles。我对SOLID中的"D“有个问题。依赖倒置原则。我看了一段来自Tim Corey的Youtube视频,他在视频中解释说,每当我使用“新”关键字时,它的意思是紧凑的优惠券,这是不好的。
这只适用于我创建的类吗?或者它也适用于其他东西,比如System.Windows.Controls.MenuItem。如果是这样,那么列表、StringBuilder等又如何呢?
谢谢你的帮助。
发布于 2021-01-18 18:17:55
依赖反转原则(DIP)指出,高级类不能依赖于较低级别的类。它们必须都依赖于抽象。其次,抽象不能依赖于细节,但细节必须依赖于抽象。这将确保类以及最终整个应用程序非常健壮,并且易于维护和扩展。
// Not following the Dependency Inversion Principle
blic class SalaryCalculator
{
public float CalculateSalary(int hoursWorked, float hourlyRate) => hoursWorked * hourlyRate;
}
public class EmployeeDetails
{
public int HoursWorked { get; set; }
public int HourlyRate { get; set; }
public float GetSalary()
{
var salaryCalculator = new SalaryCalculator();
return salaryCalculator.CalculateSalary(HoursWorked, HourlyRate);
}
} 这些类不遵循“依赖反转原则”,因为较高级别的类EmployeeDetails直接依赖于较低级别的SalaryCalculator类。我们可以像下面这样解决这个问题:
// Following the Dependency Inversion Principle
public interface ISalaryCalculator
{
float CalculateSalary(int hoursWorked, float hourlyRate);
}
public class SalaryCalculatorModified : ISalaryCalculator
{
public float CalculateSalary(int hoursWorked, float hourlyRate) => hoursWorked * hourlyRate;
}
public class EmployeeDetailsModified
{
private readonly ISalaryCalculator _salaryCalculator;
public int HoursWorked { get; set; }
public int HourlyRate { get; set; }
public EmployeeDetailsModified(ISalaryCalculator salaryCalculator)
{
_salaryCalculator = salaryCalculator;
}
public float GetSalary()
{
return _salaryCalculator.CalculateSalary(HoursWorked, HourlyRate);
}
} 在上面的代码中,我们看到我们已经创建了一个接口ISalaryCalculator,然后我们有一个名为SalaryCalculatorModified的类来实现这个接口。最后,在更高级别的类EmployeeDetailsModified中,我们只依赖于ISalaryCalculator接口,而不依赖于具体的类。
发布于 2021-01-29 08:27:57
我喜欢从这样的角度出发,因为所有的实体原则都是面向对象的,这意味着它们适用于对象(具有状态和行为),而不是数据结构(仅具有状态)或抽象数据类型(其唯一目的是传达状态)。
这意味着List、StringBuilder等被排除在外。请注意,DIP不仅仅是“对接口进行编程”。您仍然应该将所有变量声明为最抽象的可行类型,但这并不是问题所在。您可以直接依赖于数据结构和ADT。
任何依赖于其行为的类都应该颠倒依赖关系。这包括您在其他类中编写的业务逻辑,以及您使用的第三方服务。
https://stackoverflow.com/questions/65772258
复制相似问题