个人工程总结


PSP2.1


Personal Software Process Stages


Time


Planning


计划


· Estimate


· 估计这个任务需要多少时间


8


Development


开发


· Analysis


· 需求分析 (包括学习新技术)


0.5


· Design Spec


· 生成设计文档


0.5


· Design Review


· 设计复审 (和同事审核设计文档)


0


· Coding Standard


· 代码规范 (为目前的开发制定合适的规范)


0


· Design


· 具体设计


2


· Coding


· 具体编码


4


· Code Review


· 代码复审


0.5


· Test


· 测试(自我测试,修改代码,提交修改)


2


Reporting


报告


· Test Report


· 测试报告


0.5


· Size Measurement


· 计算工作量


0.5


· Postmortem & Process Improvement Plan


· 事后总结, 并提出过程改进计划


1.5


合计


12

0x01 设计

用一句话概括本次的需求,给小学生出算术题。考虑小学生的算术题,不难发现,其中所出现的数字仅仅包含整数和分数,且所有分数使用真分数的形式表示。每个算式由这些数字和运算符组成,其中运算符包括加、减、乘、除、小括号。不难发现,输出中的乘除号均为Unicode字符而非ASCII字符,所以本次使用C#语言来回避编码问题。(用C++的不要打我…)

根据这样的需求,可以选择构造一个层次结构:算式由数字组成。因此,首先需要实现的就是数字类和算式类。只要让这两个类具有随机生成的功能,本次需求便很容易实现。

对于数字类,我们知道整数可以表示成特殊的分数,即分母是1的分数。那么我们就可以用统一的形式来表示所有数字。

Class 数字 = {分子, 分母}。

那么输出怎么办?对于数字的输出,我们只需要重载一下ToString()方法便可以解决多种输出格式。在ToString()方法中,判断数字是整数、带有整数部分的真分数还是不带有整数部分的分数,选择相应的格式输出即可。

随后,重载数字类的加减乘除和比较运算,即可在代码中直接使用这些运算符。

有了数字,我们现在就要插入运算符,使之构成算式了。我们在学习中缀表达式计算的时候提到过,可以使用栈来记录运算过程。程序实现借鉴这个思想,构造数字栈和符号栈来模拟后缀表达式的运算,拼接成算式。为了更加有效的判重,我还引入一个数字变量来保存结果。

Class 算式 = {数字栈, 符号栈, 运算结果},

需要注意的一点是,与后缀表达式不同,使用两个栈来保存算式,运算符和数字的关系是不确定的,这时就需要我们人为地规定符号与数字的顺序关系才能保证可以计算出所有情况。对于输出,依然是重载ToString()方法,对两个栈进行拼接。

判定两个算式是否相等,其实就是判定每一步的运算是否相等。因此,两个算式相等的充分必要条件是,符号栈完全相等,且每次运算中的两个运算数分别相等。也就是说,在判定相等时,需要还原两个表达式求值的全过程进行比较才行。这样显然是很慢的,后面会讲到一个非常有效的优化。

0x02 测试

本次程序模块清晰非常适合于进行模块化测试。本次程序中,对于每一个模块方法都有单元模块测试,可以确保在不触发异常的情况下可以返回正确的结果。(由于时间有限,一场处理部分没有进行测试。)对于程序全局功能的测试,采用极端数据和大数据量的方法,都得到了正确的返回结果。

0x03 优化

判重:前面说到,判重的过程是非常慢的,因为要完全还原每一步的运算状态。那么能不能找到一个有效的方式来大概率加速判定呢?答案是肯定的。对于每个算式,我们进行一次计算,保存下来计算的结果。对于任意两个结果不同的算式,显然是不能经过有限次交换一样的。事实证明,这样的优化可以加快80%左右的判定时间。以单次判断为基本单位,程序的时间复杂度为O(n^2),因此即使优化以后,判断依然是耗费时间最多的执行单元。

输出:本次程序的输出为文本文件,每次输出一个算式和一个结果。由于两步输出是连续操作,如果每次直接输出到文件,会由于硬盘响应速度较慢造成阻塞。因此可以选用Buffer作为输出缓冲,提高性能。这种方式在输出量较小的情况下(如连续执行100000次,每次输出20个算式)对性能有明显改进。

计算结果:本次需求中要求,所有算式在运算过程中不能出现负数,因此在判定过程中就顺带完成了结果的计算。这样可以省去写求结果的方法,直接服用check即可。

0x04 测试

正常数据测试:

-r 10 –n 10000

-r 3   -n 100

极端数据:

-r 1   -n 100

-r 2   -n 10000000000

-r 1000000        -n 100

0x05 总结

