关于迪米特法则(最少知识原则): 写一段代码违反它, 然后修复它。

东白随记
0 评论
/ /
0 阅读
/
2212 字
05 2021-06

迪米特法则(Law of Demeter,也称为最少知识原则)是一个面向对象编程的原则,它指出一个对象应该对其他对象有最少的了解。这有助于减少类之间的耦合度,使代码更易于维护和理解。

下面是一个简单的例子,其中违反了迪米特法则的代码:

违反迪米特法则的代码示例:

```python

class Order:

def __init__(self, customer_name):

self.customer_name = customer_name

def deliver(self, delivery_person):

delivery_person.deliver_order(self) # 这里直接调用了delivery_person的deliver_order方法

class DeliveryPerson:

def deliver_order(self, order):

print(f"Delivery person is delivering order for {order.customer_name}")

# 这里的实现逻辑需要了解Order的内部状态和具体细节

# 使用代码示例

order = Order("John Doe")

delivery_person = DeliveryPerson()

order.deliver(delivery_person) # 违反迪米特法则,因为Order类直接调用了DeliveryPerson的deliver_order方法

```

在这个例子中,`Order` 类直接调用了 `DeliveryPerson` 类的 `deliver_order` 方法。这违反了迪米特法则,因为 `Order` 类需要知道 `DeliveryPerson` 类的实现细节。这增加了类之间的耦合度,使得代码难以维护和理解。

修复代码以遵守迪米特法则:

```python

class Order:

def __init__(self, customer_name):

self.customer_name = customer_name

self.delivery_service = DeliveryService() # 引入中介者模式,使用DeliveryService作为中介者

def deliver(self):

self.delivery_service.deliver(self) # 将delivery逻辑委托给中介者处理

class DeliveryService: # 这是我们的中介者,处理所有订单的配送逻辑,不与特定的Order或DeliveryPerson耦合。

def deliver(self, order):

delivery_person = DeliveryPerson() # 这里我们注入了一个新的delivery person,这样Order和DeliveryPerson解耦了。

delivery_person.deliver_order(order) # 通过中介者进行沟通,实现了解耦。

print("Order delivery process completed.") # 中介者负责确保整个流程完成。

return order.customer_name # 可以根据业务需求返回相关信息等。

class DeliveryPerson:

def deliver_order(self, order): # 这个方法只需要处理和订单相关的具体配送操作,无需知道订单的具体内容。这样与Order的耦合度就降低了。

print(f"Delivery person is delivering order for {order.customer_name}") # 执行具体的配送操作。

```

在这个修复后的代码中,我们引入了中介者模式(`DeliveryService`)。通过将 `Order` 和 `DeliveryPerson` 之间的直接通信改为通过 `DeliveryService` 进行通信,我们降低了类之间的耦合度,并遵循了迪米特法则。