跳转到内容

实用项目:设计

来自维基教科书,开放世界中的开放书籍

单元 4 - ⇑ 计算实践项目 ⇑

← 分析 设计 技术解决方案 →


本节应该是您在构建系统之前计划整个系统的地方。它并不总是按这种方式进行,您可能会发现自己需要在实际编码项目时返回并更改一些内容。不建议在完成一些编码之前编写设计。从您的分析中,您应该对要生产的内容有所了解,并且已经找到了一些教科书来帮助您入门。在编写设计之前,完成几个简单的示例程序,这样您将更好地了解所用语言的功能。记住,不要害怕回来更改内容!

要包含的部分

[编辑 | 编辑源代码]

为了获得满分,您应该努力编写关于以下所有内容的信息。一些项目不需要所有部分,例如,您可能没有数据库,因此不需要包含 SQL。最好始终与您的老师核实您需要包含的内容。

总体系统设计

[编辑 | 编辑源代码]

为了清楚地说明我们将如何完成项目,使用 IPSO 图表是一个好主意。IPSO 代表输入、过程、存储、输出。每个项目都应该在这些标题下包含信息。下面是一个示例

  • 输入 - 这些可能包括各种类型的人机交互以及从外部来源加载数据,例如数据库、网络提要、科学仪器等。
  • 过程 - 这是最重要的部分。您将处理什么,它将计算什么?
  • 存储 - 这将记录您将以何种方式存储数据,它可能包括数据库表名、结构名以及外部文件,例如 xml 和 csv。
  • 输出 - 最终用户将获得什么,将输出到屏幕上的内容?

让我们来看一个例子

输入 过程 存储 输出
用户详细信息
新购买
月度销售额
表现最佳的销售人员
最高付费客户
数据库表
客户
库存商品
购买
收据
月度销售额图表

模块化设计

[编辑 | 编辑源代码]

当您设计系统时,需要将其拆分成更小的组件。就像这本书有关于不同事物的不同章节一样,您的项目应该有不同的部分(模块)执行不同的操作,但是当它们组合在一起时,它们就形成了一个完整的整体。

将项目拆分成模块有两种方法,一种是基于代码的,另一种是基于表单的。理想情况下,您的项目应该同时使用这两种方法。

基于表单/导航

[编辑 | 编辑源代码]

如果您的程序具有许多不同的功能并且使用网站或应用程序,您可能需要使用不同的页面来执行不同的任务。您还可以从主菜单开始,从一个页面导航到另一个页面。您需要显示使用的不同表单/页面以及如何从一个页面导航到另一个页面。

  • 主菜单
    • 调整产品
      • 添加产品
      • 删除产品
      • 更新产品
    • 销售商品
    • 调整员工
      • 添加员工
      • 删除员工
      • 更新员工
    • 报告
      • 巧克力
      • 啤酒
      • 香肠

更重要的是,您可以绘制一个关于所有内容如何链接在一起的漂亮图表。

基于代码

[编辑 | 编辑源代码]

如果您正在编写一个非常复杂的编码项目,那么您可能正在使用代码模块,一些模块建立在其他模块之上。您可能还在使用类,您需要显示类继承图。

数据需求定义(设计数据字典)

[编辑 | 编辑源代码]

与您的分析非常相似。如果您自上次分析以来没有进行任何更改,并且它已规范化,只需将数据复制到这里。您将需要在验证区域进行一些额外的操作。写下程序运行时值将如何存储以及哪些数据需要长期存储,数据将存储在数据库表中还是文件中?

记录结构定义

[编辑 | 编辑源代码]

如果您将任何内容保存到文本文件或 XML 文件中,请在此处提及这些文件的组织方式。

如果您在代码中使用记录或结构,请在此处提及它们以及它们的工作方式。

所需的验证

[编辑 | 编辑源代码]

如果您让用户输入数据,您肯定需要验证他们插入的数据。例如,如果您让他们填写新的客户记录,您将拥有诸如标题、姓氏、出生日期、脚趾数量之类的字段。您希望他们输入以下数据

Mr.
Peter
16/07/93
10

如果他们输入了以下内容会发生什么

Mrr.
PeanutButter
jellytime
-8

好吧,这可能会破坏您的系统,我们需要阻止他们将“垃圾”输入到我们的系统中。如果我们允许垃圾数据,我们的计算将无法正常进行,我们的报告将不正确,数据将毫无用处。请记住这条规则

垃圾进,垃圾出

