学习.NET架构设计系列:Hello world的时代(4)
比如刚才那个Email服务器的问题,在流程不确定的情况下,我们可以先看看这个Email服务器里面有哪些东西,最明显的,应该有Email类。Email类有三个行为:接收(Receive)、显示(Show)和下载(Download)。垃圾邮件是邮件的一个特例,可以看作Email的一个子类,如下:
JunkMail覆盖了Email的接收、显示和下载方法。如果垃圾邮件应该有一些特别的处理方式,就可以只修改JunkMail类――在接收时移至垃圾邮件夹、或者在显示的时候加上一个警示标志、下载时过滤掉其中的非文本内容――没有其他类的代码需要改动。这样不会对普通邮件的处理流程产生任何影响。
面向过程和面向对象这两种编程思想的区别在于:他们对于需求的理解是不一样的。面向过程的编程人员,他们把需求理解成一条一条的业务流程,他们喜欢问用户“你的业务流程是什么样的?”,然后他们分析这些流程,把这些流程交织组合在一起,最后实现了需求;面向对象的编程人员,他们把需求理解成一个一个的对象,他们喜欢问用户“这个东西叫做什么,他从哪里来,他能做什么事情?”,然后他们制造这些对象,让这些对象互相调用,符合了业务需要。关于这两种编程方式的对比,在后面的章节中会有具体的说明。这里简单的说两点:
1、对象比流程更加稳定。业务流程的制定需要受到很多条件的限制,甚至程序的效率、运行方式都会反过来影响业务流程。有时候用户也会为了更好的实现商业目的,主动的改变业务流程,并且一个流程的变化经常会带来一系列的变化。这就使得按照业务流程设计的程序经常面临变化。
2、对象比流程更加封闭。业务流程从表面上看只有一个入口、一个出口,但是实际上,流程的每一步都可能改变某个数据的内容、改变某个设备的状态,对外界产生影响。而对象则是完全通过接口与外界联系,接口内部的事情与外界无关。
按照面向对象的编程方式,我们要用对象来体现现实世界中出现的事物。如果需求比较复杂,这样会造成程序里出现大量的对象、复杂的关系,修改程序的时候越来越麻烦。其实一些对象之间总是有着比较固定的关系,有的对象之间是包含的关系,有的是依赖的关系,有的对象是别的对象的创建者……有经验的程序员会从这些关系中发现一些规律,寻找出处理这些关系的一些方法,这就形成了设计模式。比如一个通信公司为他的用户设置各种套餐,用户选择不同的套餐,通话就采用不同的计费策略,这种情况可以采用Strategy模式;一家销售自行车的公司同时销售自行车的零件,有的零件是多个零件的组合,又可以和别的零件组合成一个更大的零件,这就可以采用Composite模式。有时候程序员可以从模式中获得设计的灵感,对软件的整体构架产生影响。在以后的章节中我会对设计模式进行介绍。
软件开发思想经过了几十年的发展。最早的面条式的代码,一个中学生很快就能学会,可以立即用它来解决一个多元多次方程;后来发展到结构化编程,把代码分割成了多个模块,增强了代码的复用性,方便了调试和修改,但是结构也复杂了很多。最早的编程方式是面向过程的,非常直观,一个初学者很快就可以理解;后来有了面向对象的方式,问题的解决看上去不再这么直截了当,需要首先开发业务对象,然后才能实现业务流程。随着面向对象编程方式的发展,又出现了设计模式、MVC、ORM、以及不计其数的工具、框架。软件为什么会越来越复杂呢?其实这不是软件本身的原因,而是因为软件需要解决的需求越来越复杂了。
最早的计算机只需要帮助人们做纯粹的计算任务,他用插头和开关作为输入设备,用信号灯做输出设备,没有存储器,也没有程序。当时人们需要计算机,只是想让他帮助人们在人口普查、天气预报这样的事情中担任计算任务。早期的计算机曾经参与了曼哈顿计划,最初军方雇用了大约100名计算员,参与计算原子核裂变的各项数据,但是无法达到满意的进度。后来由于计算机的研制成功,大大加速了原子弹的研制速度,这也加速了第二次世界大战的尽快结束。