首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖倒置。它是否适用于列表、Windows控件等对象?

依赖倒置。它是否适用于列表、Windows控件等对象?
EN

Stack Overflow用户
提问于 2021-01-18 17:56:31
回答 2查看 38关注 0票数 1

我最近开始学习SOLID Principles。我对SOLID中的"D“有个问题。依赖倒置原则。我看了一段来自Tim Corey的Youtube视频,他在视频中解释说,每当我使用“新”关键字时,它的意思是紧凑的优惠券,这是不好的。

这只适用于我创建的类吗?或者它也适用于其他东西,比如System.Windows.Controls.MenuItem。如果是这样,那么列表、StringBuilder等又如何呢?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2021-01-18 18:17:55

依赖反转原则(DIP)指出,高级类不能依赖于较低级别的类。它们必须都依赖于抽象。其次,抽象不能依赖于细节,但细节必须依赖于抽象。这将确保类以及最终整个应用程序非常健壮,并且易于维护和扩展。

代码语言:javascript
复制
// 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类。我们可以像下面这样解决这个问题:

代码语言:javascript
复制
// 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接口,而不依赖于具体的类。

票数 0
EN

Stack Overflow用户

发布于 2021-01-29 08:27:57

我喜欢从这样的角度出发,因为所有的实体原则都是面向对象的,这意味着它们适用于对象(具有状态和行为),而不是数据结构(仅具有状态)或抽象数据类型(其唯一目的是传达状态)。

这意味着ListStringBuilder等被排除在外。请注意,DIP不仅仅是“对接口进行编程”。您仍然应该将所有变量声明为最抽象的可行类型,但这并不是问题所在。您可以直接依赖于数据结构和ADT。

任何依赖于其行为的类都应该颠倒依赖关系。这包括您在其他类中编写的业务逻辑,以及您使用的第三方服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65772258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档