工欲善其事,必先利其器:工匠要做好工作,必须先磨快工具。
C++开发环境搭建,开启Visual Studio 2019的安装。
1、下载网址:微软官网 https://www.microsoft.com/zh-cn/
2、官网首页
3、选择菜单栏最右边的更多,在“所有 Microsoft”下拉一栏选择“Visual Studio”进入
4、进入之后是这个界面,选择社区版Community下载
5、如果不想从官网进入也可以直接进入这个网址:https://visualstudio.microsoft.com/zh-hans/downloads/,选择免费的社区版,会开始自动下载
6、进入这个界面可以手动下载(如果不能自动下载的话)
下载后,会看到一个.exe安装文件
1、双击vs_Community.exe开始安装
2、点击“是”,进入安装界面
3、点击“继续”等待程序安装完成
4、安装程序下载安装验证完毕,将会提示进入这个界面
5、工作负载这里我们可以勾选使用C++的桌面开发和Visual Studio 扩展开发
其他的工作负载、组件和语言包没有必要的话尽量不要选,整个Visual Studio会比较大,安装位置也尽量不要选择C盘。
有人可能会问,万一那些东西我以后要用,那该怎么办呢?
在开始栏里找到Visual Studio Installer
或者像开始安装那样,在下载界面重新点击下载
会出现下面这个界面:
点击修改,就会出现选择工作负载等界面了,你就可以重新选择你想要的负载和插件,也可以选择卸载你不想要的东西了。
6、安装位置可以在下面更改,建议不用更改
7、单个组件可以自行勾选,工作负载里勾选了项目相关的组件也会在单个组件中自行勾选上
8、语言包有很多选项,这里默认是中文(简体)
9、最后点击“安装”
10、等待界面
11、下载相应的文件安装
整个过程根据个人电脑的性能不同消耗的时间也不同,在安装的过程中是需要全程联网.
12、安装完成,会在桌面上看到一个小图标
1、双击桌面Visual Studio 2019图标
2、开发工具启动
2、进入主界面,创建新项目,可以选择打开最近项,也可以直接点击右下角继续但无需代码
3、点击“创建新项目(N)”开始创建一个新的项目
4、选择“空项目”点击“下一步”
5、录入“项目名称”,选择项目存储位置,点击“创建”,成功建立项目
6、项目结构
引用、外部依赖项 、头文件、源文件、资源文件
2.1.1 新建C++项目
1、双击桌面Visual Studio 2019图标
2、开发工具启动
2、进入主界面,创建新项目,可以选择打开最近项,也可以直接点击右下角继续但无需代码
3、点击“创建新项目(N)”开始创建一个新的项目
4、选择“空项目”点击“下一步”
5、录入“项目名称”,选择项目存储位置,点击“创建”,成功建立项目
6、右键源文件,点击“添加-->新建项”
7、点击“C++文件(.cpp)”,输入“名称”,确定“位置”,点击“添加”按钮
8、进入开发界面
9、输入代码
#include
int main()
{
std::cout << "Hello World!\n";
return 0;
}
这是一段程序员绕不过的代码
输出:
Hello World!
2.1.2 代码的编译与运行
1、在代码窗口直接按F5键,运行程序,输出内容
2、点击窗口菜单“调试”,选择“开始调试”或“开始执行(不调试)”即可
开始运行是指以调试模式执行,如果设置了断点,会运行到断点处暂停,方便程序员进行调试。
开始运行不调试是指以执行模式运行,会完整执行编译生成的那个可执行文件,即使程序中设置了断点,也不会暂停,适合于运行程序直接观察最终运行效果。
2.1.3 常见问题
2.1.3.1 打开多个解决方案
1、在项目解决方案上点击右键,选择“添加”->“现有项目“
2、选择现有项目,点击“打开“
3、设置启动项目,在项目解决方案上点击右键,选择“设置启动项目“
4、点击“多个启动项目“,选择指定的启动项目,并将对应的“操作”项设置为“启动”,点击“确定”即可
2.2.1 C语言的起源
20世纪70年代早期,贝尔实验室Dennis Ritchie致力于开发UNIX操作系统,为完成这项工作,Ritchie需要一种语言,它必须简洁,能够生成简洁、快速的程序,并能有效地控制硬件。因当时的汇编语言针对于特定的计算机处理器,要将汇编程序移植到另一台计算机上,必须使用不同的汇编语言重新编写程序;C语言在这种背景下诞生了。
C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。
2.2.2 C++语言的起源
20世纪80年代,C++由Bjarne Stroustrup在贝尔实验室开发出完成;C++是C语言的超集,它整合了OOP、泛型编程和传统的过程性方法,这表明C++强调的是实用价值,而不是意识形态方法。
2.3.1 程序设计语言的发展阶段
到目前为止,程序设计语言的发展经过了机器语言、汇编语言、高级语言、第四代语言、第五代语言五个阶段,每一个阶段都使程序设计的效率大大提高。我们常常把机器语言称为第一代程序设计语言,把汇编语言称为第二代程序设计语言,把高级语言称为第三代程序设计语言,把极高级语言(面向问题的语言)称为第四代语言,把人工智能语言称为第五代语言。
2.3.1.1 第一代语言 - 机器语言
机器语言是计算机能直接识别和执行的一组机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。一条机器指令就是机器语言的一个语句,它是一组有意义的二进制代码。每条机器指令一般由操作码和地址码两部分构成,其中操作码说明指令的含义,地址码说明操作数的地址。机器语言程序能够在对应型号的计算机上直接运行。
机器语言也称为计算机系统的本地语言,是第一代编程语言。 在机器语言中,程序员仅处理二进制数。
2.3.1.2 第二代语言 – 汇编语言
20世纪50年代中期,人们开始用一些“助记符号”来代替0、1码编程,即用助记符代替机器指令中的操作码,用地址符号或标号代替机器指令中的地址码,将机器语言变成了汇编语言。汇编语言也称符号语言,即符号化的机器语言,提高了程序的可读性和程序开发效率。
使用汇编语言编写的程序,计算机不能直接识别,必须有一种程序将汇编语言翻译成机器语言,起这种翻译作用的程序称为汇编程序(Assembler),汇编程序把汇编语言翻译成机器语言的过程称为汇编(Assembling)。
汇编语言程序经汇编得到的目标程序占用内存空间少,运行速度快,有着高级语言不可替代的作用,因此汇编语言常用来编写系统软件和过程控制软件。
汇编语言和机器语言都与具体的机器有关,它们都称为面向机器的语言,也称为低级语言。程序员用它们编程时,不仅要考虑解题思路,还要熟悉机器的内部构造,并且要“手工”地进行存储器分配,编程的劳动强度仍然很大,这些仍然阻碍着计算机的普及和推广。因此,人们又进一步引进了高级语言。
2.3.1.3 第三代语言 – 高级语言
第三代语言使程序员仅专注于程序的逻辑,而无需考虑计算机系统的内部体系结构。
高级语言是面向用户的语言。无论何种机型的计算机,只要配备相应的高级语言的翻译程序,用该高级语言编写的程序就可以在该机器上运行。
根据人们研究兴趣的不同,高级语言也有多种不同的分类方法。从语言的范型分类,当今的大多数程序设计语言可以划分为如下四类。
1.命令式语言
命令式语言(Imperative Language)也称过程式语言。其特点是命令驱动,面向动作(语句),即将计算看做是动作(语句)的序列。一个命令式语言程序由一系列的语句组成,每个语句的执行引起若干存储单元中的值的改变。Pascal、C和ADA都是典型的命令式语言。
2.函数式语言
函数式语言(Functional Language)注重程序实现的功能,而不是像命令式语言那样一个语句接一个语句地执行。程序的编写过程是从已有函数出发构造出更复杂的函数,对初始数据集应用这些函数直至最终的函数可以从初始数据计算出最终的结果。因此,函数式语言也称应用式语言。LISP、ML和Haskell都属于这种语言。
3.面向对象语言
面向对象语言(Object-Oriented Language)是当今最流行、最重要的语言。它的主要特点是支持封装性、继承性和多态性等。把复杂的数据和对这些数据的操作封装在一起,构成对象;对简单对象进行扩充、继承简单对象的特性,从而设计出复杂的对象。对对象的构造可以使面向对象程序具有命令式语言的有效性,通过作用于特定数据的函数的构造,可以具有应用式语言的灵活性和可靠性。SmallTalk、C++、Java就属于面向对象语言。
4.逻辑式语言
逻辑式语言(Logical Language)也称做基于规则的语言(Rule-based Language)。逻辑式程序设计以“项”之间“关系”的定义、应用这些关系的事实以及从现存的事实中“推理”出新的事实的规则为基础。项可能是逻辑变量或者包含逻辑变量。事实和规则称为“子句”。逻辑式语言的程序由“子句列表”组成。最有代表性的逻辑式语言是PROLOG。PROLOG以逻辑程序设计为基础,以处理一阶谓词演算为背景。它文法简洁,表达力丰富,具有独特的非过程型语言(一个语句就相当于过程语言的一个子程序而并非算法的一步),是一种具有推理功能的逻辑型语言。PROLOG语言已被广泛地应用于关系数据库、抽象问题求解、数理逻辑、公式处理、自然语言理解、专家系统以及人工智能的许多领域。
计算机的指令系统只能执行自己的指令程序,而不能执行其他语言的程序。因此,若想用高级语言,则必须有这样一种程序,它把用汇编语言或高级语言写的程序(称为源程序)翻译成等价的机器语言程序(称为目标程序),我们称这种翻译程序为翻译器。汇编语言的翻译器为汇编程序,高级语言的翻译器为编译程序。
翻译器的“翻译”通常有两种方式,即编译方式和解释方式。编译方式是:事先编好一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户把由高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。编译程序将源程序翻译成目标程序的过程发生在翻译时间,翻译成的目标代码随后运行的时间称为运行时间。解释方式是:源程序进入计算机时,解释程序边扫描边解释,做逐句输入逐句翻译,计算机一句句执行,并不产生目标程序。
解释器是源程序的一个执行系统,而编译程序是源程序的一个转换系统,换句话说,解释程序的工作结果是得到源程序的执行结果,因此解释程序相当于执行程序的抽象机;而编译程序的工作结果是得到等价于源程序的某种目标机程序,因此编译程序是高级语言程序到某种低级语言程序的转换器。
2.3.1.4 第四代语言 - 面向问题的语言
第四代编程语言针对某个特定的应用领域,如数据库编程(FoxPro),数学编程(Mathematica),报表生成等等。第四代编程语言具有“面向问题”、“非过程化程度高”等特点,可以呈数量级地提高软件生产率,缩短软件开发周期;
第四代编程语言以数据库管理系统所提供的功能为核心,进一步构造了开发高层软件系统的开发环境,如报表生成、多窗口表格设计、菜单生成系统、图形图像处理系统和决策支持系统,为用户提供了一个良好的应用开发环境。它提供了功能强大的非过程化问题定义手段,用户只需告知系统做什么,而无须说明怎么做,因此可大大提高软件生产率。
虽然4GL具有很多优点,也有很大的优势,成为目前应用开发的主流工具,但它也存在着以下严重不足:
(1)4GL虽然功能强大,但在其整体能力上却与3GL有一定的差距。这一方面是语言抽象级别提高以后不可避免地带来的(正如高级语言不能做某些汇编语言做的事情那样);另一方面是人为带来的,许多4GL只面向专项应用,有的4GL为了提高对问题的表达能力,提供了同3GL的接口,以弥补其能力上的不足,如Oracle提供了可将SQL语句嵌入C程序中的工具PRO*C。
(2)4GL由于其抽象级别较高,不可避免地带来系统开销大,运行效率低(正如高级语言运行效率没有汇编语言高一样)等问题,对软硬件资源消耗严重,应用受硬件限制。
(3)由于缺乏统一的工业标准,4GL产品花样繁多,用户界面差异很大,与具体的机器联系紧密,语言的独立性较差(SQL稍好),影响了应用软件的移植与推广。
(4)目前4GL主要面向基于数据库应用的领域,不适合于科学计算、高速的实时系统和系统软件开发。
2.3.1.5 第五代语言 – 人工智能语言
第五代语言就是自然语言又被称为知识库语言或人工智能语言,目标是最接近日常生活所用语言的程序语言。这一代的编程语言主要关注约束编程。 采用第五代编程语言的主要领域是人工智能和人工神经网络;真正意义上的第五代语言尚未出现,LISP和PROLOG号称第五代语言,其实还远远不能达到自然语言的要求。
一般来讲,人工智能语言应具备如下特点:
1.要有符号处理能力(即非数值处理能力);
2.适合于结构化程序设计,编程容易;(要把系统分解成若干易于理解和处理的小单位的能力,从而既能较为容易地改变系统的某一部分,而又不破坏整个系统。)
3.要有递归功能和回溯功能;
4.要有人机交互能力;
5.适合于推理;
6.要有把过程与说明式数据结构混合起来的能力,又要有辨别数据、确定控制的模式匹配机制。
2.3.2 编译型语言、解释型语言、机器语言
2.3.2.1 机器语言
机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。
机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。不同的计算机都有各自的机器语言,即指令系统。
2.3.2.2 解释型语言
程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。效率比较低,依赖解释器,跨平台性好。
例:ava、C#、PHP、JavaScript、VBScript、Perl、Python、Ruby
2.3.2.3 编译型语言
程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。
例:C/C++、Pascal/Object Pascal(Delphi)、Golang
C++的编译过程:
早期的C++编译过程中使用了一个编码转换程序(cfront,C前端),用于将C++代码转换成为C语言的源代码,然后再将C语言的源代码编译成目标机器语言代码。目前的编译器可直接将C++语言的源代码直接编译成目标代码。
整个编译工作分为编译和链接两个阶段;编译过程首先将源代码编译成目标代码文件。为了提高编译效率,编译器会将多段源代码和其他第三方代码模块分别编译,生成中间代码。编译的第2个阶段叫链接。链接是将由编译生成的目标代码,与相应的系统标准启动代码和库代码组合起来,生成最终的可执行程序。
2.3.3 面向过程、面向对象、泛型
2.3.3.1 面向过程的语言
“面向过程”是一种以事件为中心的编程思想。
过程性语言是指在编程时必须给出获得结果的操作步骤,即“干什么”和“怎么干”。如Pascal和C语言等。
在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。面向过程语言程序设计过程就是用一系列语句描述问题解决过程中的一系列步骤的过程。
面向过程就是分析出解决问题的步骤,然后用函数把这些步骤一步一步的实现,使用的时候一个一个依次调用就可以了。面向过程编程采取的是时间换空间的策略,因为在早期计算机配置低,内存小,如何节省内存则成了首要任务,哪怕是运行的时间更长。
面向过程的程序设计思想:程序 = 算法 + 数据结构;
2.3.3.2 面向对象编程
“面向对象”是一种以事物为中心的编程思想。
面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的编程思想,通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
对象是由数据和相关操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
面向对象编程是一种实现的方法,在这种方法中,程序被组织成许多组互相协作的对象,每个对象代表某个类的一个实例,而类则属于一个通过继承关系形成的层次结构
面向对象和面向过程的特性和优缺点对比 |
||
|
面向对象 |
面向过程 |
特性 |
抽象、继承、封装、多态 |
功能模块化,代码流程化 |
优点 |
易维护、易复用、易扩展、低耦合 |
性能高,适合资源紧张、实时性强的场合 |
缺点 |
性能比面向过程低 |
没有面向对象易维护、易复用、易扩展 |
2.3.3.3 泛型、泛型编程
泛型是通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
泛型的优点:
1.可以做到最大的代码重用、保护类型的安全以及提高了程序运行的性能;
2.可以创建集合类;
3.可以创建自己的泛型接口、泛型方法、泛型类、泛型事件和泛型委托。
4.可以对泛型类进行约束,以访问特定数据类型的方法。
5.关于泛型数据类型中使用的类型的信息,可在运行时通过反射获取。
泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。
泛型编程(Generic Programming) 指在多种数据类型上皆可操作。和面向对象编程不同,它并不要求额外的间接层来调用函数,而是使用完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。
2.3.4 面向对象、面向对象分析、面向对象设计、面向对象编程
2.3.4.1 面向对象 OO
OO方法(Object-Oriented Method,面向对象方法,面向对象的方法)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OO (Object-Oriented)方法,是建立在“对象”概念基础上的方法学。对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
2.3.4.2 面向对象分析 OOA
面向对象分析是一种分析方法,这种方法利用从问题域的词汇表中找到的类和对象来分析需求。
面向对象分析方法(Object-Oriented Analysis,OOA),是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与部分的关系。
OOA在定义属性的同时,要识别实例连接。实例连接是一个实例与另一个实例的映射关系。
OOA在定义服务的同时要识别消息连接。当一个对象需要向另一对象发送消息时,它们之间就存在消息连接。
OOA 中的5个层次和5个活动继续贯穿在OOD(画向对象的设计)过程中。OOD模型由4个部分组成。它们分别是设计问题域部分、设计人机交互部分、设计任务管理部分和设计数据管理部分。
OOA的主要原则:
1、抽象
从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫做抽象。抽象是形成概念的必须手段。
抽象原则有两个方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特性而得到一批事物的抽象概念。
抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面。
过程抽象是指,任何一个完成确定功能的操作序列,其使用者都可以把它看作一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的。
数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是OOA的核心原则。它强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。
2、封装
封装就是把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。
3、继承
特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。
在OOA中运用继承原则,就是在每个由一般类和特殊类形成的一般 -- 特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和服务,一次性的在一般类中进行显式的定义。在特殊类中不在重复的定义一般类中已定义的东西,但是在语义上,特殊类却自动的、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的全部属性和服务。继承原则的好处是:是系统模型比较简练也比较清晰。
4、分类
就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。
5、聚合
又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物组装体,从而简化对复杂事物的描述。
6、关联
是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。
7、消息通信
这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求消息连接表示出对象之间的动态联系。
8、粒度控制
一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详查每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。着就是粒度控制原则。
9、行为分析
显示世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖交织。
面向对象分析产生三种模型
1.对象模型:对用例模型进行分析,把系统分解成互相协作的分析类,通过类图\对象图描述对象\对象的属性\对象间的关系,是系统的静态模型
2.动态模型:描述系统的动态行为,通过时序图/协作图/描述对象的交互,以揭示对象间如何协作来完成每个具体的用例。单个对象的状态变化/动态行为可以通过状态图来表示
3.功能模型(即用例模型作为输入)
OOA的主要优点
1.加强了对问题域和系统责任的理解。
2.改进与分析有关的各类人员之间的交流
3.对需求的变化具有较强的适应性
4.支持软件复用。
5.贯穿软件声明周期全过程的一致性、
6.实用性
7.有利于用户参与
OOA方法的具体步骤
在用OOA具体分析一个事物时。大致上遵循如下5个基本步骤;
1.确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界总某些事物的信息能力。。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
2.确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛华—特化关系,整体-部分结构反映整体和局部之间的关系
3.确定主题(subject)。主题是指事物的总体概貌和总体分析模型
4.确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。
5.确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。
2.3.4.3 面向对象设计 OOD
面向对象设计是一种设计方法,包括面向对象分解的过程和一种表示法,这种表示法用于展现被设计系统的逻辑模型和物理模型、静态模型和动态模型。
面向对象设计(Object-oriented Design,OOD)方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结构作进一步的规范化整理,以便能够被OOP直接接受。
面向对象设计(OOD)是一种软件设计方法,是一种工程化规范。这是毫无疑问的。按照Bjarne Stroustrup的说法,面向对象的编程范式(paradigm)是[Stroustrup, 97]:
1)决定你要的类;
2)给每个类提供完整的一组操作;
3)明确地使用继承来表现共同点。
由这个定义,我们可以看出:OOD就是“根据需求决定所需的类、类的操作以及类之间关联的过程”。
OOD的目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。比如说,如果用OOD的方法来设计一个服务器-客户端(client-server)应用,那么服务器和客户端之间不应该有直接的依赖,而是应该让服务器的接口和客户端的接口相互依赖。
OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,我们可以用对象(object)来表现问题领域(problem domain)的实体,每个对象都有相应的状态和行为。我们刚才说到:OOD是一种抽象的范式。抽象可以分成很多层次,从非常概括的到非常特殊的都有,而对象可能处于任何一个抽象层次上。另外,彼此不同但又互有关联的对象可以共同构成抽象:只要这些对象之间有相似性,就可以把它们当成同一类的对象来处理。
OOD步骤
1、细化重组类
2、细化和实现类间关系,明确其可见性
3、增加属性,指定属性的类型与可见性
4、分配职责,定义执行每个职责的方法
5、对消息驱动的系统,明确消息传递方式
6、利用设计模式进行局部设计
7、画出详细的类图与时序图
OOD设计过程中要展开的主要几项工作
(一)对象定义规格的求精过程
对于OOA所抽象出来的对象&类以及汇集的分析文档,OOD需要有一个根据设计要求整理和求精的过程,是指更能符合OOP的需要。这个整理和求精过程主要有两个方面:一是根据面向对象的概念模型整理分析所确定的对象结构、属性、方法等内容,改正错误的内容,删去不必要和重复的内容等;二是进行分类整理,以便于下一步数据库设计和程序处理模块设计的必要。整理的方法主要是进行归类,对类、对象、属性、方法和结构、主题进行归类。
(二)数据模型和数据库设计
数据模型的设计需要确定类与对象属性的内容、消息连接的方式、系统访问、数据模型的方法等。最后每个对象实例的数据都必须落实到面向对象的库结构模型中。
(三)优化
OOD的优化设计过程是从另一个角度对分析结果和处理业务过程的整理归纳,优化包括对象和结构的优化、抽象、集成。
对象和结构的模块化表示OOD提供了一种范式,这种范式支持对类和结构的模块化。这种模块符合一般模块化所要求的所有特点,如信息隐蔽性好,内部聚合度强和模块之间耦合度弱等。
集成化使得单个构件有机地结合在一起,相互支持。
OO方法的特点和面临的问题
OO方法以对象为基础,利用特定的软件工具直接完成从对象客体的描述到软件结构之间的转换。这是OO方法最主要的特点和成就。OO方法的应用解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题,缩短了开发周期,解决了从分析和设计到软件模块结构之间多次转换映射的繁杂过程,是一种很有发展前途的系统开发方法。
但是同原型方法一样,OO方法需要一定的软件基础支持才可以应用,另外在大型的MIS开发中如果不经自顶向下的整体划分,而是一开始就自底向上的采用OO 方法开发系统,同样也会造成系统结构不合理、各部分关系失调等问题。所以OO方法和结构化方法目前仍是两种在系统开发领域相互依存的、不可替代的方法。
2.3.4.4 面向对象编程 OOP
“面向对象”是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物,是一种高级的编程思想。
把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的过程中所发生的行为。
“面向对象编程是一种实现的方法,在这种方法中,程序被组织成许多组互相协作的对象,每个对象代表某个类的一个实例,而类则属于一个通过继承关系形成的层次结构”。
这里定义有三个要点:
(1)利用对象作为面向对象编程的基本逻辑构建块,而不是利用算法;
(2)每个对象都是某个类的一个实例;
(3)类与类之间可以通过继承等关系联系在一起。
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组件:
(1)组件:数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。
(2)抽象性:程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。
(3)封装:也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。
(4)多态性:组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果依据实际调用的类型。
(5)继承性:允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。