为了防止输入“垃圾”,我们将进行验证,这意味着检查个人输入到系统中的每项数据。我们可以通过多种方式做到这一点

验证检查 描述 适合的适用字段 有效数据 错误数据
数据类型 检查仅将特定数据类型插入字段中。例如日期或整数 出生日期 18/02/97 13/13/13 或“clot”
长度 检查输入的数据是否具有正确的字符数。例如,英国电话号码始终为 11 个字符,或者购物商品的 ID 始终为 5 个字符。 邮政编码 E4 7HJ EEE668 JUY
范围 检查数据是否在设定的范围内,大于、小于、介于等等。例如,某人的年龄将大于 0,一个月的日数将大于或等于 28,小于 31。 肾脏数量 2 45
存在 当您需要使输入数据成为强制性时,就会出现这种情况,用户不允许漏掉任何字段。例如,他们必须说明他们是否同意或不同意法律声明,他们必须输入邮政编码。 电话号码 07070707070 (空白)
查找/列表 这指的是只允许将设定好的值输入到字段中。例如,标题字段只允许“先生”、“女士”、“小姐”、“夫人”、“博士”等选项。任何其他输入都会被视为错误。您可以使用下拉列表来实现这种验证方式。 性别 女性 攻击直升机

大多数数据库软件包都内置了这些验证检查,因此,如果您创建了数据库,然后使用开发套件创建表单,验证将自动添加到表单中。如果您没有此权限,则需要手动编码验证。当然,这将在技术解决方案阶段进行。让我们看看我们最初的垃圾数据,我们是否成功使用验证来阻止所有乱七八糟的东西进入我们的数据库?

字段名称 验证检查 描述 错误消息 数据 捕获
头衔 查找(“先生”、“女士”、“小姐”、“夫人”、“博士”) 只允许正确格式的标题 请输入有效的标题 Mrr。
名字 存在 确保姓名长度合理且存在 请输入姓名 Peter8 不,我们无法阻止人们故意恶意行为,您可以尝试编写一些检查,但要注意“斯肯索普问题”!
出生日期 数据类型(日期) 确保他们输入了正确的出生日期 请输入有效的日期 果冻
脚趾数量 14 > 长度 >= 0 确保他们输入了合理的脚趾数量 请输入 0 到 13 之间的数字 -8

在您的报告中,您需要编写一个类似于上面表格的表格,但您可以省略最后两列。

验证符号:正则表达式

当您尝试对输入数据的格式进行强制执行时,您可能需要使用验证符号。例如,如果您想指定一个类名必须是两位数字后跟三个字母,例如 12PKP,您可以编写

<number><number><letter><letter><letter>

或者更简单地

99LLL

相应的正则表达式可以写成

/^[0-9][0-9][a-zA-Z][a-zA-Z][a-zA-Z]$/

或者

/^[0-9]{2}[a-zA-Z]{3}$/

文件组织和处理(如果适用)

[edit | edit source]
  • 文件大小
  • 数据量

数据库设计,包括规范化关系(如果适用)

[edit | edit source]

如果您正在创建数据库,则需要包含一个 E-R 图。您应该展示该图并解释每个关系的含义。例如

  • 一个学生可以有许多预约
  • 每个预约只有一名学生
  • 每个预约只有一本书
  • 一本书可以参与许多预约

计划的 SQL 查询示例(如果适用)

[edit | edit source]

如果您正在创建数据库,您需要编写关于用于SELECTINSERTUPDATEDELETE 表中内容的 SQL 语句。在某些情况下,您可能还需要编写创建单个表的代码,即数据定义语言。事实上,这些标题正是您需要使用的标题。

保留字

当您查询数据库时,您可能会遇到一些意外的错误,查询无法运行,即使它似乎没有任何问题。这可能是由于在查询中使用了保留字造成的。SQL 有很多保留字,它们具有特殊含义,如果您在查询中使用其中一个字,它不会将其视为字段名。例如

SELECT Username, Password FROM tblUsers

这可能会导致错误,因为Password是 SQL 中的保留字。为了解决这个问题,您可能需要将字段名更改为更合理的东西,或者将字段名放在方括号中

SELECT Username, [Password] FROM tblUsers

还有很多其他保留字,所以要小心

PERCENT, PLAN, PRECISION, EXISTS, PRIMARY, PRINT, PUBLIC,
BACKUP, FOREIGN, READ,FREETEXT, FROM, REFERENCES, BULK, 
FULL, RESTORE, GROUP, IDENTITY, RULE, SAVE, INDEX, SELECT, 
STATISTICS, KEY, TABLE, NATIONAL, DATABASE, UNION, DELETE, 
DISK, ON, USER, PASSWORD

