图形界面与具体实现的分离(面向过程->面向对象)

来源:互联网 发布:php zip压缩文件夹 编辑:程序博客网 时间:2024/06/05 08:25

原来的结构里面图形界面混杂着对串口的操作,这样可能会降低图形界面响应能力,所以考虑把实现部分都分离出去,并且尝试能不能搞一个负责控制的线程,原来的想法大概如下:

这这段时间对自己的程序结构又起了心思,虽说现在用的语言是c++,但是对面向对象的编程方法并没有领会,现在用c++只是用一下开发好的库,或者自己派生一个类用,编程方法还是停留在在模块化的层次,从上面流程图大致看出采用的是自底而上的方法,而结构化的编程则是自顶而下,逐步求精,能够先整体,再局部,先抽象,后具体,最后通过具体细化,得到具体的算法。c++是一种面向对象的编程语言,寻找对象间关系无疑是编程过程中极为重要的一步,然而对于对象间关系寻找,感觉力不从心。。。然后 去 找了片文章看,即《论对象之间的关系》,打算自己尝试一下对象关系分析。。。下面是文章中对于3DRM模型的图示:



论文中将对象间的关系归为最基本的三类,即图(a)中的三个维度:概括,聚集,协关系。图(a)到图(b)即为面向对象编程的第一步,面向对象的分析过程:将对象沿各维坐标轴展开以建立解域中的关系模型即图(c)。

概括/特化:(认识对象间内在联系)


分类/例化(is instance of):是概括/特化的特例,如图中将名字为Leap,Taler,Fign的老虎通过概括,抽象为东北虎这个概念。分类与概括不同,但分类中用到了概括(概括的 结果是分类的依据)。

而东北虎,华北虎,非洲虎都是老虎就是概括(is kind of)。表征的是继承关系,是它的一类。而分类/例化则表征 类属关系,是它的一个实例。

概念由三元素组成,即名字,内涵与外延,分类与概括强调概念的内涵方面。聚集强调概念的外延方面。

聚集/分解:(系统分解,即寻找对象)

另一个维度称为聚集/分解,文章中选择了六种聚集关系,分为三种讨论。

这里先引用前辈们的解释: 

一:

对象和类解释:

1)对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

2)类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

二:

什么是类、对象、属性、方法、成员?

日常生活中的所有东西都是对象,而具有同种属性的一类事物被称为,人、动物、植物、车都是类(是抽象的),而姚明这个人就是一个具体的对象。

对象是类的实例化,比如唐伯虎点秋香里面的小强是蟑螂的实例化。
我们一般不会用类的名称类称呼一个对象。
周星驰说“小强,你死得好惨啊!”,而不是说“蟑螂,你死得好惨啊!”。
这里“蟑螂”是类名,而小强是对象的名称。

属性用来描述具体某个对象的特征。比如姚明身高2.26M,体重100KG,这里身高、体重都是属性。
面向对象的思想就是把一切都看成对象,而对象一般都由属性+方法组成,比如说张三,嘴巴可以看成他的一个属性,而说话成可以看成他的一个方法,其实方法就是一些function函数。

属性属于对象静态的一面,用来形容对象的一些特性,方法属于对象动态的一面,你可以些方法来操作一个对象,我们把属性合方法称为这个对象的成员

总结下:
类:具有同种属性的对象称为类,是个抽象的概念。比如说:汽车、人、狗、神;
对象:日常生活中的所有东西都是对象,是类的实例化。比如说:小强是蟑螂的实例化,
属性:用来描述具体某个对象的特征的是属性,是静态的。比如:姚明身高2.26米;
方法:每个对象有它们自己的行为或者是使用它们的方法,比如说一只狗会跑会叫等,我们把这些行为称之为方法,是动态的,可以使用这些方法来操作一个对象;
类的成员:属性和方法称为这个对象的成员,因为它们是构成一个对象的主要部分,没有了这两样东西,那么对象也没什么存在意义了。


1.结构聚集:为讨论方便,把字符、整数、浮 点数、分类 和 布 尔量 等基元值  称为 纯对 象 或原子 对 象 。其余对象都称为复合对象,可递归 定义。

例如一个复数由两个整数值所定义(实部与虚部)。则复数是一个复合对象,而实部与虚部这两个整数就是原子对象。

1.IAOis attitude of

非原子对象的结构一般由一组属性组成,各个属性间保持着确定的存储次序(即属性在内部是有序的)。限定IAO关系只能用于描述描述简单对象(每个属性均为原子对象)。

