I. 面向对象程序设计

计算机科学涉及对复杂系统的研究,而计算机软件通常是这类系统的组成部分。为理解计算机软件开发,我们需要能够分析那种复杂性的工具。面向对象设计和编程成为了能让我们做到这一点的途径。其基于将一件软件,如同电脑一样,视为许多互动部分的组合。

在此使用的design这一术语,指的是设计满足特定规范(specifications)的实现(implementations),而非设计满足特定需求(requirements)的规范或设计需求本身。学生们不需在一开始就设计一个完整的程序,可以先从研究已经开发完成的程序入手,然后新增或修改程序的部分以扩展或改变其功能。在课程结束时,学生们将能按照规范来开发设计一个程序或程序的一部分。

在面向对象方法中,可执行程序的基本单位是object,一个拥有状态(数据)和行为(获取或改变其状态及与其他对象通过明确规定的接口进行交互等操作)的实体。AP Computer Science A课程大纲采用常见的class-based的方法来实现面向对象编程,各对象将由class来定义:一个class指定了对象的组件与操作,与此同时每个对象是某个class的一个实例。

A. 程序与类设计

开发面向对象程序的一个基本步骤是设计class。学生应该理解组成程序的不同类间的继承(inheritance, “is-a”)关系与组成(composition, “has-a”)关系。 他们还应该能依照规范实现一个class继承的层次结构,确认哪些class是其他class的subclass。

学生们应能基于class所表示的实体类型的描述来设计class,即编写包含实例变量(instance variables)和方法签名(method signatures,其主体即是程序实现的主要任务)的class declaration。提供给学生的实体描述会包括必须封装在class内的信息以及可以应用到class的某个实例上的操作以读取或修改那些信息。class的design包括选择适当的数据结构以表示所存储的信息以及选择适当的算法以实现对数据的操作。将操作分解为子操作(functional decomposition)是设计过程的一部分。

对于class的一个design,不论是自己还是他人完成的,学生们应该有能力实现它。他们还应能使用继承来扩展给定的class,创造一个具有不同或额外功能的subclass。

interface是描述一个class必须实现的一系列操作的规范。在Java中,专门定义了interface这种编程语言特性来达成此目的。由此,某个class里method的规范可以与其实现相分离。学生们应能编写interface,编写实现interface的class以及编写使用interface的程序。

B. 作为试卷考察对象的程序设计

AP Computer Science A考试会包括考察classes或具有简单层次结构的数个classes的设计与实现的问题。

此类设计问题将会给学生提供相关描述,说明对象应该封装的信息类型以及此对象应当提供的对于这些信息的操作。考试要求学生完成部分或全部的interface和class declaration以定义这些objects。

此类设计问题可能要求学生就下列主题做出解答:

  • 使用关键字extends恰当继承另一个class
  • 使用关键字implements恰当实现一个interface
  • 用恰当的参数定义constructors
  • 基于有意义的名称、恰当参数与恰当返回类型,定义constructors与methods
  • 选择恰当的数据表示
  • 将methods恰当设为公有(client-accessible, public)或私有(internal, private)
  • 将所有实例变量设为私有

此类设计问题可能仅要求学生明确恰当的constructor或method头(即权限修饰,返回类型,名称与参数列表,换言之方法签名加上返回类型)而并不要求实现constructors或methods主体的实现。考察简单class层次结构的问题可能还要求实现部分或全部classes的constructors或methods主体。

AP Java子集仅包含私有实例变量以鼓励单纯依靠methods来读取或修改对象。这种实践思路将对于特定数据表示的依赖最小化了,令数据表示可在之后被轻易改变。

II. 程序实现

有一些不包含在课程大纲中的主题也会被任何导论课所涵盖。例如,输入与输出必须是任何计算机编程课的一部分。然而,对于现代面向对象编程而言,实践中有很多不同方式来处理输入与输出。因此AP Computer Science A课程并不预设任何一种方式,也不会考察输入与输出的细节(除开基本的文本输出函数System.out.printSystem.out.println)。由此,教师们也可自由选择符合他们教学风格的方式,以及相应的课本与参考资料。

学生需要理解递归(recursion)的概念,并推导出简单递归方法的执行结果。与其他控制结构(control structures)不同,递归methods的编写不做要求。

