任务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 ...
随机推荐
- Python人体肤色检测
代码地址如下:http://www.demodashi.com/demo/12967.html Python人体肤色检测 概述 本文中的人体肤色检测功能采用 OpenCV 库实现, OpenCV是一个 ...
- android开发全然退出activity
我们退出Activity能够调用:finish(),system(0),可是这些都仅仅是单单退出单个Activity 也有人会说,直接把进程杀死,这些做法都不是非常可取.事实上我们翻看api能够发现. ...
- c++ vector容器的使用,序列倒叙reverse(),容器底部插入一个数值push_back()
问题:程序实现将que[i]添加到que2最后,再将que2反转输出. 例如: 输入 4 1 2 3 4 输出 4 2 1 3 #include<iostream> #include< ...
- spring学习笔记(四)
1.aop编程 a.前置通知 .... <!-- 配置被代理的对象 --> <bean id="test1Service" class="com. ...
- 【转载】HTTP和SOAP完全就是两个不同的协议
http:是一个客户端和服务器端请求和应答的标准(TCP). http协议其目的是为了提供一种发布和接收htttp页面的方法 http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个 ...
- C# NPOI操作Excel(下)
根据自己项目需求编写,仅供参考 个人建议:使用Excel模板进行导出操作.尽量避免自己生成Excel(既繁琐又容易出BUG).大多情况下导出Excel都是固定格式,使用模板导出会方便很多. publi ...
- RandomForest 调参
在scikit-learn中,RandomForest的分类器是RandomForestClassifier,回归器是RandomForestRegressor,需要调参的参数包括两部分,第一部分是B ...
- c#中从string数组转换到int数组及比较两个字符串相等
string[] input = { "1", "2", "3", "4", "5", " ...
- RunTime.getRunTime().addShutdownHook用法
今天在阅读Tomcat源码的时候,catalina这个类中使用了下边的代码,不是很了解,所以google了一下,然后测试下方法,Tomcat中的相关代码如下: Runtime.getRuntime() ...
- HttpClient4.X 升级 入门 + http连接池使用
转载请注明出处,谢谢~ http://blog.csdn.net/shootyou/archive/2011/05/12/6415248.aspx 在一次服务器异常的排查过程当中(服务器异常排查的过程 ...