程序的分解过程
一、主函数
一个程序解决一个问题。
那么就可以用一个主函数解决这个问题。
二、子程序
这个函数会变得很长,读起来很辛苦,咋办?分解成若干子程序,让主函数调用他们。那么怎么划分?基于什么原则?
子程序的划分,基于逻辑层次;阅读是基于一定层次的,比如事件的概要和事件的细节的差别;文章的目录和文章的内容的区别;要想快速的了解一件事,只需要知道概要便可以。主函数就是记录概要的地方,而子程序是具体的内容;假如子程序还是太复杂,那么还能细分成子子程序,由子程序在它的层面上去提取概要信息。
是否可以无限的细分下去?直到子程序变得足够简单?最好不要!子程序是一个片段,相当于把一个完整的流程给片面化,那么这个子程序本身就是难以理解的。细分太多,要了解完整的流程就变得异常困难。因此,层次最好不要超过三层。
另外一点,程序不是以其长短来决定是否应该划分成子程序的,而是以是否存在逻辑层次的界线来划分子程序;如果从认识上、理解上都是一个层面的内容,那么就算再长也没有必要分成若干小节的子程序。
三、函数
比子程序更好的办法是用子函数去细分主函数。子程序之所以难以理解,在于它自身并不是独立的,而是主流程的一个片段,而函数是独立的,只依赖于参数(这是和子程序的区别)。不管在什么层面上,用相同的参数调用函数都是得到相同的结果,它是独立的,上下文无关的。但是这种独立性也是需要代价的,函数比子程序要难写,要具备更加整体的思维,对输入输出有更准确的把握。函数也无法完全的代替子程序,因为函数是基于参数抽象的,而子过程是主流程的概要,两种思维模型有差异,很难一一对应起来。
四、抽象数据类型
当子函数变得过多,就会发现,函数不过是围绕参数做工作的工具。这些参数就是一组数据,一组状态,而且这些状态对应着若干个函数,是一对多的关系,因此这些对应的若干个函数就相当于围绕这个状态组合的工具,出现明显的主从关系。通过抽象数据类型,把相关的参数合并为一个类型,然后关联操作他们的函数,得到一个稳固的抽象体。这进一步优化了程序的结构。
五、对象
抽象数据类型的进化就是对象,对象对状态做进一步的封装,让外界无法直接操作数据,从而加强其独立性。
六、面向对象
完善的利用对象的理论,就是面向对象。面向对象确定了三件事:1、创建对象的标准;2、操作对象的界面;3、对象间交互通信的方式。面向对象最本质的特征,是分离了界面和实体。基于面向对象方式的程序,可以不修改用户代码的情况下,增加不同的实现个体,从而正式划分了服务对象和用户对象的区别。