项目 | 内容 |
---|---|
这个作业属于哪个课程 | 课程社区的链接 |
这个作业的要求在哪里 | 作业要求的链接 |
我在这个课程的目标是 | 掌握软件开发中常用的结对编程模式 |
这个作业在哪个具体方面帮助我实现目标 | 了解软件团队中如何利用结对编程来提升开发效率 |
文章目录
[BUAA软工第三次]结对编程
结对编程作业
发表在你的个人博客上,也可以同时转发到你的团队博客上来增加你们团队博客的人气。博客共 50 分,具体要求如下:
班级及项目地址
- 教学班级:周五班
- 项目地址:GitHub库
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 60 | 60 |
Development | 开发 | 940 | 850 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 90 |
· Design Spec | · 生成设计文档 | 60 | 60 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 120 | 150 |
· Coding | · 具体编码 | 180 | 150 |
· Code Review | · 代码复审 | 180 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 300 | 240 |
Reporting | 报告 | 170 | 200 |
· Test Report | · 测试报告 | 120 | 150 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1170 | 1110 |
编程原则
Information Hiding
在计算机科学中,信息隐藏(Information Hiding)是将计算机程序中最有可能发生变化的设计决策隔离开来的原则,从而保护程序的其他部分在设计决策发生变化时不被大量修改。这种保护包括提供一个稳定的接口,保护程序的其余部分不受实现(其细节可能会改变)的影响。
在我们的实现中,我们依照这个原则将两大关键板块分割开来,IO系统和计算模块两者互不干扰。在这两个关键板块之内我们也细分了更精密的信息隐藏方法,比如在IO系统中,读取文件和手动输入两个方法互不耦合,只对最终的借口提供一个字符串;在计算模块中,字符串处理和核心方法互不干涉,核心方法只需要接受一个处理妥当的字符串,而不需要关心其具体处理方法;同时在最终的结果输出,针对GUI和CLI,我们只需要在输出系统接受一个结果并且根据具体环境来实现输出方法,完全没有和计算模块耦合。这三个例子只是我们实现方法中很小的一部分体现信息隐藏原则的地方。
Interface Design
用户界面设计(Interface Design)的重点是最大限度地提高可用性和用户体验。在计算机或软件设计中,用户界面设计是建立具有美感的界面的过程;UI设计师建立易于使用和使用感良好的界面,在完成用户目标的前提下,使用户的交互尽可能的简单和有效(以用户为中心的设计)。一个良好的图形用户界面(GUI)往往可以增强软件的可用性,让用户摆脱命令行界面(CLI)的繁琐。
关于我们的UI设计请移步后文GUI。
Loose Coupling
在计算和系统设计中,松耦合指:
- 其中组件之间的联系很弱(有可中断的关系),因此,一个组件的变化对另一个组件的存在或性能影响很小。
- 在这个系统中,每个组件对其他独立组件的定义知悉甚少或一无所知。
我们在实现功能时候尽可能地遵守松耦合的原则,除了在上面信息隐藏的过程中实现的松耦合,我们在核心计算模块更加重视松耦合。我们的核心计算模块Processor.cs
主要有以下两个关键部分:ConcatTree.cs
、ResGen.cs
,他们完全独立。其中:
ConcatTree.cs
产生我们的方法依赖的单词树ResGen.cs
处理单词树以生成结果
另外,我们在Core.cs
中封装所有的方法,其内容和具体的实现方法也是相互独立的,只需要传入一个Processor
并且接受ResGen
的返回值。
计算模块接口的设计与实现过程
方法设计
我们的方法主要基于建立和维护一个由多叉树组成的森林(Wikipedia: Forest is a collection of disjoint trees. In other words, we can also say that forest is a collection of an acyclic graph which is not connected. Here is a pictorial representation of a forest)。一个叶节点的构造为:一个子叶节点群和一个自身的值。用 C#
描述为:
class ConcatTree
{
private List<ConcatTree> _kids;
private string _val;
}
在建立森林之前,我们先处理输入。对于输入,我们建立一个单词字典,将词语和首字母联系起来,其构造用 C#
描述为 Dictionary<char, List<string>>
。比如,若输入为:
Heaven!#@(*$element TABLE:teach!0tAlK
我们则将其处理为:
{
['e': "element"],
['h': "heaven"],
['t': "table", "teach", "talk"]
}
在建立森林的过程中,我们以给定的单词组中的每一个单词为根,分别建树。即有 n n n 棵树就有 n n n 棵树。在建立时,我们采取这样的方法:对于一个单词树节点,将其值的尾字母作为子节点群的首字母;在字典中检索这个字母的单词,将它们依次加入子节点;对所有子节点重复该操作。