上面说的由两个整数构成的复数即为简单对象。而如果把实部定义成由整数和小数两部分组成,那么实部对象就是一个复合对象,那么此时的复数就是一个复杂对象。

2.IPOis part of

限定IPO关系只用于描述复杂对象(至少有一个属性是非原子对象)的属性。

那么现在说对于前面一个复数,它具有实部与虚部这两个属性,复数的实部为X,虚部为jY(假设复数为X+jY)。而对于后一个,可以说复数有两个部分,实部和虚部,实部部分为X+Z,虚部部分为jY(假设实部整数部分为X,小数部分为Z)。

2.功能聚集

1)对象的行为聚集

对象的行为聚集是通过对问题域中实体与实体之间的相互作用的分析,为相应对象该规定一组方法的过程。如对人规定可以跑,可以叫,可以打滚。。。。

2)系统的功能聚集

如果一个软件系统的一部分是另一个系统的一部分,则称前者为后者子系统。比如一辆自行车可以看做一个系统,而自行车可能又由转向系统(车把),运动系统(车轮,链条,脚蹬)等等构成,而运动系统由传动系统(链条)为其子系统。

结构聚集即表征了属性,而功能聚集则表征了方法,两者共同构成对象。

3.成员聚集

(1)IIO(is instance of)

c为C是实例,且C为c直接类。比如一堆细胞的集合。

(2)IMO(is member of )

对象O是类C成员(IMO),如果O或为类C实例或为类C子类实例。比如各种细胞的集合。

协关系:(认识对象间外部联系)

实体间相互作用,过程间的调用与被调用,进程间的互斥与同步,控制系统中的激励与响应,排队中的顾客与服务员关系,因果关系等。

OOPL三大阶段

面向对象的软件开发方法分为三大阶段:面向对象分析(OOA),面向对象设计(OOD),面向对象实现(OOI)。

OOA的重点不在于确定个对象的实现细节,而是建立本问题的对象通讯模型,因此对象的外部特性及对象间的相互关系(协关系)是必须清晰描述的。

OOD的任务在于实现具有各种外部特征的对象,设计对象的内部构造:由那些更基本的对象以什么关系结合以构成能满足外部特性要求的对象,但不涉及个子对象间实现细节,仍然注重各子对象间外部特性及相互关系。


先列一下对系统的要求,更详细的信息代表着更完备的已知条件,能够使分析过程简化,能够使求解变得简单。

系统的要求如下:使用串口(USB)接收从下位机传来的数据,使之在窗口上显示出数值/文本/图片。名词:串口,下位机,数据,窗口,数值,文本,图片。动词:使用...接收,使...显示。修饰:从...传来的,在..上。名词即对象,动词即方法(功能),修饰即属性/ 关系。另外有一个隐含关系,即串口与窗口的关系。

面向对象分析:

下位机是与本系统进行信息通讯的对象,而且是唯一的通讯对象(只从上位机下位机系统来说),在这里只作为通讯的其中一方,功能就是给上位机系统发送数据;

串口的功能就是接受,它负责接收下位机发来数据;

每个数据可以看做原子对象,大概可以归为数据类,即int,char等,它拥有值这个属性,此时其中包含的值承载了人们对其赋予的信息;

窗口要与人进行交互,在这里的主要功能就是显示人们需要的数据,把数据显示为数值文本图片等等;

数值文本图片包含人们所关心的信息,也是整个过程中的被操作对象,能够被写入修改读取,应具有存储空间。

面向对象设计:

串口:因为调用了WIN32的API这里不需要构造,只需定义一些方法。我从现有的通信类库中自己派生了一个用在此处的串口类,里面封装了一些我要用到的功能。

窗口:使用图形库,不需构造。只需定义一组方法即可,即显示三种类型数据。

数值文本图片等是被操作对象,是数据的集合体,它们有共通之处:都从串口接收,都要交给窗口并显示。也有不同:最小显示单位不同(数值和文本为一字节,图像为一帧),所以从串口处打包时方法不同,在窗口显示时方法不同。所以设计一个数据类,它拥有存储区(或指向存储区指针),有打包方法,处理方法(处理成窗口能显示的数据)。另外在窗口类里面要有相应显示方法。

我写的通信类有问题。。只能小的图片接收显示,像128*64像素的图片4次里有三次丢。。。。下面使用虚拟串口测试的图:


上面的一堆分析,嗯,我已经忘光了2333.新的通信类重写中,另外线程部分也要重新想想了。。。。

1 0