这个作业是采取结对编程的方式完成。

在上一个作业中,  我们尝试了各种命令行的处理,以及各种数组的处理。  现在, 我们要把 现代程序设计 作业 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% 总用时 总估计的