不同的数据库具有不同的保留字集,您可以在此处找到一份好的列表。

注意:如果您没有使用 SQL 服务器(例如,使用带有 PHP 的 MySQL),您可能需要使用 `反引号` 而不是方括号表示法。

SELECT

[edit | edit source]

本节应该列出您编写的返回记录选择的全部 SQL 语句。您应该用简单的英语描述 SQL 语句的使用位置及其作用,然后包含 SQL 代码以及您需要的任何注释。例如

英语描述
此 SQL 语句选择用户选择的商品的详细信息(ID、名称、价格、描述)。这样用户就可以在购买商品之前,在预览屏幕上查看商品的详细信息。

SQL

SELECT ID, Name, Price, Description FROM Products
WHERE ID=?

INSERT

[edit | edit source]

本节应该列出您编写的将新记录插入数据库的所有 SQL 语句。您应该用简单的英语描述 SQL 语句的使用位置及其作用,然后包含 SQL 代码以及您需要的任何注释。例如

英语描述
此 SQL 语句添加了一个新的最高得分,以及用户帐户取得该分数的日期。

SQL

INSERT INTO Scores (ID, DateofScore, Score)
VALUES (?,?,?)

UPDATE

[edit | edit source]

本节应该列出您编写的使用新详细信息更新旧记录的所有 SQL 语句。您应该用简单的英语描述 SQL 语句的使用位置及其作用,然后包含 SQL 代码以及您需要的任何注释。例如

英语描述
此 SQL 语句更新了用户的出生日期,这是在用户首次登录程序后更新启动的表单时完成的。

SQL

UPDATE User
SET DoB=?
WHERE ID=?


数据定义语言

[edit | edit source]

如果您使用 Open ModelSphere 等程序设计了数据库表,那么您可以定义创建表的代码,然后将其输入 MySQL 或 MSSQL 中以创建数据库。为这部分内容获取一些分数,并列出您的 DDL。例如,创建名为employees 的表并包含一些示例列的命令将是

CREATE TABLE employees (   
    id            INTEGER   PRIMARY KEY,
    first_name    CHAR(50)  null,
    last_name     CHAR(75)  not null,
    dateofbirth   DATE      null
);

存储介质识别

[edit | edit source]

(注意:新 AQA 规范中不需要)

如果您还记得Unit 2 中的硬件部分,这将非常容易。您必须推荐您的系统将如何分发到用户手中,以及如何由用户运行

您需要首先计算分发程序需要占用多少空间,以及运行程序需要占用多少空间。

分发软件需要以某种方式将数据传输给用户。这可以通过 CD-ROM、USB 驱动器、DVD-ROM 或互联网连接实现。为什么要选择其中一种?哪一种最适合?考虑安全性、速度、备份、要传输的文件大小等因素。

运行系统在大多数情况下都需要用户能够向您的系统写入新文件,例如保存最高得分、新购买内容等。系统在可行的情况下会变得有多大?您需要推荐一些允许用户读写、安全可靠、容量足够大且速度足够快的方案。CD-ROM 在这里不合适,为什么?硬盘可能适合,为什么?

识别适合的数据转换算法,以及这些算法的伪代码

[edit | edit source]

您将被要求提供有关代码设计示例的信息。如果您有很多代码,请挑选 6-8 个最有趣的示例。对于每个代码片段,请尝试包含以下内容

  • 头衔
  • 用简洁的英语解释
  • 伪代码

例如,对于登录屏幕,您可以编写以下内容

用简洁的英语解释

[edit | edit source]

这段代码获取用户输入的用户名和密码,然后将其与存储在登录文件中的登录详细信息进行比较。

伪代码

[edit | edit source]

var userName = Textbox.username var password = Textbox.password

从文本文件加载可接受的登录名和密码,并将其存储到 var acceptableLogins 中

如果 userName 和 password 在 acceptableLogins 中,则

允许登录
显示菜单屏幕

否则

显示错误消息

结束 if

类定义(图)以及对象行为和方法的详细信息(如果适用)

[edit | edit source]
这是一个简单的图,您需要解释每个属性和子例程

如果您在编写程序时使用了面向对象编程(强烈建议使用这种方式以获得最高分数段),则需要在此处描述它。您必须提及以下内容

  • 类名
  • 任何继承
  • 属性(变量)以及它们是公共的还是私有的,并解释它们的用途
  • 具有返回值和描述的函数名
  • 具有返回值和描述的程序名称
  • 任何执行的覆盖

