面向对象的思想,先把现实中的对象转化为程序上的对象。
程序,是解决某个问题的相关步骤和次序。而实际很多时候,程序描述的是一个场景活动,首先是有主体,然后是相关活动。程序固有的含义,可能就比较关注活动,而不关注主体。
面向对象,首先要确立活动场景中的主体,也就是对象,在分析主体所担当的职责,也就是功能。过程性的开发方法,强调的是活动,那么活动的主体是什么?是数据,也就是,在过程性的观点下,程序只是数据的变换过程。而面向对象的观点,则是对象之间职责的传递:“我把我的任务完成了,然后交给你接着做”。
过程性的观点是比较低层次的,比较接近计算机的层次,而面向对象,就比较人性化。但是面向对象也离不开过程性的观点,因为程序注定还是要有人去做数据变换。
一个活动场景:办理工商执照。首先办理工商执照需要有场地,资金,合伙人,生产经营必要的工人和工具,同时要经过工商部门的审批。这些就是对象。
归纳了对象之后,往往很自然就会产生类。但是类和对象是不同层次的,对象是类的一个具体例子,类是对象的抽象。就好比3 和 x 在数学里的关系,x这个变量抽象了具体的数字,大大提高了代数式的适用性。
原则上提倡提高抽象的层次来编程,这样会提高程序的适用性。
可惜,类还不是{zg}的抽象层次,因为类和对象是紧密捆绑的,一个类的所有对象的实现都是一致的,只是数值上有细微的不同。就比如每个工商所都是这个xx流程,不同的只是名字。正因为这种局限性,所以才有了接口的出现。接口是不关注实现的,他只关注如何使用这个具体实现。
当我们需要更大的灵活性时,不满足只是数值上的差异时,想要结构上的,根本上的不同实现时,就要基于接口来编程。
另一个方法是产生子类,子类把父类当作接口,但却继承了他的所有实现。有时候方便,因为毕竟你并不需要全盘推倒,只需要修改某些局部实现,但是有时候反而容易搞混。
我认为,当要用子类化的方法编程,首先就要规划好整个类族结构,而不只是简单的为了把父类当作接口。
然后关于类的设计,只有一个简单的原则,“名副其实”。
活动场景中的主体,是为了活动而存在的,因此他也是职责的化身,在这个框架限制内设计对象便可。
然后是活动,面向对象的活动是职责的传递,应该如何构建这个传递过程?是接下来的重点。