面向对象中的两个基本原则
Liskov替代原则(LSP):
一个类的实例应该完成其超类的实例的所有功能。
举例:在数学上,圆是椭圆的特例,但是在面向对象中,一些椭圆的某些行为也是圆所不具备的。例如一个椭圆的高可以是宽的两倍,但是圆就不具备这个特点。
Demeter法则(LoD):
非正式说,这个法则认为每个方法只应该向有限的几个对象发送消息,这些对象包括:作为参数的对象,表示当前对象的伪变量(即this),以及当前对象的直接组成部分。
举例:将定我们现在有一个类A,用于使用远程计算机处理数据,有一个管理远程计算机的类B,A有一个方法接受B参数对象,B对象有一个保存远程计算机IP的属性C,C可以返回指定IP的远程计算机D,而D就代表了B对象的IP,假定我们要处理数据了,要判断远程计算机D是否可用,可能我们会写
if (b.C.IsActive())
{
//...
}
这样就违背了LoD,因为b.C既不是一个参数,也不是当前对象(this)的一个属性。我们假设C位置所代表的机器IP是可变的,这样一旦IP发生了细微变化,C发生了任何微妙的变化都会使程序产生错误。
一个类的实例应该完成其超类的实例的所有功能。
举例:在数学上,圆是椭圆的特例,但是在面向对象中,一些椭圆的某些行为也是圆所不具备的。例如一个椭圆的高可以是宽的两倍,但是圆就不具备这个特点。
Demeter法则(LoD):
非正式说,这个法则认为每个方法只应该向有限的几个对象发送消息,这些对象包括:作为参数的对象,表示当前对象的伪变量(即this),以及当前对象的直接组成部分。
举例:将定我们现在有一个类A,用于使用远程计算机处理数据,有一个管理远程计算机的类B,A有一个方法接受B参数对象,B对象有一个保存远程计算机IP的属性C,C可以返回指定IP的远程计算机D,而D就代表了B对象的IP,假定我们要处理数据了,要判断远程计算机D是否可用,可能我们会写
if (b.C.IsActive())
{
//...
}
这样就违背了LoD,因为b.C既不是一个参数,也不是当前对象(this)的一个属性。我们假设C位置所代表的机器IP是可变的,这样一旦IP发生了细微变化,C发生了任何微妙的变化都会使程序产生错误。