任务06——封装与单元测试(Markdown版)
模块代码地址
两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了。
封装阶段
public class Core {
public static StringBuffer Suffix(StringBuffer infix){
Stack<Character> stack=new Stack <Character>();
StringBuffer suffix=new StringBuffer();
int i=0;
char tempchar=infix.charAt(i++);
char tempchar2=' ';
try {
while (tempchar!='='){
switch (tempchar){
case '(':
stack.push(tempchar);
tempchar=infix.charAt(i++);
break;
case ')':
while (stack.peek()!='('){
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
if (stack.empty()) {
break;
}
}
if (!stack.empty()) {
stack.pop();
}
tempchar=infix.charAt(i++);
break;
case '+':
case '-':
while (!stack.empty()&&stack.peek()!='('){
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
}
stack.push(tempchar);
tempchar=infix.charAt(i++);
break;
case '×':
case '*':
case '/':
case '÷':
Character ch=new Character(' ');
if (!stack.empty()) {
while((ch=stack.peek()).equals('×')||(ch=stack.peek()).equals('÷'))
{
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
if (stack.empty()) {
break;
}
}
}
stack.push(tempchar);
tempchar=infix.charAt(i++);
break;
case ' ':
tempchar=infix.charAt(i++);
break;
default:
while(tempchar<='9'&&tempchar>='0')
{
suffix.append(tempchar);
tempchar=infix.charAt(i++);
}
suffix.append(' ');
break;
}
}
while(!stack.empty())
{
tempchar2=stack.pop();
suffix.append(tempchar2);
suffix.append(' ');
}
suffix.append('\0');
} catch (Exception e) {
e.printStackTrace();
}
return suffix;
}
//根据后缀表达式计算结果(小数格式的String类型)
public static String Calculate(StringBuffer suffix){
int i=0;
char tempchar=suffix.charAt(i++);
double []answer=new double[20];
int top=0,d;
String Answer= null;
try {
while (tempchar!='\0'){
switch (tempchar){
case '+':
answer[top-1]=answer[top-1]+answer[top];
top--;
tempchar=suffix.charAt(i++);
break;
case '-':
answer[top-1]=answer[top-1]-answer[top];
top--;
tempchar=suffix.charAt(i++);
break;
case '*':
case '×':
answer[top-1]=answer[top-1]*answer[top];
top--;
tempchar=suffix.charAt(i++);
break;
case '/':
case '÷':
try {
if(answer[top]!=0)
answer[top-1]=answer[top-1]/answer[top];
else
{
System.out.println("\n\t除零错误!\n");
throw new InvalidExpression("无效的表达式");
}
} catch (InvalidExpression invalidExpression) {
invalidExpression.printStackTrace();
System.exit(0);
}
top--;
tempchar=suffix.charAt(i++);
break;
case ' ':
tempchar=suffix.charAt(i++);
break;
default:
d=0;
while(tempchar>='0'&&tempchar<='9')
{
d=10*d+tempchar-'0';//将数字字符转化为对应的数值
tempchar=suffix.charAt(i++);
}
top++;
answer[top]=d;
break;
}
}
Answer = null;
if (top!=1){
throw new InvalidExpression("无效的表达式");
}
Double an=new Double(answer[top]);
Answer = new String(an.toString());
}catch (InvalidExpression invalidExpression) {
invalidExpression.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return Answer;
}
}
在封装的过程中遇到的困难,以及是如何解决的:
对于封装首先想到几天前学习的软件工程的知识,关于模块的分解、抽象,恰好与本次的任务吻合,可以理论用于实践。上图是我画的UML图,在尝试在学习中,算不上很规范,但能基本看懂大概的结构。
因为之前的代码基于结构化编程,运用函数思想,所以在本次封装过程中很好的将功能抽象出来,这次完成的虽然不是很完美,但后期可以通过老师的指导不断改进。
单元测试阶段
单元测试代码 此处粘贴单元测试代码(用一对 ``` 把代码括起来)
@Before
public void before() throws Exception {
}
@After
public void after() throws Exception {
}
/**
*
* Method: Suffix(StringBuffer infix)
*
*/
@Test
public void testSuffix() throws Exception {
Core s=new Core();
s.Suffix(new StringBuffer("1+2+3="));
s.Suffix(new StringBuffer("1+2×3="));
s.Suffix(new StringBuffer("1+2÷3="));
s.Suffix(new StringBuffer("1÷2×3="));
s.Suffix(new StringBuffer("1÷+2×3="));
s.Suffix(new StringBuffer("1÷2*3="));
s.Suffix(new StringBuffer("1÷0×3="));
s.Suffix(new StringBuffer("1÷2×0="));
}
/**
*
* Method: Calculate(StringBuffer suffix)
*
*/
@Test
public void testCalculate() throws Exception {
Core s=new Core();
s.Calculate(new StringBuffer("1 2 + 3 +"));
s.Calculate(new StringBuffer("1 + 2 + 3 +"));
s.Calculate(new StringBuffer("1 2 +"));
s.Calculate(new StringBuffer("1 2 × 3 +"));
s.Calculate(new StringBuffer("1+ + 2 × 3 +"));
}
}
单元测试运行结果(截图,含测试是否全部通过,代码覆盖率等)
在编写单元测试代码过程中遇到的困难,以及是如何解决的
按照老师提供的教程,一开始看不懂,需要自己慢慢琢磨,Junit包,不知道是哪个,IDEA上找到有好多个,后来自己在网上找一个发现可以用。
下面提供它的下载网址。
链接:http://pan.baidu.com/s/1o84pWQQ 密码:1mda
别的大问题没有,关于对Core的测试,计算表达式都是自己按照规则生成的,不会出现不规则的情况,
所以对于测试情况的全面性没有更深一步进行。
感受(小结)
Junit很方便,测试的时候,不能以编程时的思维方式去看待问题,否则有些问题永远测试不出来。
需要打破常规的思路,不能认为自己的代码运行结果都是对的。
任务06——封装与单元测试(Markdown版)的更多相关文章
- 会议管理心得记录(非markdown版)
前提 本文说的会议特指有开发团队成员参与的会议, 包括但不限于开发.设计.测试.运维.管理岗位的成员. 因为不同工种和行业都有其特殊性,我是一名程序员,并不太了解其他工种和行业的具体情况,不敢妄言. ...
- 关于获取、设置css样式封装的函数入门版
<html> <head> <meta charset="UTF-8"> <title>CSS样式的获取和设置:简单版</ti ...
- 三星S4使用体验(Markdown版)
由于各种原因,前几天把手上的HTC 606w给二手交易了,然后二手买了一只全新的韩版S4蓝色e330s作为主力手机使用.现在主要就用户体验的角度对这只新的手机做次评价. 第一次做手机的评价,不知道写成 ...
- 标准兼容HTML5输入框提示信息的插件iHolder_v0.1.06.21.2014_预览版
由于版面限制,简单说下,详细的内容及在线预览.预览版压缩包,见这里http://levi.cg.am/archives/3507 为什么说是标准兼容: 因为大多数placeholder插件是这样兼容的 ...
- 面向对象的封装(粘贴Markdown代码解决缩进问题)
直接粘贴idea的代码会导致缩进错乱,建议先粘贴到记事本再粘贴到笔记!!! 1.先将属性私有化,再对外提供简单的接口可以访问内部.如set.get方法 2.set方法:修改年龄 public void ...
- 微信JS-API封装接口——node.js版
github:https://github.com/xjnotxj/wechat_interaction_jsapi Wechat JS-API接口 功能: 用于管理和获取微信 JSSDK 生产的ac ...
- 微信网页授权封装接口——node.js版
Wechat 网页授权 授权url:(请在微信客户端中打开此链接体验) xxx为config.js中的WECHAT_DOMAIN 1.scope为snsapi_base xxx/?route=auth ...
- Spring事务(一) Markdown 版
事务 事务的特性(ACID) 原子性(Atomicity) 原子性要求事务所包含的全部操作是一个不可分割的整体,这些操作要么全部提交成功,要么只要其中一个操作失败,就全部"成仁" ...
- mui封装做好的手机版网站为apk
BOSS提到的一个功能,就是把已经做好的手机网站http://xxx.com/m/home/index ,想着看起来应该蛮简单,一个html页面里就一个iframe就好了,然后宽度和高度都设置为100 ...
随机推荐
- 页面找不到js方法的原因,关于EasyUI
有时EasyUI中datagride写法不正确,会导致无法加载页面上其他的js方法.datagride中的逗号是一个也不能多.一定要注意: 例如以下代码中标红的逗号就会导致后边的js不能正常加载. c ...
- Python-PyQt安装
Windows下安装PyQt需要使用 mingw32-make工具, 以在windows下make
- MySQL学习总结(三)索引
补充一下,上一章节中约束的一点东西.我们在为约束设置名称的时候(标识符)推荐写法“约束缩写_字段名”,这样让人看起来就会很清晰.例如:FK_Deptno,我们通过索引的名字就可以大概知道这是一个设置的 ...
- 牛散NO.3:MACD放之四海 假作真时真亦假
大宗商品日线“异曲同工夺命勾魂枪” 话说有实战意义的技术在任何资本市场里都能产生出神奇的效果.不能说放之四海皆准,但至少起到触类旁通的“牵强”吧.大宗商品特别是在国际市场交易的大宗 商品由于是来自各方 ...
- linux系统日志报错
使用journalctl -xe命令时报错: Error was encountered while opening journal files: Input/output error 日志文件损坏了 ...
- webAPP开发的问题(总结)
自Iphone和Android这两个牛逼的手机操作系统公布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序.执行在高端的移动终端设备). 开发人员们都知道在高端智能手 ...
- eslint 人性化配置
错误列表: http://www.zystudios.cn/blog/post/70.Shtml 人性化一点.别老虐我啊晓梦大师 module.exports = { root: true, pars ...
- .htaccess中的apache rewrite规则写法详解(未完)
转:http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html http://blog.csdn.net/Long_Xiao_Yun/ ...
- [c#.Net]正则表达式 记录
@符号c#字符串前使用@符号,“@”表示,跟在它后面的字符串是个“逐字字符串”. string x="D:\\My Huang\\My Doc"; string y = @&quo ...
- AFNet3.0上传图片
很多iOS应用都会遇到需要上传图片的情况,比如修改个人资料时需要上传自己的头像,最近我也遇到了这种情况,首先参考之前写过的AFNetWorking3.0处理请求头和请求内容. 我们在上述博客的基础之上 ...