迪米特法则(Law of Demeter)
迪米特法则(Law of Demeter)也叫最少知识原则(Least Knowledge Principle),它是一种面向对象设计原则,旨在降低软件系统中对象之间的耦合度。
定义
迪米特法则是说,一个对象应该仅与其密切的朋友交流,而不与陌生人交流。所谓的“朋友”,是指直接依赖的对象,包括以下几种:
- 该对象本身
- 被当作参数传入的对象
- 此方法的返回值
- 此方法所创建或实例化的对象
优点
迪米特法则可以帮助降低系统中的耦合度,提高系统的可维护性、可拓展性、可读性、稳定性和重用性。当系统中各个对象之间的关系合理、紧密且清晰明了时,就可以更容易地对系统进行维护、修改、扩展以及重构。
如何实现
实现迪米特法则的关键在于尽量减少对象之间的直接依赖关系,可以采用如下方法:
- 将某些公共操作封装起来,转化为共享模块。
- 尽量减少对象的行为,尽量保持属性的简单,并用该属性避免方法调用。
- 在创建对象时,尽量将对象的信息注入到对象内部,而不是在外部直接操作,从而减少对象之间的交互。
实例
下面给出一个违反迪米特法则的例子:
class A:
def __init__(self):
self.b = B()
def do_something(self):
self.b.action()
class B:
def __init__(self):
self.c = C()
def action(self):
self.c.action()
class C:
def action(self):
print('Do something in C')
a = A()
a.do_something()
以上代码中,类A直接调用了类B和类C的方法,从而导致A、B、C之间的联系非常紧密。如果要对其中任何一个类进行修改,会引起整个系统的变化,这样就会变得非常困难和危险。
现在,我们来修改一下代码,使其符合迪米特法则:
class A:
def __init__(self, b):
self.b = b
def do_something(self):
self.b.action()
class B:
def __init__(self):
self.c = C()
def action(self):
self.c.action()
class C:
def action(self):
print('Do something in C')
c = C()
b = B()
a = A(b)
a.do_something()
我们将B类的实例化移到了外部,让外部来负责实例化并注入给A类,从而实现了A、B、C之间的松耦合,也更容易进行单元测试。这个模式常常被称为依赖注入或控制反转(Dependency Injection, Inversion of Control, IOC)。
总结
迪米特法则是一种十分实用的面向对象设计原则,能使软件系统更稳定、可扩展和可读,同时也提高了系统的可维护性和重用性。当系统中各个对象之间的关系合理、紧密且清晰明了时,才能更容易地对系统进行维护、修改、扩展以及重构。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:迪米特法则(lawofdemeter) - Python技术站