迪米特法则

什么是迪米特法则?

迪米特法则,也叫“最少知识原则”(Law of Demeter),是一种编程设计原则。它的核心思想是:一个对象应该尽量少地了解其他对象,特别是它的内部细节。

通俗解释

想象一下,你在家里请了一个清洁工来打扫房间。你只需要告诉他“去打扫客厅”,而不是告诉他如何使用每一件工具、在哪儿找到抹布、以及每个角落怎么清理。如果你告诉清洁工太多细节,这不仅让事情变得复杂,还可能会让清洁工因为不熟悉而做错事情。

在编程中也是一样的,一个对象只需要知道如何与它的直接朋友(其他对象)合作,而不需要知道它的朋友的朋友在做什么。这样可以让系统更容易维护和修改,因为每个对象只需要关注自己的职责,减少了对象之间的相互依赖。

迪米特法则的主要原则
  1. 只与直接朋友通信:一个对象不应该直接调用其他对象内部的成员方法或属性,而是通过公开的接口与直接关联的对象通信。
  2. 少依赖其他对象:尽量减少对象之间的依赖关系,避免一个对象过度依赖另一个对象的内部实现。
  3. 模块化设计:通过遵循迪米特法则,可以让代码更模块化、更容易理解和维护。
具体示例

示例:电话簿查找

假设我们有一个Person类,它包含一个PhoneBook对象(电话簿)。PhoneBook对象可以通过联系Contact对象来获取电话号码。

不遵循迪米特法则的做法:

class Contact:
    def __init__(self, phone_number):
        self.phone_number = phone_number

class PhoneBook:
    def __init__(self):
        self.contacts = {}
    
    def add_contact(self, name, contact):
        self.contacts[name] = contact
    
    def get_contact(self, name):
        return self.contacts.get(name)

class Person:
    def __init__(self, phone_book):
        self.phone_book = phone_book
    
    def get_phone_number(self, name):
        # 直接获取联系人信息,再获取电话号码
        return self.phone_book.get_contact(name).phone_number

# 使用示例
phone_book = PhoneBook()
phone_book.add_contact("Alice", Contact("123-456-7890"))

person = Person(phone_book)
print(person.get_phone_number("Alice"))  # 输出: 123-456-7890

在这个例子中,Person类需要了解PhoneBook的内部结构,以及Contact类的细节。这样做违反了迪米特法则。

遵循迪米特法则的做法:

class Contact:
    def __init__(self, phone_number):
        self.phone_number = phone_number
    
    def get_phone_number(self):
        return self.phone_number

class PhoneBook:
    def __init__(self):
        self.contacts = {}
    
    def add_contact(self, name, contact):
        self.contacts[name] = contact
    
    def get_phone_number(self, name):
        contact = self.contacts.get(name)
        if contact:
            return contact.get_phone_number()
        return None

class Person:
    def __init__(self, phone_book):
        self.phone_book = phone_book
    
    def get_phone_number(self, name):
        # 直接通过PhoneBook获取电话号码
        return self.phone_book.get_phone_number(name)

# 使用示例
phone_book = PhoneBook()
phone_book.add_contact("Alice", Contact("123-456-7890"))

person = Person(phone_book)
print(person.get_phone_number("Alice"))  # 输出: 123-456-7890

在这个版本中,Person类不需要了解Contact类的细节。它只与PhoneBook对象打交道,让PhoneBook负责与Contact的交互。这种做法符合迪米特法则,因为Person类只和它直接的朋友——PhoneBook类通信。

总结

迪米特法则的目的是降低代码的复杂性和耦合度,让代码更容易维护和扩展。通过遵循这个法则,你可以设计出更模块化、易于理解的系统,减少因修改代码而引发的问题。

你可能感兴趣的:(架构设计,迪米特法则,系统架构)