这个作业是采取结对编程的方式完成。
在上一个作业中, 我们尝试了各种命令行的处理,以及各种数组的处理。 现在, 我们要把 现代程序设计 作业 2 的各个结果转换成图形界面显示。这个问题看起来很难, 实际上大部分难的工作都在上一个作业完成了 (数组计算部分), 现在我们要通过模块化和重构等一些手段, 把我们在前一个作业的工作搬到新的环境中来。
1) 在图形界面 (GUI)上显示最大子数组在哪里。 建议像博客那样用高亮显示即可。 在界面上合适的位置 (例如窗口的状态栏上)显示最大子数组的和, 并且能标明哪些数组元素贡献了最大子数组的和。
请参见下面的作业提示, 我们希望和数组相关的代码能独立出来, 成为一个独立的模块 (class library, dll, 或其它), 这样的话, 命令行和 GUI 的程序都能使用同一份代码。
2) 图形界面能同时显示多个数组的运算结果, 用不同的 tab 把不同数组分开。请看下面例子:
运行
maxsum.exe file1
出现下面的UI, (当然, 同学们的UI 可以做得更好看一些)
然后, 再运行
maxsum.exe file2
会在上一个 maxsum.exe 的UI 上出现一个新的 Tab (File2), 显示新的结果. (现在, 整个电脑中仍然只有一个 maxsum.exe 在运行 )
当然, 这里面的各个 Tab 会像 IE/Chrome 等浏览器的Tab 那样可以关闭。
3) 对于首尾相连的环状和轮胎的形状, 用户当然想看到这样的结果,这要求我们的程序能处理各种命令行参数,就像上一个作业那样。
4)既然有了 GUI, 用户就能和程序即时交互,而不只是仅仅通过命令行来进行。 我们能让用户控制界面,通过简单的鼠标操作, 让数组的平面/环/轮胎形状移动或旋转么? (选作题)
作业提示:
同学们在上个作业中写了不少为命令行程序服务的函数 (或者代码), 这些代码在 GUI 程序中还是一样有用处的, 那怎么能让同一份代码服务于两个不同输出的程序呢? 我们可以看看怎么样实现代码的重(chong)用。 既然代码会在不同的环境下重复使用, 那我们最好让这些代码只做意见事情, 把这件事情做得最好,把别的事情交给别的代码来做。
可以看看:
重构,代码大全,敏捷开发原则 等书中关于代码模块化,重构的描述。
Single Responsibility - a class should have only one reason to change
例如, 大家原来的代码可能做了好几件事情:
处理输入,提示用户出错的情况
计算一个数组的最大子数组的和,以及这些最大子数组的元素都是哪一些
处理输出。
现在, 我们这个可以重用的函数(或者类、模块)只应该把一件事情做好
计算一个数组的最大子数组的和,以及这些最大子数组的元素都是哪一些
别的事情交给别的函数去做, 而且随着情况的变化, 别的函数处理方法也不一样, 例如在命令行中处理输出, 和在GUI 中处理输出是很不一样的。 这些事情不应该让 “计算数组的最大子数组的和”这个模块来做。
如果你的编程环境是 Visual Studio, 那么你可以很容易地创建一个新的项目 (Project), 选择 Class Library:
同学们也可以看看这个课件, 用一个例子来弄清楚具体操作:
现代软件工程讲义 2 开发技术 - 单元测试 & 回归测试
在 VS 2012 怎么做 Unit Test, 我们有这些有用的博客, Code Coverage。
作业要求:
这是一个结对编程的作业, 一个小组中的两个同学选取比较优秀的 作业2 (两个人的都独立完成了), 把它作为本次作业的基础,然后再修改。
在两人合作的过程中, 请看下面的内容:
a. 代码规范和代码复审
b. 结对编程,
c. 给人提意见的方式 - 送一个汉堡包
最后, 作业上交的是 GitHub 的代码 (两个同学的代码都要交)。
博客 (两个同学都要写)要写以下内容:
你现在使用的代码规范是什么, 和上课前有什么改进?
你的同伴有哪些优点 (列出至少三点), 和那些需要改进的地方 (列出至少三点)
你的代码从 作业2 到 作业3 经历了哪些变化? 哪些代码需要重构 (看关于代码重构的资料), 哪些需要重写, 为什么?
你的设计是如何保证 不同的 maxsum.exe 命令行最后在一个GUI 的界面显示的? (C++ 的设计模式中有 singleton 的概念, 说明一个类的实例如何在一个进程中保持单例, 我们这里谈的是软件如何在操作系统中保持 singleton)
当然, 请继续记录时间的估计和你实际的用时:
Personal Software Process Stages
时间百分比(%)
实际花费的时间 (分钟)
原来估计的时间 (分钟)
Planning
计划
· Estimate
· 估计这个任务需要多少时间,把工作细化并大致排序
Development
开发
· Analysis
· 需求分析 (包括学习新技术)
· Design Spec
· 生成设计文档
· Design Review
· 设计复审 (和同事审核设计文档)
· Coding Standard
· 代码规范 (制定合适的规范)
· Design
· 具体设计
· Coding
· 具体编码
· Code Review
· 代码复审
· Test
· 测试(自我测试,修改代码,提交修改)
Reporting
总结报告
· Test Report
· 测试报告
· Size Measurement
· 计算工作量
· Postmortem & Improvement Plan
· 事后总结, 并提出改进
Total 总计 100% 总用时 总估计的