首页 > 编程语言 >Chapter7_成为会使用面向对象编程的程序员吧

Chapter7_成为会使用面向对象编程的程序员吧

时间:2022-12-09 09:14:38浏览次数:43  
标签:语言 函数 对象 Chapter7 程序 程序员 面向对象编程 变量

理解面向对象编程

热身问答

  • Object 翻译成中文是什么?
    • 对象
    • 对象(Object)是表示事物的抽象名词。
  • OOP 是什么的缩略语?
    • Object Orient Programming
    • 面向对象也可以简称为 OO(Object Oriented)。
  • 哪种编程语言在 C 语言的基础上增加了对 OOP 的支持
    • C++
    • ++ 是表示自增(每次只将变量的值增加 1)的 C 语言运算符。之所以被命名为 C++,是因为 C++ 在 C 语言的基础上增加了面向对象的机制这一点。另外,将C++ 进一步改良的编程语言就是 Java 和 C# 语言。

7.1 面向对象编程

面向对象编程(OOP,Object Oriented Programming)是一种编写程序的方法,旨在提升开发大型程序的效率,使程序易于维护。这里的维护指的是对程序功能的修改和扩展。

7.2 对OOP的多种理解方式

面向对象编程是一种基于以下思路的程序设计方法:将关注点置于对象(Object)本身,对象的构成要素包含对象的行为及操作B,以此为基础进行编程。这种方法使程序易于复用,软件的生产效率因而得以提升。其中所使用的主要编程技巧有继承、封装、多态三种。

那么, 如何理解OOP呢?

7.3 观点 1:面向对象编程通过把组件拼装到一起构建程序

面向对象中的重要要素: class

若干个类组装到一起就构建了一个完整的程序, 所以类是程序的组件/Component, 而面向对象编程的关键就在于能否灵活地运用类

那么, 类是什么?

我们在之前说过, 无论使用哪种开发方法,编写出来的程序其内容最终都会表现为数值的罗列,其中的每个数值要么表示“指令”,要么表示作为指令操作对象的“数据”。程序最终就是指令与数据的集合

在使用C 语言或 BASIC 等语言编程时(它们不是面向对象的编程语言,即不是用于表达面向对象编程思想的语言),用“函数”表示指令,用“变量”表示数据。对于 C 语言或是 BASIC 的程序员而言,程序就是函数和数据的集合。

/*变量*/
int Variable1;
int Variable2;
int Variable3;
…
    
/*函数*/
void Function1() { 处理过程 }
void Function2() { 处理过程 }
void Function3() { 处理过程 }

但是在大型程序中, 变量和函数的数量很可能会大量累计, 就可能会导致代码凌乱、开发效率低下以及难以维护。所以我们要好好给变量和函数分类, 把程序中有关联的函数和变量汇集到一起变成类。一个类中的函数和变量就是类的成员/Member。

为了使 C 语言支持面向对象编程,人们扩充了它的语法,开发出了 C++ 语言。而通过改良 C++ 又开发出了 Java 和 C#。

class MyClass  /*类名*/
{
    /*类的成员(变量和函数)*/
    int Variable1;
    int Variable2;
    …
    void Function1() { 处理过程 } 
    void Function2() { 处理过程 }
    …
};

7.4 观点 2:面向对象编程能够提升程序的开发效率和可维护性

在使用面向对象编程语言开发时,并不是所有的类都必须由程序员亲自编写。大部分的类都已内置于面向对象编程语言中了,这些类可以为来自各个领域的程序员所使用。通常将像这样的一组类(一组组件)称作“类库”。通过利用类库可以提升编程的效率。还有一些类原本是为开发其他程序而编写的,如果可以把这些现成的类拿过来使用,那么程序的开发效率就更高了。

企业级的程序通常对程序的可维护性要求较高, 因为将程序投入使用了, 我们一般需要对其已有的功能进行修改和新功能的扩充。

举例来说,假设我们已经编写出了一个用于员工薪资管理的程序。随着薪资计算规则的变更,程序也要进行修改,那么需要修改的函数和变量就应该已经集中在一个类中了,比如一个叫作 CalculationClass 的类(如图 7.2 所示)。也就是说,维护时没有必要去检查所有的类,只需修改类 CalculationClass 就可以了。(可维护性会在第十二章继续介绍)

