举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。

  如果考虑面向对象方法来做,不能什么代码都塞到main过程里面,假设我们设计三个类:

  一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送;

  一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;

  一个主类负责从命令读参数,处理命令行参数,调用发email的类。

  把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。

  仔细的分析一下,会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。这样的分析方法其实是不适用于面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java/C++实现起来轻松的多,逻辑上也清楚的多。面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,领会了面向对象的思维方法。

  那么应用面向对象的方法逮怎么做呢?

  对于一个邮件来说,有邮件头,邮件体,和邮件地址这三个属性,发送邮件,需要一个发送的方法,另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计:

  类 JunkMail

  属性:

  head

  body

  address

  方法:

  sendMail() // 发送邮件

  listAllMail() // 列邮件地址

  这够了。

  如果说传统的面向过程的编程是符合机器运行指令的流程的话,那么面向对象的思维方法是符合现实生活中人类解决问题的思维过程。

  在面向对象的软件分析和设计的时候,要提醒自己,不要一上来去想程序代码的实现,应该抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体,业务才是我们真正要实现的目标。

  在设计的时候不应过早的考虑具体程序语言的实现,必须用抽象的方法,和具体实现无关的方法来表达业务逻辑。