编辑
2023-06-19
Csharp/dotNet
0
请注意,本文编写于 522 天前,最后修改于 512 天前,其中某些信息可能已经过时。

迪米特法则(Law of Demeter),也被称为最少知识原则(Principle of Least Knowledge),是面向对象设计中的一个原则。它强调一个对象应该尽可能少地了解其他对象的内部结构和实现细节,以减少对象之间的耦合性。 迪米特法则的核心思想是,一个对象应该只与其直接的朋友进行交互,而不与陌生的对象进行直接交互。这里的朋友指的是以下几种对象:

该对象本身 该对象的成员对象 作为方法参数传递的对象 该对象创建的对象

迪米特法则的目标是降低对象之间的耦合性,提高系统的可维护性和可扩展性。通过遵循迪米特法则,可以减少对象之间的依赖关系,使系统更加灵活和易于修改。 遵循迪米特法则的一些具体实践包括:

尽量将对象的成员变量设置为私有,通过提供公共方法来访问和操作这些成员变量。 在方法中尽量减少参数的数量,避免传递过多的对象。 避免在一个方法中直接调用其他对象的方法,而是通过对象的成员方法来间接调用。 尽量避免在一个类中创建过多的对象,将对象的创建和管理交给专门的工厂类或者依赖注入容器。

通过遵循迪米特法则,可以提高代码的可维护性和可测试性,减少代码的耦合性,使系统更加灵活和易于扩展。

假设我们有一个电商系统,其中包含了用户(User)、订单(Order)和商品(Product)三个类。现在我们来展示在遵循迪米特法则前后的对比。 在不遵循迪米特法则的情况下,代码可能如下所示: public class User { public string Name { get; set; } public List Orders { get; set; }

public void PrintAllOrderDetails() { foreach (var order in Orders) { Console.WriteLine($"Order ID: {order.Id}"); Console.WriteLine($"Order Date: {order.Date}"); Console.WriteLine($"Order Total: {order.GetTotal()}"); Console.WriteLine($"Order Products: "); foreach (var product in order.Products) { Console.WriteLine($"- {product.Name}"); } Console.WriteLine(); } }

}

public class Order { public int Id { get; set; } public DateTime Date { get; set; } public List Products { get; set; }

public decimal GetTotal() { decimal total = 0; foreach (var product in Products) { total += product.Price; } return total; }

}

public class Product { public string Name { get; set; } public decimal Price { get; set; } }

在上述代码中,User类直接访问了Order和Product类的内部结构,包括订单的ID、日期、产品列表以及产品的名称和价格。这样的设计违反了迪米特法则,导致User类对其他类的了解过多,增加了耦合性。 现在,我们来遵循迪米特法则进行重构: public class User { public string Name { get; set; } public List Orders { get; set; }

public void PrintAllOrderDetails() { foreach (var order in Orders) { Console.WriteLine($"Order ID: {order.Id}"); Console.WriteLine($"Order Date: {order.Date}"); Console.WriteLine($"Order Total: {order.GetTotal()}"); Console.WriteLine($"Order Products: "); foreach (var product in order.GetProductNames()) { Console.WriteLine($"- {product}"); } Console.WriteLine(); } }

}

public class Order { public int Id { get; set; } public DateTime Date { get; set; } private List Products { get; set; }

public decimal GetTotal() { decimal total = 0; foreach (var product in Products) { total += product.Price; } return total; } public List<string> GetProductNames() { return Products.Select(p => p.Name).ToList(); }

}

public class Product { public string Name { get; set; } public decimal Price { get; set; } }

在重构后的代码中,User类不再直接访问Order和Product类的内部结构,而是通过Order类的公共方法GetProductNames()来获取订单中的产品名称列表。这样,User类只与Order类进行交互,减少了对其他类的了解,降低了耦合性。 通过遵循迪米特法则,我们将代码进行了重构,使得各个类之间的关系更加清晰,减少了耦合性,提高了代码的可维护性和可扩展性。

本文作者:宁骑

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!