面向对象的思维方式

更新时间:2023-07-30 16:48:47 阅读: 评论:0

                  面向对象的思维方式
(注:内容基础,有见解)
怎么设置电脑桌面    我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。
    我对Java的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。
    举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的ndmail命令发送。
    然后考虑用Java来实现,既然是OOP,就不能什么代码都塞到main过程里面,于是就设
计了三个类:
•一个类是负责读取数据库,取邮件地址,调用qmail的ndmail命令发送;
•一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;
•一个主类负责从命令读参数,处理命令行参数,调用发email的类。
    把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。
    仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。
    这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。
    我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要
东江大坝领会了这一点,就领会了面向对象的思维方法。
    举一个非常简单的例子:假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加1,计数器是这样来访问的
    如:i?id=xxx
    后台有一个数据库表,保存每个id(一个id对应一个被统计访问次数的页面)的计数器当前值,请求页面一次,对应id的计数器的字段加1(这里我们忽略并发更新数据库表,出现的表锁定的问题)。
    如果按照一般从程序实现的角度来分析,我们会这样考虑:首先是从HTTP GET请求取到id,然后按照id查数据库表,获得某id对应的访问计数值,然后加1,更新数据库,最后向页面显示访问计数。
    现在假设一个没有程序设计经验的人,他会怎样来思考这个问题的呢?他会提出什么样的需求呢?他很可能会这样想:我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加1,另外最好还有一个计数器清0的功能,当然计数器如果有一
个可以设为任意值的功能的话,我就可以作弊了。
    做为一个没有程序设计经验的人来说,他完全不会想到对数据库应该如何操作,对于HTTP变量该如何传递,他考虑问题的角度就是我有什么需求,我的业务逻辑是什么,软件应该有什么功能。深圳下沙
    按照这样的思路(请注意,他的思路其实就是我们平时在生活中习惯的思维方式),我们知道需要有一个计数器类 Counter,有一个必须的和两个可选的方法:
getCount()  // 取计数器值方法
retCounter()  // 计数器清0方法
tCount()  // 设计数器为相应的值方法
把Counter类完整的定义如下:
public class Counter {
  public int getCount(int id) {}
  public void retCounter(int id) {}富含哲理的诗句
  public void tCount(int id, int currentCount) {}
}
    解决问题的框架已经有了,来看一下如何使用Counter。 在i里面调用Counter来计数,程序片断如下:
  //  这里从HTTP环境里面取id值
  ...
  Counter myCounter = new Counter();  // 获得计数器
  int currentCount = Count(id);  // 从计数器中取计数
  //  这里向客户浏览器输出
  ...
    程序的框架全都写好了,剩下的就是实现Counter类方法里面具体的代码了,此时才去考虑具体的程序语言实现的细节,比如,在getCount()方法里面访问数据库,更新计数值。
    从上面的例子中看到,面向对象的思维方法其实就是我们在现实生活中习惯的思维方式,是从人类考虑问题的角度出发,把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程,在这个翻译的过程中,软件也就逐步被设计好了。
    在运用面向对象的思维方法进行软件设计的过程中,最容易犯的错误就是开始分析的时候,就想到了程序代码实现的细节,因此封装的类完全是基于程序实现逻辑,而不是基于解决问题的业务逻辑。
    学习JDBC编程的经典错误问法是:“我怎样封装对数据库的lect操作?”
    面向对象的设计是基于解决业务问题的设计,而不是基于具体编程技术的设计。我不会去封装lect语句的,我只封装解决问题的业务逻辑,对数据库的读取是在业务逻辑的编码实现阶段才去考虑的问题。
    回过头看上面那个发广告邮件的例子,应该如何应用面向对象的思维方法呢?
    对于一个邮件来说,有邮件头,邮件体,和邮件地址这三个属性,发送邮件,需要一个发送的方法,另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计:
类JunkMail
属性:
  head
  body
  address
方法:
  ndMail()    // 发送邮件
  listAllMail() // 列邮件地址
用Java来表示:
public class JunkMail {
  private String head;
  private String body;
  private String address;
礼貌礼仪培训
  public JunkMain() {  // 默认的类构造器
    // 从外部配置文件读邮件头和邮件体
    this.head=...;
    this.body=...;
  }
老呆和小呆
  public static boolean ndMail(String address) {
    //  调用qmail,发送email
  }
  public static Collection listAllMail() {
    //  访问数据库,返回一个邮件地址集合
  }
道德模范事迹材料
}
  这样就把Ur类的设计和具体的实现方法分离开了,因为此时任何实现了next()和hasNext()方法的类都可以做为listUrs的返回值,都可以被用来表达“用户列表”,而不仅仅可以使用Vector而已。比如,我可以用ArrayList来表达用户列表,因为ArrayList也实现了Iterator,当然我也可以自己专门写一个类来存放用户列表,只要实现next()和hasNext()方法就行了。
    这样在具体的编写代码的时候,程序员具有了最大的灵活性,可以根据具体的情况,采
用不同的编程方法来存放用户列表。特别是降低了程序的耦合度,提高了程序的可移植性。对于上面那个JunkMail的listAllMail()方法也同样应该改为接口类型。
然后,在主程序里面就这样来使用Ur类的listUrs方法:
Ur myUr = new Ur();
Iterator iterator = myUr.listUrs();
while (iterator.hasNext()) {
  ();
}
    这样就可以完全不用考虑程序代码实现了,从高层次上把功能抽象出来,定义成为接口,同时又可以把系统设计的很合理,完全根据业务的需求来进行设计。
结语
    通过上面的几个例子的设计说明,使用面向对象的思维方法,其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程,而这个抽象的过程是自上而下的,非常符合人类的思维习惯,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题。单位承诺书
    因而一旦牢牢的抓住了这一点,你就会发现在软件设计和开发过程中,你自己总是会不知不觉的运用面向对象的思维方法来设计和编写程序,并且程序的设计和开发也变得不再那么枯燥,而一个合理运用面向对象技术进行设计和架构的软件,更是具备了思维的艺术美感。

本文发布于:2023-07-30 16:48:47,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1102194.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   思维   面向对象   数据库   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图