迪米特法则
迪米特法则(Law of Demeter(LOD)),也叫最少知识原则,它强调一个对象应当尽可能少地了解其他对象的内部细节。
也可以理解为:只和你的直接朋友说话,不去和朋友的朋友说话,对你来说他是陌生人 ,你可以调用你自己的方法、你字段的方法、方法参数或返回值的方法,但!不要一层一层找别人的朋友!
例子
违反迪米特法则的例子
你有没有见过这种代码?感觉像在窥探别人的隐私
csharp
player.GetWeapon().GetAmmo().Decrease();gdscript
player.get_weapon().get_ammo().decrease()乍一看没啥问题,但想想看:
player要知道WeaponWeapon要知道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 的内部细节高层对象只和“熟人”打交道,内部细节都藏起来