📜  依赖倒置原则 (SOLID)

📅  最后修改于: 2021-09-10 02:46:10             🧑  作者: Mango

让我们了解 SOLID 原则组的关键原则之一,即依赖倒置原则。

依赖倒置原则是大多数设计模式所依据的原则之一。依赖倒置讨论了不同类或模块之间的耦合。它侧重于较高类不依赖于较低类而是依赖于较低类的抽象的方法。依赖倒置的主要格言是任何更高的类都应该始终依赖于类的抽象而不是细节

这种旨在减少类之间耦合的目的是通过在层之间引入抽象来实现的,因此并不关心真正的实现。

我们通过一个例子来理解依赖倒置原理。假设您是一名经理,有一些人作为员工,其中一些人是开发人员,一些人是平面设计师,其余的人是测试人员。

现在让我们看看一个简单的设计在没有任何依赖倒置的情况下会是什么样子,以及该设计中的漏洞是什么。

class Manager(object):
    def __init__(self):
        self.developers=[]
        self.designers=[]
        self.testers=[]
  
    def addDeveloper(self,dev):
        self.developers.append(dev)
          
    def addDesigners(self,design):
        self.designers.append(design)
          
    def addTesters(self,testers):
        self.testers.append(testers)
  
      
class Developer(object):
    def __init__(self):
        print "developer added"
      
class Designer(object):
    def __init__(self):
        print "designer added"
      
class Testers(object):
    def __init__(self):
        print "tester added"
      
if __name__ == "__main__":
    a=Manager()
    a.addDeveloper(Developer())
    a.addDesigners(Designer())
Output :
  developer added
  designer added

这可以通过以下 UML 图表轻松形象化。

11

现在,让我们看看源代码中的设计循环漏洞:
首先,您已经将有关下层的所有内容都暴露给了上层,因此没有提到抽象。这意味着经理必须已经知道他可以监督的工人类型。

现在,如果经理管理另一种类型的工人,比如 QA(质量保证),那么整个班级都需要重新调整。这就是依赖倒置原理的用武之地。

让我们看看如何使用依赖倒置原则更好地解决问题。

class Employee(object):
    def Work():
        pass
      
class Manager():
    def __init__(self):
        self.employees=[]
    def addEmployee(self,a):
        self.employees.append(a)
   
class Developer(Employee):
    def __init__(self):
        print "developer added"
    def Work():
        print "turning coffee into code"
          
class Designer(Employee):
    def __init__(self):
        print "designer added"
    def Work():
        print "turning lines to wireframes"
          
class Testers(Employee):
    def __init__(self):
        print "tester added"
    def Work():
        print "testing everything out there"
          
if __name__ == "__main__":
    a=Manager()
    a.addEmployee(Developer())
    a.addEmployee(Designer())
Output :
  developer added
  designer added

现在,如果添加了任何其他类型的员工,则可以简单地将其添加到经理,而无需让经理明确意识到这一点。现在要添加另一类员工,我们可以简单地调用

class QA(Employee):
        def Work():
             print "testing everything out there"
a.add(QA())

不同员工和经理之间抽象的创建产生了非常漂亮的设计代码,易于维护和扩展。请查看下面的 UML 图。

22

在这段代码中,经理事先并不知道可能属于他/她的所有类型的工人,从而使代码真正解耦。有许多设计模式,其中这是一个核心思想,其他东西都建立在它之上。