跳转到内容

实用项目:设计

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

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

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


在本部分中,你应该规划整个系统,然后再构建它。实际上,并非所有项目都能完全按照计划进行,你可能会发现自己在实际编写项目代码时需要回头修改一些内容。建议不要在进行任何编码之前就编写设计。从你的分析中,你应该对要制作的内容有一个大致的了解,并且已经找到了一些教材作为入门。在编写设计之前,完成几个简单的示例程序,这样你就能更好地了解你正在使用的语言的功能。记住,不要害怕回头修改!

包含的部分

[编辑 | 编辑源代码]

为了获得满分,你应该尝试对以下所有内容进行说明。某些项目不需要所有部分,例如,你可能没有数据库,因此不需要包含 SQL。最好咨询你的老师,了解你需要包含哪些内容。

由 Adrian Allen 编辑并发送以供发布

总体系统设计

[编辑 | 编辑源代码]

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

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

让我们来看一个例子

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

模块化设计

[编辑 | 编辑源代码]

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

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

基于表单/导航

[编辑 | 编辑源代码]

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

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

更重要的是,你可以绘制一个漂亮的图表,显示所有内容如何相互关联。

基于代码

[编辑 | 编辑源代码]

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

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

[编辑 | 编辑源代码]

与你的分析非常相似。如果你从那时起没有进行任何更改,并且它是规范化的,只需将数据复制到这里。你将在第二部分的验证区域进行更多工作。写下值在程序运行期间如何存储以及哪些数据需要长期存储,数据是存储在数据库表中还是文件中?

记录结构定义

[编辑 | 编辑源代码]

如果你将任何内容保存到文本文件或 XML 文件中,请在此处说明这些文件如何组织。

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

所需的验证

[编辑 | 编辑源代码]

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

Mr.
Paul Louhisalo
11/08/68
49

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

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 不,我们无法阻止人们故意恶意行为,您可以尝试编码一些检查,但请注意“Scunthorpe 问题”!
出生日期 数据类型(日期) 确保他们输入了正确的出生日期 请插入有效的日期 果冻
脚趾数量 14 > 长度 >= 0 确保他们有合理的脚趾数量 请插入 0 到 13 之间的数字 -8

对于您的报告,您需要编写一个类似于上表的表格,尽管您可以省略最后两列。

验证符号:正则表达式

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

<数字><数字><字母><字母><字母>

甚至更简单

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]

如果您记得第二单元中的硬件部分,这将非常容易。您必须推荐如何将您的系统分发给用户,然后用户如何运行系统。

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

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

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

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

[edit | edit source]

您将被要求提供设计代码的示例。如果您有大量代码,请选择 6-8 个最有趣的示例。对于每一部分代码,请尝试包含以下内容

  • 标题
  • 简单的英语解释
  • 伪代码

例如,使用登录屏幕,您可以编写以下内容

简单的英语

[编辑 | 编辑源代码]

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

伪代码

[编辑 | 编辑源代码]

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

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

如果 userName 和 password 在 acceptableLogins 中,则

允许登录
显示菜单屏幕

否则

显示错误消息

结束 if

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

[编辑 | 编辑源代码]
这是一个简单的图表,你需要解释每个属性和子程序

如果你在编写程序时使用了面向对象编程(强烈建议使用这种方法来获得最高分),你需要在这里描述它。你必须提到以下内容:

  • 类名
  • 任何继承关系
  • 属性(变量),以及它们是公共的还是私有的,解释它们的作用
  • 函数名,包括返回值和描述
  • 过程名,包括返回值和描述
  • 任何执行的覆盖操作

用户界面设计 (HCI) 论据

[编辑 | 编辑源代码]

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

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

[编辑 | 编辑源代码]

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

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

你可以通过对每个屏幕截图进行标注来做到这一点。

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

[编辑 | 编辑源代码]

这可能是以下几种情况中的一种或多种:

  • 你的系统计划生成的一些报告的设计
  • 游戏的排行榜或测验的排行榜
  • 游戏屏幕,显示分数、生命值等
  • 显示数据的图表
  • 任何计算并显示给用户的项目

使用与上一节相同的论据,你必须完成这些项目的标注版本。

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

[编辑 | 编辑源代码]

安全性与完整性是略微不同的概念。

**安全性**意味着防止未经授权的人访问你的工作区域。这可能包括学生访问彼此的考试成绩、客户访问其他客户的详细信息、学生访问考试成绩,或任何与数据保护法相冲突的行为。为了做到这一点,你需要实施安全系统,例如用户名和密码、访问权限和限制区域。你可能会有一些按钮和区域只在某些用户登录时出现。如果他们是有限制的用户,他们将无法看到系统中的某些部分,而对于管理员用户,他们应该能够看到所有内容。

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

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

[编辑 | 编辑源代码]

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

你还要说明如果系统损坏或丢失,如何恢复系统。说明你将用来恢复系统/重新安装等的方法。

总体测试策略

[编辑 | 编辑源代码]

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

黑盒测试

[编辑 | 编辑源代码]
黑盒测试图

在这种模式下,你并不关心正在测试的代码背后的内容,你只知道从特定的数据输入中应该得到什么结果。这对于具有多个可能输入的复杂子程序非常有用。例如,测试搜索算法。如果你确实遇到了任何问题,那么你将不得不找到并修复它们。为此,我们使用......

白盒测试

[编辑 | 编辑源代码]
白盒测试图,其中每条彩色线代表代码中的一条路径

在白盒测试中,你将尽可能测试代码中的所有路径。这意味着查看你的代码,并尝试设计一些测试,这些测试将测试你编写的每个逻辑语句。例如,如果你有一个 if 语句来检查密码是否正确,请设计一个测试来查看它在输入正确密码时 **以及** 在输入错误密码时是否有效。你应该包括以下内容:

  • if 语句
  • while 循环

跟踪表

[编辑 | 编辑源代码]

这是查找和修复问题的好方法。你应该尝试选择两到三个最复杂的代码段,并对其执行跟踪表。通过使用这种方法,你可以证明代码有效。

华夏公益教科书