欢迎来到程序设计范式(Programming Paradigms)的世界!

你好!今天我们要深入探讨程序设计范式。别被这个华丽的名称吓到——范式(Paradigm)其实就是编写计算机程序的一种“风格”或“思维方式”。

想象你在盖房子。你可以一块砖一块砖地盖(程序式),也可以买现成的房间组件拼装起来(面向对象)。两种方式都能盖出房子,但你思考项目的思路却截然不同。本章将探讨 AQA A Level 课程中最重要的两种风格:程序式(Procedural)面向对象(Object-Oriented)

1. 什么是程序设计范式?

简单来说,程序设计范式是根据程序语言的特性及其结构化代码的方式,对程序语言进行的分类。

快速复习: - 程序式(Procedural): 着重于逻辑动作(动词)。 - 面向对象(OOP): 着重于数据对象(名词)。

2. 程序导向程序设计(Procedural-Oriented Programming)

程序式程序设计就像食谱。你从顶部开始,按顺序执行一系列指令(程序或子程序),直到抵达结尾。它采用结构化方法来进行程序设计。

结构化方法

这意味着将一个庞大且复杂的问题拆解成更小、易于管理的部分。这通常称为自顶向下设计(top-down design)

核心特性: - 序列(Sequence): 一个接一个地执行指令。 - 选择(Selection): 使用 IF 语句来作决策。 - 迭代(Iteration): 使用循环(FOR, WHILE)来重复执行任务。 - 子程序(Subroutines): 为一段代码命名,以便可以重复使用。

层级图(Hierarchy Charts)

当我们设计程序式程序时,会使用层级图。它们看起来像家族树,主程序位于最顶端,并向下分支出更小的子任务。

示例: 一个“游戏”顶层模块可以分支为“初始化图形”、“玩家输入”和“更新分数”。

结构化方法的优点

1. 易于调试(Debugging): 由于代码被拆分为小区块,更容易精确找出错误藏在哪里。 2. 代码重用: 你可以编写一次程序,然后多次使用它。 3. 团队协作: 不同的程序员可以同时处理不同的子任务。

重点总结: 程序式程序设计在于“做(doing)”。它利用自顶向下、结构化的方法,将大问题拆解为较小的程序。

3. 面向对象程序设计(Object-Oriented Programming, OOP)

OOP 有点不同。与其关注解决问题的步骤,我们更关注参与其中的“事物”(对象)。

如果一开始觉得有点难懂,别担心! 大多数学生在看过几个例子之前,都会觉得 OOP 的概念有点“颠倒”。

三大核心:类(Class)、对象(Object)与实例化(Instantiation)

- 类(Class): 一种蓝图或模板。它定义了对象将拥有什么数据,以及它能做什么。 - 对象(Object): 从蓝图构建出来的具体“事物”。 - 实例化(Instantiation): 将类实际转化为对象的过程。

类比: 就像饼干模具。对象就是实际做出来的饼干。实例化就是把模具压入面团做出饼干的动作!

OOP 的核心概念

  • 封装(Encapsulation): 隐藏对象的内部数据,仅允许透过特定的方法进行存取。这能保护数据免受意外修改。可以把它想象成保护药物的胶囊
  • 继承(Inheritance): 当一个新类(子类)继承了现有类(父类)的属性和方法。
    示例: 狗(Dog)类可以继承自动物(Animal)类。狗“是一种”动物。
  • 多态(Polymorphism): 意指“多种形态”。它允许不同的类拥有名称相同但行为不同的方法。
  • 重写(Overriding): 当子类用自己的版本取代从父类继承来的方法。
    示例: 猫(Cat)狗(Dog)都继承了 makeNoise() 方法,但狗将其重写为“汪汪”,而猫则将其重写为“喵喵”。

关系:聚合(Aggregation)与组合(Composition)

对象之间经常互相互动。我们使用两种主要的“具有(has-a)”关系:

1. 聚合(Aggregation): 一种“弱”关系。如果父对象被销毁,子对象依然可以存在。
示例: 图书馆(Library)书籍(Books)。如果图书馆关闭,书本依然存在。
UML 符号:白色(空心)菱形线条表示。

2. 组合(Composition): 一种“强”关系。如果父对象被销毁,子对象也会随之消失。
示例: 建筑物(Building)与其房间(Rooms)。如果建筑物被拆毁,房间也就不复存在了!
UML 符号:黑色(实心)菱形线条表示。

你知道吗? 使用组合而非继承通常更好,因为它能让你的代码更具弹性。这是一个常见的考试提示!

4. OOP 设计原则

为了编写“优质”的 OOP 代码,你应该遵循课程大纲中提到的这三个原则:

  1. 封装变动之处(Encapsulate what varies): 如果程序的某部分经常更动,将其放入独立的类中,这样就不会影响其他部分。
  2. 优先使用组合而非继承(Favor composition over inheritance): 将对象由其他对象组成(组合)通常比建立冗长复杂的家族树(继承)更容易。
  3. 针对接口编程,而非实现(Program to interfaces, not implementation): 关注对象应该“做什么”,而不是精确地“如何做”。

5. 编写与表示 OOP

在考试中,你可能需要诠释或绘制类图(Class Diagrams)

访问修饰符(Access Specifiers)

这些修饰符告诉我们谁可以看见类内的数据或方法: - 公开(Public, +): 任何人皆可存取。 - 私有(Private, -): 只有类本身可以存取。(最适合实现封装!) - 受保护(Protected, #): 只有该类及其“子类”可以存取。

方法类型

  • 静态(Static): 属于本身而非特定对象的方法。你可以在不建立对象的情况下直接使用它。
  • 虚拟(Virtual): 一种“可以”被子类重写的方法。
  • 抽象(Abstract): 一种“必须”被重写的方法,因为它本身没有代码——它只是一个占位符。

重点总结: OOP 着重于“事物”。它利用类(蓝图)建立对象,并透过继承、多态与封装来互相沟通。

总结清单

快速复习: - 你能解释类与对象的区别吗? - 你知道白色菱形(聚合)与黑色菱形(组合)的区别吗? - 你能列出程序式程序设计中结构化方法的优点吗? - 你记得 + 代表公开,而 - 代表私有吗?

别慌张! 这些术语需要多加练习。尝试为一个简单的系统绘制类图,例如“学校”(包含学生与教师类),这能帮助你牢记这些概念!