本次工程难度不大,但需求数量较多。在实现需求之前,需要统一的设计来满足不同需求的实现。设计在本次工程中起到了非常大的作用。除此以外,本次工程还充分体现出了有一个属于自己的类库的重要性。

时间: 2024-10-21 09:24:37

个人工程总结的相关文章

C++工程编译之“error LNK2001: 无法解析的外部符号”

今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是,如果使用的第三方函数库编译方式采用/MD,那么主工程也应该使用/MD.我使用了libevent,而主工程默认采用/MT,所以需要忽略一大堆的函数库,我还纳闷呢,怎么会这么奇怪!!今天总算是解决了长久以来的困惑了. 下面引用一篇文章的描述:[Z]VC运行库版本不同导致链接.LIB静态库时发生重复定义

.net 工程中引用出现感叹号

在工程中引用出现感叹号,有两个原因 原因1:  这是由于之前引用的Dll文件不见了. 右键有感叹号的项,然后选择 "属性" 里边有一个路径属性 这个路径就是之前这个Dll文件的路径,现在这个文件不在了,你需要找到现在这个文件的路径 右键有感叹号的项,然后选择"移除" 右键"引用",选择添加引用,然后选择那个不在的dll的真实路径 其他的项用相同的方式处理 原因2:可能是引用的.Net版本高于了当前工程的.Net版本 更改所引用的工程文件的.Net

maven(二) maven项目构建ssh工程(父工程与子模块的拆分与聚合)

前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目分割为不同的几个部分独立开发,很重要,加油 --WH 一.maven父工程与子模块的拆分与聚合原理 问题描述:将ssh工程拆分为多个模块开发 1.1.拆分原理 创建一个maven project(pom),然后在创建三个子模块(maven moudule),其中三个子模块,分别为 dao.service.web,也就是将三层的内容分别独立为一个项目,进一步将耦合性降低,其中如何将他们

HDU - 1232 畅通工程

畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可).问最少还需要建设多少条道路? Input测试输入包含若干测试用例.每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M:随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号.为简单起见,城镇从1到N编号. 注意

HDU1863 畅通工程---(最小生成树)

畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27972    Accepted Submission(s): 12279 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出

ADF Faces导出Excel文件【附样例工程】

本文提供一个基于ADF Face组件开发样例工程,工程的实现过程分为3个部分以应对Excel导出开发中常见的处理. 1.空模版文件下载:将Excel文件视为普通文件提供下载操作. 2.数据文件输出,将数据内容输出为Excel文件,目标文件尽在服务端内存中存在,这种方式需要对Excel文件的内容处理,需要引入响应的类库. 3.模版文件填充数据后下载,基于服务端的物理文件为模板,将业务数据填入约定位置后提供下载,在实现方面需要为工作簿对象指定源文件输入流,并完成后续内容处理. 实现的基本思路,由AD

eclipse 创建maven 项目 动态web工程(出现问题)

Eclipse 创建maven 项目 动态web工程 注:Eclipse版本为(Version: Mars.1 Release (4.5.1))maven版本为(apache-maven-3.3.9) 1. 此处是在你安装好了maven插件的前提下进行的并且配置好了你的maven环境指定好了你的maven的本地仓库.下面就开始maven web项目的搭建 首先:点击新建一个项目maven 2.点击next 3.选择web选项 4.创建你的项目的坐标点击finish完成 5.项目创建完成但是有错误

高质量的工程代码为什么难写 (转)

http://kb.cnblogs.com/page/558087/ 之所以想起写这篇文章,是因为最近看到的一个著名的开源项目在内部使用时的各种问题,不得不说,很多的开源的东西思想是不错的,但离真正工程化都有不小的距离,所以没什么商业公司采用的开源产品如果要引入的话一定要慎重,通常会有N多的坑等着你去填,而比较成功的开源项目的背后多数都会有商业公司在背后不断的改进. 遥想我2000年开始学习写asp代码时,觉得写代码也不难呀,无非就是学学语法规则.库就可以写出来,记得有一次我实习面试的时候是让我

【java web学习笔记(1)】idea工程配置

1.新建工程,java enterprise-> web application 2. 配置tomcat run-> edit configurations 左上加号新建 并设置好路径 3.改工程配置 新建classes文件夹和lib文件夹 file-> project structure modules-> paths-> use module compile output path 选创建的classes文件夹 dependencies-> +-> jars

QT基础(五)QT工程pro文件模板变量 使用

QT工程pro文件模板变量(TEMPLATE)模板变量告诉qmake为这个应用程序生成哪种makefile.下面是可供使用的选择: app - 建立一个应用程序的makefile.这是默认值,所以如果模板没有被指定,这个将被使用. lib - 建立一个库的makefile. vcapp - 建立一个应用程序的Visual Studio项目文件. vclib - 建立一个库的Visual Studio项目文件. subdirs - 这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文