Java基础:第二十五讲 软件系统的对象与现实世界对象的关系

来源:互联网 发布:java vo bo po 编辑:程序博客网 时间:2024/04/29 20:34

 

    本讲介绍现实世界中的对象与软件系统中的对象的区别,以及如何从现实世界中抽象出软件系统中的对象。
1、现实世界中的对象并不一定是软件系统中的对象。
公交系统中有大量的对象:汽车、乘客、司机、站牌、候车厅、道路、红绿灯、调度室、刷卡机、投币机、方向盘、车门、座位、车上的扶手、油箱、离合器、穿的衣服等等。列出的这些对象并不是所有的。
如果仔细看某个对象,还会有很多相关的对象。例如您仔细想十字路口,可能会想到红绿灯、每个路口、摄像设备、红绿灯所依赖的电线杆等。想到电线杆,可能还会想上面的固定设备,如螺丝钉等。如果继续下去,可以想到系统中的更多对象。
这么多的对象在软件系统中都需要吗?肯定不是都需要。如果要在软件系统中实现,一方面工作量太大,基本上没有办法实现。另一方面,也是最重要的一方面,是很多对象不需要。如果这个对象是必须的,那么不管多么困难也要实现。
既然有这么多的对象,有的对象需要在软件系统中实现,有的对象不需要在软件系统中实现,那么如何来选择呢?
每个系统都会有相应的目的,用于解决特定的问题。在考虑某个对象是否为软件系统中的对象的时候,只需关心该对象是否与要解决的问题相关。如何确定哪些对象与系统相关呢?
通常的做法,就是仔细分析用户提供的需求文档,这里假设所获得的需求文档是完整的。因为对象都是名词,所以可以从需求文档中来查找这些名词,在获取这些名词的过程中最好不要加入自己的想法,不能因为感觉某个对象好就添加到系统中。
通过对需求文档的分析可以得到很多名词,但是并不是所有这些名词都应该设计成对象。例如需求中可能有这样一句话“乘客上车后,如果有座位就坐下”,这里的名词有“乘客”、“车”和“座位”。因为乘客有相关的属性和行为,并且在系统中也非常重要,所以应该作为系统的对象。同样,车也有相关的属性和行为,并且也是系统的非常重要的组成部分,所以也应该作为系统的对象。但是,座位没有自己的行为和属性,因为在模拟系统中,不会考虑座位的高度、长度、宽度、形状等,本身也没有什么行为,所以座位就不应该作为系统的对象。
【注意】这里说“座位”不是对象,只是强调在当前的系统中不是对象。如果在另外一个软件系统中,它可能就是对象了。比如汽车生产商,肯定会考虑座位的形状、颜色、材料等。
2、从现实世界的对象抽象出软件系统中的对象
想一下软件系统能够干什么?多数情况下,是对现实世界的模拟,是对现实世界中的某些工作模拟,由电脑来完成一些原来需要人工完成的任务。例如使用的ATM自动提款机,原来要取钱,需要到银行去,由银行的工作人员来办理业务。现在如果取款不超过5000元,就可以在自动提款机上提取,并且现在很多银行都要求客户在ATM上取款,这种要求也许不合理,但是不可否认的是,ATM代替银行的工作人员办理了业务。
如果要构造一个系统模拟10路公交系统的运行情况,这时候需要在系统中构造汽车对象模拟现实世界中的汽车。就像前面在介绍对象的属性的时候,知道汽车有很多属性,汽车的长宽高,重量,颜色,车牌号,投币机,车门,广播,车轮,发动机等等。在软件系统中是否需要把这些属性全部模拟?
汽车有这么多属性,首先必须肯定的是无法把这些属性描述出来,这也是能力所不允许的。
既然要模拟汽车,又不能把所有的属性全部模拟出来,那么应该描述哪些属性呢?这就是一个抽象的过程,从现实世界中的具体对象抽象出软件系统中的抽象对象。
抽象的过程实际上就是选择属性和行为的过程,要哪些属性,不要哪些属性,取决于这些属性是否对要构建的系统有用。下面通过分析汽车的几个属性来介绍如何选择属性。
n         车牌号。汽车有车牌号,车牌号对软件系统有用,可以把所有汽车区分开,系统需要根据车牌号来调度汽车。所以需要车牌号。
n         车的位置信息。要模拟10路公交系统的运行情况,需要知道在某个时刻,某辆汽车的位置,所以也是需要的。
n         车的运行方向。知道车的方向,才可以根据运行方向和车的当前位置决定下一个时刻汽车的位置,所以也是需要的。
n         汽车的长度。汽车的长度是6还是5,对模拟系统来说没有太大的影响,所以在这个系统中不需要考虑汽车的长度。
这个抽象的过程可以根据模拟系统的功能来进行,功能涉及哪些属性,就对哪些属性进行分析。
这个过程实际上就是对系统所需要的所有对象进行分析,提取有用的属性和行为。
【注意】同样一个对象在不同的软件系统中的抽象结构是不一样的。同样是汽车,如果不是在10路公交系统中,相关属性的选择就不同了。如果是公交公司的资产管理系统,这时候对汽车对象的抽象结果就不一样了,可能需要考虑汽车的出厂日期、汽车价格、上次维修时间、出车次数、责任人等。
 
    上一次: 第二十四讲类与对象的关系
    下一次:  Java基础:第二十六讲 从对象抽象出类
    李绪成 CSDN Blog:http://blog.csdn.net/javaeeteacher
    如果想和我交流,或者和我成为朋友,请点击:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5