资源描述
面向对象程序设计的基本思想
一、 教学目标
1、 知识与技能
( 1) 认识面向对象程序设计的基本思想和面向对象思想的由来, 并能够举例说明现实世界与面向对象系统之间的对应关系。
( 2) 认识面向对象程序设计的优越性并初步理解其实现的机制。
2、 过程与方法
经历分析、 调试解决同一问题的两种不同实现思想的程序, 初步理解面向对象程序设计的优势及面向过程程序设计的缺陷。
3、 情感态度和价值观
( 1) 关注传统结构化程序设计存在的问题。
( 2) 产生学习面向对象程序设计技术的愿望。
( 3) 关注到面向对象技术是当前程序设计的重要发展方向。
二、 重点难点
1、 教学重点
( 1) 传统结构化程序设计存在的问题
( 2) 面向对象程序设计所具有的优点。
2、 教学难点
( 1) 面向对象思想的产生。
( 2) 传统结构化程序设计与面向对象程序设计的基本点比较。
( 3) 实现面向对象程序设计的基本机制。
三、 教学环境
1、 教材处理
教材以广东教育出版社出版的信息技术( 选修一) 《算法与程序设计》第五章第一节内容为结构框架, 部分实例选取上海科教版的普通高中信息技术课程实验教材《算法与程序设计》, 力争做到说理透彻, 易于理解并提供较多的理论和实践操练以巩固所学内容。
教学方法采用采用讲解、 任务驱动、 实践和学生自主学习相结合的学习方法。
2、 预备知识
学生已学完教材前四章内容, 基本掌握了传统的面向过程结构化程序设计方法, 有一定的程序设计基础, 课前建议学生预习课文内容, 初步了解本节教学内容与目标。
3、 硬件要求
建议本节课在多媒体电脑教室中完成, 最好有广播教学系统或投影仪, 为拓展学习, 学生机应允许上互联网。
4、 所需软件: 学生机要安装VB6.0或以上版本。
5、 所需课时: 1个课时, 如无预习, 课程将较为紧凑。
四、 教学过程
导入: 1、 简要介绍本节课的教学目标: 认识面向对象思想的由来及其基本思想, 经过阅读或调试用两种不同思想实现解决同一问题的两段程序, 认清面向对象程序设计的优点和结构化程序设计的缺陷。
2、 问题导入。请同学们阅读本节课文最前面的引导文字段, 一分钟后请同学发言。经过引导抛出结论: ”结构化程序设计存在固有的缺陷: 以功能为核心, 数据和函数分开, 使得后期维护难, 安全性差等且不适合解决复杂问题。”
( 一) 面向对象思想的产生
1、 面向对象技术是程序设计发展的必然趋势
经过前面的学习我们知道, 程序设计语言发展到现在经历了机器语言、 汇编语言再到高级语言。高级语言可分为 = 1 \* GB3 ①面向过程的程序设计语言 = 2 \* GB3 ②面向对象的程序设计语言。高级语言的出现为计算机的应用开辟了广阔的前景。计算机能解决的问题从纯计算问题开始发展到现在能处理现实世界方方面面的问题。面向过程的程序设计方法以算法( 即程序功能) 为中心, 把过程和数据作为互相对立的部分, 即”程序=算法+数据结构”。因此当描述事物的数据结构发生了改变, 所有与该数据结构相关的语句、 过程和函数都要重新设计。要使数据与程序始终保持相容, 已成为程序员开发的一个沉重负担。还有面向过程程序设计方法存在着安全性差、 代码可重用性差等缺陷, 随着软件开发规模的不断扩大, 结构化的方法已不能驾驭软件开发的过程。人们从编程解决问题的实践中逐渐总结出: 以接近人们思维方式来编程解决问题的面向对象技术代表了程序设计发展的方向。因为它能做到高效率、 易维护、 安全性强、 代码可重用率高。
2、 面向对象技术的思想
面向对象程序设计( Object Oriented Programming,简称OOP) , 是基于一种很自然和朴素的思想。计算机软件开发的过程就是人们使用各种计算机语言将现实世界映射到计算机世界的过程。计算机系统一般是在一定对象上执行一定行为的操作, 要获得灵便和可重用的系统, 最好的办法就是将软件结构建立在对象上, 而不是行为之上, 使计算机求解问题更加类似于人类的逻辑思维活动, 让程序设计按照我们平时认识客观世界的方式进行。
客观世界是由物质与意识构成的。现实生活中, ”一个学生张三”表示的是具体的事物, 而”学生”是一种意识。物质表示具体的事物, 意识是对客观存在的事物的一种抽象概括。在面向对象系统的求解空间中, 有对象和类, 若把现实事物直接映射到面向对象的软件系统求解空间, 那么物质对应于对象, 而意识对应于类( Class) 。
客观世界中, 学生是人们对所有具体的学生的抽象概括, 在面向对象系统中可用学生类来表示, 而学生张三是学生的一个具体的实例。在面向对象系统中可表示为一个对象, 这个对象就是学生类中的一个实例, 如下图所示。
面向对象更接近于计算机世界的物理实现; 面向对象思想则符合人们的认识习惯。面向对象作为一种思想和编程语言, 为程序从分析、 设计到编码整个过程提供了一个完整的解决方案。
( 二) 面向对象程序设计
活动一: 以下是处理学生成绩的两个程序, 学生成绩1.vbp用面向过程的方法设计, 学生成绩2.vbp用面向对象的方法编写, 试比较它们。
1、 开学生成绩1.vbp;阅读并运行该程序( 见程序一) 。
'程序一
Private Sub Form_click()
Dim i As Integer, n As Integer ‘n为学生数
Dim StName As String
Dim sc1 As Integer
Dim sc2 As Integer
Dim sc3 As Integer
Dim total As Single
Dim prompt As String
n = Val(InputBox("输入学生数"))
Print "姓名" & vbTab & "成绩1" & vbTab & "成绩2" & vbTab & "成绩3" & vbTab & "加权总分" & vbTab & "证书类型"
For i = 1 To n
StName = InputBox("输入第" & i & "位同学的姓名")
sc1 = Val(InputBox("输入该同学的软硬件基础成绩"))
sc2 = Val(InputBox("输入该同学的文字处理技巧成绩"))
sc3 = Val(InputBox("输入该同学的网络技术应用成绩"))
total = sc1 * 0.2 + sc2 * 0.5 + sc3 * 0.3
'输出表头
prompt = StName & vbTab & Str(sc1) & vbTab & Str(sc2) & vbTab & Str(sc3) & vbTab & Str(total) & vbTab
If (sc1 >= 85 And sc2 >= 85 And sc3 >= 85) Then
Print prompt & "优秀"
Else
If (total > 70 And sc1 >= 60 And sc2 >= 60 And sc3 >= 60) Then
Print prompt & "合格"
Else
Print prompt & "不合格"
End If
End If
Next i
End Sub
马上行动: 阅读本程序请问答
( 1) 找出程序中计算总分的语句。
( 2) 找出程序中判断证书类型的语句。
2、 打开学用面向对象方法生成的学生成绩2.vbp。
运行该程序后界面如下图所示:
讨论: 两个程序的执行过程有什么不同?
3、 观察”学生成绩2.vbp”的程序( 见程序二) 。
示
提
这段代码定义了一个”学生类”。类定义中包含了同类对象共同的属性, 这个”学生类”的属性有姓名和三门课成绩, 以及”行为( 方法) ”, 如计算总分方法、 判断证书类型方法等。VB中, 上述属性和方法都是封装在类模块中的。
示
提
与前一个程序相比能够发现程序一中实现计算总分的表示式和判断证书类型等功能的选择结构语句在程序二的代码窗口中已经找不到了, 取而代之的是对象方法的调用语句.
示
提
用红色标出的语句全部是stu对象的方法调用。
变量stu所声明的数据类型不是系统提供的数据类型, 而是一个由用户创立的自定义类型, 称为student类。
提
'程序二
'定义学生类
Dim stu As New Student
Dim n As Integer ‘n为学生数
'窗体启动
Private Sub Form_Load()
labN.Caption = 1 ‘学生序号标签显示1
End Sub
'单击”处理”按钮事件
Private Sub Command1_Click()
Dim StuRec As String
Dim StName As String
Dim sc1 As Integer
Dim sc2 As Integer
Dim sc3 As Integer
StName = TxtName.Text
sc1 = Val(TxtScore1.Text)
sc2 = Val(TxtScore2.Text)
sc3 = Val(TxtScore3.Text)
'将学生的信息赋给对象
Call stu.SetInf(StName, sc1, sc2, sc3)
'输出结果
StuRec = stu.GetName() & vbTab
StuRec = StuRec & stu.GetScore(1) & vbTab & stu.GetScore(2) & vbTab & stu.GetScore(3)
StuRec = StuRec & vbTab & stu.GetTotal() & vbTab & stu.Judge()
List1.AddItem StuRec
n = n + 1
labN.Caption = n + 1
'文本框清零
TxtName = ""
TxtScore1 = 0: TxtScore2 = 0: TxtScore3 = 0
TxtName.SetFocus
End Sub
马上行动: 阅读本程序问答( 1) 找出程序中计算总分的语句。
( 2) 找出程序中判断证书类型的语句。
4、 分别在程序一和程序二的计算总分和判断证书类型的语句之间添加语
句”SC1=0”, 再次运行两个程序, 看结果有什么不同。
小提示: 由于中途改变了软硬件基础成绩数据, 使得程序一的运行结果受到了影响, 而程序二不会受任何影响。
活动二 从VB的类模块中认识类、 对象和实体
1、 双击”学生成绩2.vbp”程序的工程资源管理窗口中类模块下的”student”,打开类模块代码窗口, 如下图所示
2、 阅读其中的程序, 如下图所示:
'定义存放学生姓名的变量和存放三门课成绩的数组
Private m_name As String
Private m_score(3) As Integer
'实现获得学生姓名的方法
Public Sub SetInf(name As String, s1 As Integer, s2 As Integer, s3 As Integer)
m_name = name
m_score(1) = s1
m_score(2) = s2
m_score(3) = s3
End Sub
'实现输出学生信息的方法
Public Function GetName() As String
GetName = m_name
End Function
Public Function GetScore(index As Integer) As Integer
GetScore = m_score(index)
End Function
'实现计算总分的方法
Public Function GetTotal() As Single
GetTotal = m_score(1) * 0.2 + m_score(2) * 0.5 + m_score(3) * 0.3
End Function
'实现判断证书类型的方法
Public Function Judge() As String
If m_score(1) >= 85 And m_score(2) >= 85 And m_score(3) >= 85 Then
Judge = "优秀"
ElseIf GetTotal() > 70 And m_score(1) >= 60 And m_score(2) >= 60 And m_score(3) >= 60 Then
Judge = "合格"
Else
Judge = "无"
End If
End Function
马上行动: 阅读以上学生类定义程序段后
( 1) 写出Student类中定义学生属性的部分
m_name用于表示
m_score(3)用于表示
( 2) 写出Student类中定义方法的部分。
子过程SetInf的作用是获取学生对象的姓名和三门课成绩;
函数GetScore的作用是输出学生对象的姓名和三门课成绩;
函数GetName的作用是
函数Judge的作用是
讨论: 在程序二中的语句”Call stu.SetInf(StName, sc1, sc2, sc3)”后, 添加语句”m_name="冯海"”,调试运行程序,看结果有何影响.原因是什么?
如果要计算四门课的成绩,该如何修改程序一和程序二,两者的修改方法有什么不同?
归纳总结: 两种程序设计方法的异同
1、 运行机制不同
程序一的运行过程完全由程序控制, 什么时候输入数据, 什么时候计算得出结果, 都是由程序员预先设计好的, 不能中途予以改变。若某用户在输入完第一个学生成绩的硬件基础成绩, 开始输入文字出理技巧成绩时, 发觉先前输入的成绩错了, 需要修改, 这时只能结束程序, 重新运行后再次输入, 而无法回到上一步修改输入。
程序二则不同, 用户可随时根据自己的意愿与应用程序进行交互。
2、 安全性不同
前面的活动一, 在两个程序中仅仅添加了改变软硬件基础成绩数据这一语句, 程序一的运行结果受到了影响, 和用户预期的结果相差甚远, 而程序二则没有受到任何影响。试想一下, 如果在一个由数十人甚至数百人合作开发的大型软件系统中, 万一需要修改某一数据, 对于使用面向过程方法设计编写的程序来说, 其后果是不可预计的。而对于使用面向对象的程序设计方法编写的程序则相对安全得多。
另外, 在程序二中不能使用变量赋值语句改变Student类模块中的变量值, 如m_name=”冯海”, 也就是说不能随意改变某一学生对象的姓名等数据。原因是类里的m_name等变量的定义语句使用了Private限定词, 只允许在类里使用这些变量, 而对于主程序, 必须经过调用类中的方法( 操作接口) , 如SetInf为其赋值。这样安全性更强了。
3、 实现具体功能的方法相同
两种方法设计的程序, 也有其共同之处, 如程序一中有实现”判断证书类型”的程序段, 程序二的Student类模块中也有实现”判断证书类型”的功能程序段, 两个程序都使用了结构化的方法来设计算法, 即都采用了选择结构。也就是说, 无论面向过程的程序, 还是面向对象的程序, 其实现具体功能的代码都采用了结构化程序设计方法来设计。
( 注: 本节部分内容引自上海科教出版社出版的普通高中信息技术课程实验教材《算法与程序设计》)
五、 课外拓展
课外练习: 初步总结面向对象程序设计与面向过程程序设计的异同。
展开阅读全文