Skip to content

迪米特法则

迪米特法则(Law of Demeter(LOD)),也叫最少知识原则,它强调一个对象应当尽可能少地了解其他对象的内部细节。

也可以理解为:只和你的直接朋友说话,不去和朋友的朋友说话,对你来说他是陌生人 ,你可以调用你自己的方法、你字段的方法、方法参数或返回值的方法,但!不要一层一层找别人的朋友!

例子

违反迪米特法则的例子

你有没有见过这种代码?感觉像在窥探别人的隐私

csharp
player.GetWeapon().GetAmmo().Decrease();
gdscript
player.get_weapon().get_ammo().decrease()

乍一看没啥问题,但想想看:

  • player 要知道 Weapon

  • Weapon 要知道 Ammo

  • 然后你要直接去对 Ammo 扣值…

就像你跟小王借手机,然后点进他微信,找到他妈妈,跟他妈妈说“你儿子欠我钱”这种感觉

更好的写法是我们应该让对象封装好行为,然后只暴露必要的接口:

csharp
// Player.cs
public class Player 
{
    private Weapon _weapon;

    public void Fire() 
    {
        _weapon.Use(); // 只管开火,不管里面有多少子弹
    }
}

// Weapon.cs
public class Weapon 
{
    private Ammo _ammo;

    public void Use()
    {
        _ammo.Decrease(); // Weapon 自己管好 ammo
    }
}
csharp
player.Fire() // 调用行为,不去管 weapon 或 ammo 的内部细节
gdscript
class_name Player

var _weapon: Weapon

func fire():
    _weapon.use()
    
class_name Weapon

var _ammo: Ammo

func use():
    _ammo.decrease()
gdscript
player.fire() # 调用行为,不去管 weapon 或 ammo 的内部细节

高层对象只和“熟人”打交道,内部细节都藏起来