好,最后呢,我们介绍一下这个,简单介绍一下面向对象这个系统实现。
就是这个模型是如何过渡到这个一些主流的这个 编程语言中的。
首先呢这个,我们这个 就是说这个面向对象这个系统设计呀,实际上是
面向对象这个程序设计,很多情况,很多书上叫面向对象程序设计,其实就是指这个
面向对象的这个,在我们这个课程中啊,其实就是面向对象的 系统实现,就是说这是有区别的。
我们这个程序设计实际上呢 这个我们在这个不叫程序设计,我们课程中叫系统设计,
系统设计并不是编程序,很多书上呢程序设计就是编程序。
所以呢这是两种方式,有一种开发方式就是直接根据问题 然后拿到一个问题之后直接编写程序,这叫程序设计。
我们是一种 严格的按照这个建模,然后根据模型,最后从分析模型到设计模型,设计模型呢
再过渡到程序,这两者是有区别的。
所以呢对于一些简单的一些问题可以用这个 面向对象系统程序设计来实现,而我们这个是对于一些
复杂的问题,或者说对于一些大规模的这种开发,涉及到 这个很多人,这个并发一些工作,
甚至是几百个人同时开发的工作,那用这种 简单的这种方式就不可以了。
就可以,就必须得用这个面向对象方法 是从建立模型开始,然后最后由模型过渡到实现。
我们这个 本章的这个内容呢主要就是第二种,就是
讲一下如何将模型简单的映射为代码的一个大概的一个原则。
所以这是面向对象的一些编程语言,有一个简单的了解, 这个面向对象编程语言呢,这个我们前面也提到,从六七年的
Simula 到这个八十年 代初期的 Smalltalk,到现在主流的这个 C++,C#,当然现在还在不断涌现一些新的一些
面向对象的一些语言,这个有很多,但是主要特征都必须满足面向对象这个 语言的一些特征。
这个这是一些这个从 历史角度来看,这个面向对象语言这个发展的一个脉络。
这个本身分类有纯面向对象的语言和混合型面向对象语言, 实际上呢目前流传很广的都是一些混合型面向对象
语言,一些纯粹的面向对象语言,比如说 Smalltalk 和 Eiffel 这些东西
实际上现在来看呢,这个已经基本上这个不是一个主流的一个 一个面向对象的编程语言了。
实际上我们这个今天广泛使用的 C++ Objective-C,这个
Pascal 等等,它们都不能称之为一个纯面向对象的
这个语言,这个都是一些这个混合型的,也就是说它既可以描述面向过程,也可以描述面- 向对象。
即使描述面向对象语言与这个纯面向对象语言来看,它的封装啊也是不够严格的,
还有一些是人工智能的语言,面向对象语言,这个我们就不 这个详细说了。
然后它们之间呢从这个我们 OOA ,OOD 模型的分析和这个代码
这个到这个它的术语和这个 C++ 和 Java 这个术语呢也有一些不太相似的地方。
比如有些是类似的,我们这个分析和设计的类的属性和服务 在
C++ 中就叫成员变量和成员函数,我们这叫泛化关系,它们那叫继承和派生,等等。
我们这叫聚合,实际上在 C++ 中叫嵌套对象,或者嵌入指针,
这个我们这叫消息,然后 C++ 中叫函数调用,我们这叫关联,然后
C++ 呢叫 对象指针,这个和 Pascal 的对应和这个 Java 对应都是一样的。
这个并且呢现在这个编程环境不仅包含了
一个编译器,简单一个面向对象语言的编译器,而且包含了若干个编程环境,这些编程环境呢, 这个包括一些
UI,这个就是我们前面提到的一些 图形,通过这个一些这个
UG,GUI,是吧,用托拉拽的方式来这个
自动的来生成这个 UI 方面的一些代码。
也包括了一些数据库, 就是现在比如说这个 Visual Studio
这个 2012,这个微软的这个技术中,一些数据库编程的方面也是可以用托拉拽的方式
来自动实现,很多情况下不需要人编写程序了,甚至是包括一些模拟,这个模拟器
像我们开发的这些云+端这种,这个手机端特别是,是吧,很多的一些情况下就叫模拟数据,- 模拟一些
GUI,这个 GPS 的一些变化啊,模拟这个手机的位置,等等,这些都是模拟。
所以 它包含的内容是非常多的,它这里边只有一部分是一个编译器,还有另外的部分是外围的一-
些工作, 所以在编程的时候呢可以尽可能利用这些编程环境所提供的一些便利。
这个我们看一下这个简单的看这个 C++ 对类的实现呢,这个我们就
就是这就涉及到 C++ 语言的一些具体细节,是吧,在
我们类图中,在 UML 中类是一个方块,在这个 C++ 中,类就是一个
class,定义 class,其中呢属性放在这个成员函数中,
数据成员中,然后所有的操作呢放在成员函数里边, 当然它的可见性,公有的,私有的,这都可以体现。
这是一个 对泛化的一个 C++ 中对泛化的实现,泛化实现呢实际上用冒号,这可以有多重泛化来实现。
这个呢是一个定义全局对象,局部对象和静态局部对象,是吧, 这里呢就涉及到这个
C++ 中的语言的一些特点, 这个有些全局函数,全局,全局定义的一些全局对象,在这个类中,
这个定义一些全局对象,不是在类中定义的,与类处于同一个级别上的这个 属于在这个
main 函数之前被构造 放在全局数据区,生命周期呢和程序的生命周期是完全 一样的。
还有一些是什么呢?是一些这个 static,定义为这个静态对象这个函数的时候,
它这个尽管当前的位置没有放在这个
好像是在这个某一个对象内部或者说是一个函数内部,但是呢 由于它定义为
static ,它也放在全局数据 区,它的生命周期呢也和整个程序的运行生命周期是完全 一样的。
这个局部变量呢实际上是什么呢?是 一些这个函数的一些局部变量,
这个没有放 static,它实际上是放在这个程序的函数这个
栈中,这个执行的时候才 被产生,如果这个函数退出了,然后它就随着栈而
pop 出去了,就没了,它的生命周期 是和这个函数生命周期是相同的。
还有一些是一些什么 局部变量,是放在,全局的变量和局部变量是放在堆中,
它的生命周期呢和程序生命周期是一致的,所以呢, 这个我们这个产生用
new 的方式产生一个对象,它是放在堆里边去了,
这时候呢不需要的时候呢,要用 delete 删除,如果不删除的话在 C++ 中就
它一直在那占着这个内存,会产生这个内存越用越小的这种情况。
定义这个静态成员,实际上呢 在类中定义一个静态成员呢,与那个类似,用于这个
用 static,所以呢,它由于它这个前面标注 一个
static,静态,所以呢它实际上是在这个 类中定义,所以可以被类中的所有对象所共享,
是由类专门的分配一个空间。
而定义一些这个 这个静态成员函数,就是
映射为什么呢?那个我们在这个 UML
类中画横线的这些, 属性和操作,它们呢基本上是必须只能访问这个类里边的
这个静态数据成员,不能访问非静态的 这个成员。
这个还有一些呢是这个大概这个 UML 图是这样的,是吧,
一个 car ,这个当然这个我们就不去这个追究这个到底合理性,我们就假设说这个模型是这样的,
是吧,它发动机是一个组合,而它的四个轮子是一个这种聚合, 那实现的时候在 C++
中是有所区分的,也就是说在这个 C++ 中,所有的组合关系呢是嵌入对象,
而所有的聚合关系实际上为这个嵌入对象 指针,这里呢是一个一对多的,所以这里边是一个数组,
这是为什么呢?这个语义是跟这个 语义是完全相同的。
由于这个 motor 这个定义的是一个嵌入对象这种方式,在
C++ 在类中嵌入,在当前的这个作用域中
定义了这么一种这个这种类型,实际上是放在这个
栈中,啊,产生了这个数据结构,这个Motor数据结构放在这个类的
执行的这个栈中,啊,所以呢这个Motor是跟这个类Car的产生,生命周期是完全- 一样的。
啊,它随着Car的产生而产生,随着Car的消亡而消亡,所以它跟那个UML中那个聚合- 的这个语义是完全相同。
而这种这个指针的这种方式呢是 分配在什么呢,是在这个堆中分配,它的这个生命
周期实际上是那个,与这个程序生命周期是完全一样的。
所以呢,只是它只能是用聚合的方式来实现。
从这一点我们就解释聚合关系和组合关系在C++中是非常 这个,严格的被映射过来的。
啊,这里呢,映射这个导航,导航啊实际上就是说这个关联关系, 箭头指向,一个,由一个学生能够找到导师,
老师,那么需要在学生这个类中嵌入老师这个类的这个 指针类型或者引用类型;相反,如果反过来呢
一个老师找到学生,但是一个老师和学生之间是个一对多的关系。
这里面呢,是嵌入的是这个指针类型的数组,它来表示。
啊,所以这些呢,这个需要再 注意,这是一个,两个的话呢,可以用数组,也可以用组合变量来表示。
这所有这些C++和类的这个对应关系呢,当然还比较复杂。
呃,所有这些呢是我们这个课程,啊,限于时间,我们不可能一一介绍。
很多情况呢,需要大家依据于我们这个 课程中,所这个给大家介绍的UML的语义来这个
呃,根据它这个语义是否契合来合理的进行这个 映射。
这个另外呢,在设计的时候人机交互界面设计在编程实现部分
人机交互界面呢,有些情况呢是JAVA或者编程语言,有些情况是脚本语言,不管什么情- 况下呢,
就根据它这个实际的需要,当前你比如说GSP,啊,我们就实现为GSP这种脚本。
啊,如果说是一种那个在C#下呢,可能是这个 映射为XAML,呃,那么就映射为XAML这种
脚本语言,啊,这个都是可以,当然也有一些可视化的编程环境 来支持。
啊,这个这是一些Thread,啊,这个 对于控制驱动部分的编程实现,那就依赖于
Java、 C++、 C#中提供的这些便利条件合理的进行。
呃,这个根据模型,然后严格的来这个进行实现,啊,这个给
过一种这个如何将多线程实现为这个JAVA
多线程的一种机制,这个就是继承,继承那个Thread类,Java中有个线程Thre- ad类,然后呢,
重写它的run方法,就可以了,啊,这是执行效果。
数据管理部分呢,这时候我们给出一种 最这个,啊,这个,当然现在不太用了,就是
在这个接口类,接口就是这个介于 内存和这个外存中这个负责来回映射这个
内存数据和外存数据这一类,我们可以看出在其中一个查询是非常复杂的。
这个非常冗长,啊,这个也是非常繁琐, 也是这个非常枯燥,它实际上是
写一些XAML文档,然后,来回的搬运,在搬运的过程中呢不断,
不断需要产生一些新,在内存中产生一些对象,并且把这的对象的属性
呃,用这个查询到的一些,表中的一些值来替代。
啊,所以这是非常复杂的啊。
这个当然现在很少这样用了,啊,基本上用hamor就解决了,非常容易解决。
啊,有关这个问题呢,实现的问题呢,我们就不做 过多的介绍,希望大家呢就是结合于一种特定的编程语言,
来灵活的进行这个 映射。
啊,这个,这样呢,我们这个课程 内容就基本上介绍到这儿了,下一周呢,我们将介绍
这个几个完整的案例,把整个的这个我们课程中所有知识点串起来。
好本周就到这,谢谢大家。