image-20221124082143267

对于创造类的程序员, 将什么抽象为类也是很重要的。 设计类必须要考虑到 当其组件有缺陷了的时候, 这个类也可以被轻松替换。

在功能升级后,旧组件能够被新组件所替换的设计也是必不可少的。因此,创造者和使用者之间就需要事先商定类的使用规范。请诸位记住,对于类的使用者而言“类看起来是什么样子的”这种关于规范的描述通常被称为“接口”(Interface)。

7.5 观点 3:面向对象编程是适用于大型程序的开发方法

就像之前提到的, 假设一个程序需要 10000 个函数和 20000 个变量,使用面向对象编程,可以把这个程序用 100 个类组织起来,那么平均一个类里就只有 100个函数和 200 个变量了。

7.6 观点 4:面向对象编程就是在为现实世界建模

建模:

  • 组件化: 将可看作是由若干种对象构成的集合的现实世界分割成组件
  • 省略化: 但是也不必将现实世界100%搬入程序中, 所以我们可以忽略掉一些组件。

举例来说,假设要为巨型喷射式客机建模,那么就可以从飞机上抽象归类出机身、主翼、尾翼、引擎、轮子和座席等组件(如下图所示)。而像是卫生间这样的组件,不需要的话就可以省略。“建模”这个词也可以理解为是制作塑料模型。虽然巨型喷射式客机的塑料模型有很多零件,但是其中应该会省略掉卫生间吧,因为这对于塑料模型来说不是必需的。

image-20221124082745641

7.7 观点 5:面向对象编程可以借助 UML 设计程序

UML: Unified Modeling Language 统一建模语言

UML帮助我们把对现实世界建模的结果以图的形式表示回来。

在 UML 中,规定了九种图。之所以有这么多种,是为了从各种各样的角度表示对现实世界建模的结果。

image-20221124082925189

下图有一个UML类图的示例, 正是7.3中 Myclass的图形式的表示。

将一个矩形分为上中下三栏,在上面的一栏中写入类名,中间的一栏中列出变量(在 UML 中称为“属性”),在下面的一栏中列出函数(在 UML 中称为“行为”或是“操作”)。

image-20221124083043942

在进行面向对象编程的设计时,要在一开始就把所需要的类确定下来,然后再在每个类中列举出该类应该具有的函数和变量,而不要到了后面才把零散的函数和变量组织到类中。也就是说,要一边观察作为程序参照物的现实世界,一边思考待解决的问题是由哪些事物(类)构成的。正因为在设计时要去关注对象,这种编程方法才被称为面向对象编程(Object Oriented Programming,其中的 Oriented 就是关注的意思)。而在那些传统的开发方法中,进行设计则是要先考虑程序应该由什么样的功能和数据来构成,然后立即确定与之相应的函数和变量。与此相对在面向对象编程的设计中,因为一上来就要确定有哪些类,从而构成程序的函数和变量就必然会被组织到类中。

7.8 观点 6:面向对象编程通过在对象间传递消息驱动程序

假设要编写这样一个程序,玩家 A 和玩家 B 玩剪刀石头布,由裁判判定输赢。

未使用面向对象编程语言的情况(C 语言):

/* 玩家 A 确定手势 */
a = GetHand();
/* 玩家 B 确定手势 */
b = GetHand();
/* 判定胜负 */
winner = GetWinner(a, b);

使用了面向对象编程语言的情况(C++):

// 玩家 A 确定手势
a = PlayerA.GetHand();
// 玩家 B 确定手势
b = PlayerB.GetHand();
// 由裁判判定胜负
winner = Judge.GetWinner(a, b);

区别:C++使用了属于PlayerA的函数GetHand(), 以及属于PlayerB的函数GetHand();, 还有属于Judge的函数GetWinner()。

在 C 语言的代码中,仅仅使用了 GetHand() 和 GetWinner() 这种独立存在的函数。与此相对在 C++ 的代码中,因为函数是隶属于某个类的,所以要使用 PlayerA.GetHand() 这样的语法,表示属于类 PlayerA的函数 GetHand()。