用户界面设计(HCI)原理

[edit | edit source]

在所有项目中,您都将使用某种形式的用户界面,几乎在所有情况下,这都将是 GUI。本节操作要求您展示和解释您将用来捕获数据(输入)的方法,以及您将用来显示/打印数据(输出)的方法。请注意,在每种情况下都提到了“示例”,因此您不必展示每种表单/打印的外观,每个表单/打印的 4 个示例就足够了。您可以手工绘制每个示例,或者使用像 Inkscape 这样的艺术软件包绘制它们,或者您可以在像 Visual Studio 这样的软件包中设计它们,并使用表单的设计视图。不要使用最终代码运行的屏幕截图,我们需要看到您的设计。

计划的数据捕获和输入设计 UI 示例

[edit | edit source]

本节需要展示您表单/界面的设计。不要害怕包含表单在设计视图中的早期屏幕截图。请记住,我们不是根据工作代码来评分本节,而是根据每个表单/界面的设计理念来评分。您必须说明您的推理

  • 复选框/单选按钮
  • 下拉列表
  • 元素的定位
  • 配色方案
  • 导航的简便性

您可以通过标注每个屏幕截图来完成此操作。

计划的有效输出设计 UI 示例

[edit | edit source]

这可能是以下几种情况之一

  • 您系统计划生成的报告的设计
  • 游戏或测验的高分榜
  • 显示分数、生命值等的游戏画面
  • 显示数据的图表
  • 任何计算并显示给用户的项目

使用与上一节相同的原理,您必须完成这些示例的标注版本。

计划用于数据安全性和完整性的措施描述

[edit | edit source]

(注意:新规范不需要)

安全性和完整性略有不同。

安全是指防止未经授权的人员访问您的工作区域。这可能包括学生访问彼此的考试分数、客户访问其他客户的详细信息、学生访问考试分数,或者任何与数据保护法冲突的行为。为此,您需要实施安全系统,例如用户名和密码、访问权限和限制区域。您可能拥有仅对特定用户显示的某些按钮和区域。如果它们是受限用户,他们将看不到系统的一部分,而管理员用户则应该能够看到所有内容。

完整性是指确保您的数据不会“损坏”。这意味着确保某些数据位始终采用正确的格式或不违反某些规则。例如,如果您有一个出生日期,您不希望人们在该字段中插入姓名。您如何做到这一点?使用验证规则。在此处写下关于它们的说明。您可能还想确保您的数据库保持其 参照完整性。这将防止人们链接到不存在的其他表中的记录。谈谈您将如何做到这一点。

计划用于系统安全的措施描述

[edit | edit source]

(注意:新规范不需要)

您不希望未经授权的人员访问您的数据。这可能包括跟踪者试图查找存储在您系统中的个人详细信息、学生试图作弊等。您可能建议最终用户将数据保存在安全位置或操作系统密码后面。或者,可以使用主密码进入您的系统。

您还应说明系统在出现损坏或丢失情况下的恢复方式。说明您将用来恢复系统/重新安装等的方法。

总体测试策略

[edit | edit source]

(注意:新规范不需要)

您可以通过多种不同的方式测试您的系统。本节要求您考虑每种方式,并说明您将如何使用它们来测试您的系统。不要仅仅描述每种方式,您必须说明您将如何使用它们来测试您的系统。

黑盒测试

[edit | edit source]
黑盒测试图

在这种模式下,您不关心所测试内容背后的代码,您只知道特定数据输入应该产生什么结果。这对于具有多个可能输入的复杂子例程很有用。例如,测试搜索算法。如果您遇到任何问题,则需要找到并修复它们。为此,我们使用...

白盒测试

[edit | edit source]
白盒测试图,其中每条彩色线表示代码中的一个路径

在这种情况下,您将尽力测试代码中的所有“路径”。这意味着查看您的代码,并尝试设计出测试,以测试您编写的每个逻辑语句。例如,如果您有一个 if 语句用于检查密码是否正确,请进行测试,以查看在插入正确密码插入错误密码时它是否正常工作。您应该包括以下内容

  • if 语句
  • while 循环

跟踪表

[edit | edit source]

这是一个查找和修复问题的绝佳方法。您应该尝试选择两到三个最复杂的代码片段来进行跟踪表。通过使用它,您可以证明代码有效。

华夏公益教科书