现在编程语言的一个重要方面是存在丰富的语言库,提供许多常用的classes与methods。一项必备的编程技能即是恰当利用可用的库。AP Computer Science A课程大纲规定了Java标准库的一个子集,要求学生掌握这些classes与interfaces。

此外在编写其他程序时,学生应能重用他们自己的代码或其他代码示例,如AP计算机实验(AP Computer Science Labs)。

III. 程序分析

有许多种寻找与更正编程错误的技巧(debugging),包括人工验算、添加额外的输出语句以追踪程序执行或使用调试器(debugger)以提供程序运行时与崩溃时的信息。应当鼓励学生尝试各种除错工具。当然,因为这些技巧和工具的多样性,AP考试并不考察相关内容。

学生应能阅读并修改程序代码。他们还应能在已有class declaration的基础上利用继承定义新class以增加或者改变给定class的功能。AP计算机实验包含利用继承创建新classes的例子。

AP Computer Science A课程的学生应该理解运行时exceptions,这是Java虚拟机(virtual machine)报告程序错误的途径。throw语句不包含在AP Java子集内,但可能对教会学生检查错误有一定的帮助。

学生还应熟悉先决条件(preconditions)、后置条件(postconditions)与断言(assertions)的概念,并正确解读伪代码(pseudocode)中出现的实例。教师们可能会发现Java语言的assert语句能够让学生们方便的测试这些,但assert不是AP Java子集的一部分,也不在考察范围内。

学生应能进行对不同代码进行非正式的运行时间比较,如确定某条语句的执行次数或者某项计算所需的循环次数。

许多程序涉及到数值计算,因而受制于计算机整数位数的限制。学生应该理解不同进制的非负整数表示,尤其是十进制(decimal)、二进制(binary)、十六进制(hexadecimal)与八进制(octal)。他们还应理解整数表示上下限所造成的后果。

IV. 标准数据结构

学生应该理解标准数据结构及其使用。学生需要使用这些基本类型(primitive types):intdoubleboolean。其他的基本类型不是AP Java子集的一部分,但可能在课程中有用。

学生应了解Java String class及其methods。

学生应熟练掌握一维与二维数组,并理解二维数组实质上是数组的数组。就AP Computer Science A考试而言,学生可以假定二维数组每行的元素数目相当(rectangular, not ragged)且同行元素储存在一起(row-major order)。

学生应能使用数据的列表,并用Java数组与ArrayList class实现这些列表。他们应能在程序中使用这两种列表类型并根据给定应用需求选择最合适的。

V. 标准操作与算法

数组的标准操作包括遍历(traversals)、插入(insertions)与删除(deletions)。学生需了解两种标准查找算法,顺序查找(sequential search)与折半查找(binary search),以及它们的相对执行时间。AP Computer Science A课程要求三种排序(sort)算法:选择(selection)、插入(insertion)与归并(merge)。这些算法的实现可能会出现在考试中。

VI. 计算与社会

考虑到计算机与计算对社会各方面有巨大影响,有必要及早培养起对计算机使用的明智负责态度。AP Computer Science A课程中学到的计算应用提供了讨论计算对社会影响的机会。典型的议题包括:

  • 数据库应用,尤其是联网数据库,对个人隐私的侵犯
  • 电脑病毒与其他针对计算机系统的恶意攻击造成的经济与法律影响
  • 对人身安全有重大影响的应用促成的对容错性与高可靠性系统的需求,以及针对这些系统的软件工程标准
  • 知识产权及其合理使用

态度是获得而非被灌输的。对计算机系统的负责任使用应该由始至终的结合到AP Computer Science A课程里。参与课程让学生有机会讨论负责任使用系统以及对他人权利与财产的尊重等议题。学生应该学会对他们编写的程序负责,以及对使用这些程序所导致的后果负责。


陈 欣

AADPS创始人

1 条评论

AP计算机5分秘诀 – AP计算机科学A · 2018年6月20日 上午11:57

[…] 明确考试目标。需要熟读美国大学理事会的AP计算机课程描述和课程大纲。考试涉及的主要主题有:面向对象程序设计、程序实现、程序分析、标准数据结构、标准算法以及计算与社会。可以了解课程大纲说明以对AP计算机课程和考试的内容有清晰的认识。 […]

发表评论