也就是说用 C++ 等面向对象编程语言编写程序的话,程序可以通过由一个对象去调用另一个对象所拥有的函数这种方式运行起来。这种调用方式被称为对象间的“消息传递”。面向对象语言中所说的消息传递指的就是调用某个对象所拥有的函数

如果未使用面向对象编程语言,那么可以用流程图表示程序的运行过程。流程图表示的是处理过程的流程,因此通常把非面向对象语言称为“过程型语言”。

如果使用面向对象编程语言, 那么可以使用 UML 中的“时序图”和“协作图”表示程序的运行过程。 在时序图中,把用矩形表示的对象横向排列,从上往下表示时间的流逝,用箭头表示对象间的消息传递(即程序上的函数调用)。

image-20221124084108695

7.9 观点 7:在面向对象编程中使用继承、封装和多态

继承Inheritance、封装Encapsulation、多态Polymorphism,这三个是面向对象编程的三个基本特性。

  • 继承:通过继承已存在的类所拥有的成员而生成新的类
  • 封装:在类所拥有的成员中,隐藏掉那些没有必要展现给该类调用者的成员
  • 多态:针对同一种消息,不同的对象可以进行不同的操作。

7.10 类和对象的区别

类是对象的定义,对象是类的实例/Instance。

在之前的7.3节的程序中,定义了一个类 MyClass。但是我们还无法直接使用类 MyClass 所持有的成员,要想使用就必须在内存上生成该类的副本,这个副本就是对象.

image-20221124085108558

先创建类的对象然后再使用(C++):

MyClass obj;  // 创建对象
obj.Variable = 123; // 使用对象所持有的变量
obj.Function(); // 使用对象所持有的函数

所以我们需要先创建一个个的对象, 然后才能使用类中定义的成员。

7.11 类有三种使用方法

  1. 仅调用类所持有的个别成员(函数和变量)
  2. 在类的定义中包含其他的类(这种方法被称作组合)
  3. 通过继承已存在的类定义出新的类。

下面有一段C#编写的Windows应用程序: 当用户点击按钮,就会弹出一个消息框,里面显示的是输入到两个文
本框中的数字进行加法运算后的结果。

然后我们来关注这里的类的三种使用方法:

  • 在这个程序中,表示整体界面的是以 Form1 为类名的类。类 Form1 继承了类库中的类System.Windows.Forms.Form 。
    • 在 C# 中用冒号“:”表示继承。
  • 在窗体上,有两个文本框和一个按钮,用程序来表示的话,就是类 Form1 的成员变量分别是以类 System.
    Windows.Forms.TextBox(文本框类)为数据类型的 textBox1、textBox2,和以类System.Windows.Forms.Button(按钮类)为数据类型的 button1。
    • 像这样类中就包含了其他的类,也可以说是类中引用了其他的类。
  • 而代码中的 Int32.Parse 和 MessageBox.Show,只不过是个别调用了类中的函数。

进行加法运算的 Windows 应用程序(用 C# 编写):

public class Form1 : System.Windows.Forms.Form
{
    private System.Windows.Forms.TextBox textBox1;
    private System.Windows.Forms.TextBox textBox2;
    private System.Windows.Forms.Button button1;
     ...
    private void button1_Click(object sender, 
    System.EventArgs e)
    {
        int a, b, ans;
        a = Int32.Parse(textBox1.Text);
        b = Int32.Parse(textBox2.Text);
        ans = a + b;
        MessageBox.Show(ans.ToString());
    }
}

image-20221124085743719

总结

面向对象编程就是把组件拼装到一起进行编程的方法。

面向对象中使用的编程技巧有继承、封装和多态三种。

OOP的关键在于能否灵活地运用类。

类是互相有关联的函数和变量的合集。

而一个类的对象可以通过生成另一个类的对象, 从而调用另一个类的函数。 这就叫做对象间的消息传递。

UML帮助我们以图的形式现实编程语言对于现实世界的建模。


标签:语言,函数,对象,Chapter7,程序,程序员,面向对象编程,变量
From: https://www.cnblogs.com/Natsumeno/p/16968000.html

相关文章