针对于本问题:java
扩展需求:文件,处理生成题目并输出到文件,完成题目后从文件读入并判题;多语言支持:简体中文, 繁體中文, English;生成题目去重git
提出问题和解决方案:让用户能够进行数学测试,能够是数学四则运算测试,还能够是"开根号,幂运算"等等,还能够支持更多语言。编程
上课讲了SOLID原则,反看第一周完成的代码,那都是个什么玩意,充分的知足了“低内聚,高耦合”,添加新要求的时候,一动都得动,无从下手,所以我决定从新修改,试着向SOLID原则靠拢,这样下次再添加什么需求的时候就不用全篇“大动”。windows
import java.util.Locale; import java.util.ResourceBundle; public abstract class Language { public abstract void Print(String s); } public class Chinese extends Language{ public Chinese(){} public void Print(String s){ Locale locale1 = new Locale("zh","CN"); ResourceBundle res1 = ResourceBundle.getBundle("zh_CN",locale1); System.out.print(res1.getString(s)); } } public class English extends Language{ public English(){} public void Print(String s) { Locale locale2 = new Locale("en", "US"); ResourceBundle res2 = ResourceBundle.getBundle("en_US", locale2); System.out.print(res2.getString(s)); } } public class TChinese extends Language { public TChinese(){} public void Print(String s){ Locale locale3 = new Locale("zh","TW"); ResourceBundle res3 = ResourceBundle.getBundle("zh_TW",locale3); System.out.print(res3.getString(s)); } }
注:此处代码是为了实现程序的多语言切换(国际化),软件实现国际化,需具有如下两个特征:
一、对于程序中固定使用的文本元素,例如菜单栏、导航条等中使用的文本元素、或错误提示信息,状态信息等,须要根据来访者的地区和国家,选择不一样语言的文本为之服务。
二、对于程序动态产生的数据,例如(日期,货币等),软件应能根据当前所在的国家或地区的文化习惯进行显示。设计模式
if(s1.equals("1")&&(s2.equals("1")==false)){ Numerator1 = 1; Denominator1 = 1; str2 = s2.split("/"); Numerator2 = Integer.parseInt(str2[0]); Denominator2 = Integer.parseInt(str2[1]); } else if(s2.equals("1")&&(s1.equals("1")==false)){ Numerator2 = 1; Denominator2 = 1; str1 = s1.split("/"); Numerator1 = Integer.parseInt(str1[0]); Denominator1 = Integer.parseInt(str1[1]); } else if(s1.equals("1")&&s2.equals("1")){ Numerator1 = 1; Denominator1 = 1; Numerator2 = 1; Denominator2 = 1; } else{ if((s1.contains("/")==true)&&(s2.contains("/")==false)){ str1 = s1.split("/"); Numerator2 = Integer.parseInt(s2); Denominator2 = 1; Numerator1 = Integer.parseInt(str1[0]); Denominator1 = Integer.parseInt(str1[1]); } else if((s2.contains("/")==true)&&(s2.contains("/")==false)){ Numerator1 = Integer.parseInt(s1); Denominator1 = 1; str2 = s2.split("/"); Numerator2 = Integer.parseInt(str2[0]); Denominator2 = Integer.parseInt(str2[1]); } else if((s2.contains("/")==false)&&(s2.contains("/")==false)){ Numerator1 = Integer.parseInt(s1); Denominator1 = 1; Numerator2 = Integer.parseInt(s2); Denominator2 = 1; } else{ str1 = s1.split("/"); str2 = s2.split("/"); Numerator1 = Integer.parseInt(str1[0]); Denominator1 = Integer.parseInt(str1[1]); Numerator2 = Integer.parseInt(str2[0]); Denominator2 = Integer.parseInt(str2[1]); } }
这个部分是我一开始没有想到的状况,经过测试等手段发现了分母为零的状况,不是分数的状况。数组
Q: 将带有÷号的题目输入文件,却出现了乱码。。。心态爆炸,原本好好的程序,加了个文件就输不出来了???
A:原来是系统的编码和程序的编码采用了不一样的编码格式。在用Java程序进行读写含中文的txt文件时,常常会出现读出或写入的内容会出现乱码。一般,假如本身不修改的话,windows自身采用的编码格式是gbk(而gbk和gb2312基本上是同样的编码方式),而IDE中Encode不修改的话,默认是utf-8的编码,这就是为何会出现乱码的缘由。当在OS下手工建立并写入的txt文件(gbk),用程序直接去读(utf-8),就会乱码。为了不可能的中文乱码问题,最好在文件写入和读出的时候显式指定编码格式。所以,我在输入读写文件上作了改动,代表了编码格式!!学习
try{ OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(file),"gbk"); BufferedWriter writer = new BufferedWriter(write); writer.write(t); writer.write(" = "); writer.close(); } catch (IOException e){} try{ InputStreamReader read = new InputStreamReader(new FileInputStream(file),"gbk"); BufferedReader reader = new BufferedReader(read); System.out.print(reader.readLine()); read.close(); } catch (IOException e){}
Q:多语言支持是什么鬼。。。就一直if-else??
A:Java中有ResourceBundle这样的类,能够作到测试
properties
的文件,个人理解是,能够一个语言体系建一个对应的读取资源属性文件Q:如何实现去重
A:我一开始的想法是,只要后缀表达式相同,那么就是相同的题目,但通过和伙伴讨论以后,又产生了新的想法,将每次进行运算的num1 op num2
放入一个数组中,只要两个数组彻底相同,那么就是相同的题目。(想法还在实施中)优化
哇,小伙伴简直过重要了,我听了老师的各类原则以后,看个人程序简直是一团乱麻,剪不断理还乱,藕断丝连,你中有我,我中有你。。。所以我决定,按照SOLID原则及需求分析步骤,和个人小伙伴激烈讨论,给我提供了很是好的思路,从新整理了个人程序。我发现,在完成扩展内容的时候,就能够作到对外扩展,对内封闭,很是开心!和小伙伴的合做很顺利,咱们分工明确,积极讨论,互相改错,相互进步,在这次结对学习过程当中受益不浅,不只对知识点有了巩固和拓展,还对编程的思路方式等有了新的模式。编码
Java读写txt文件时防止中文乱码问题出现的方法介绍
JAVA中ResourceBundle使用详解
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务须要多少时间 | 600 | 900 |
Development | 开发 | ||
• Analysis | • 需求分析(包括学习新技术) | 20 | 30 |
• Design Spec | • 生成设计文档 | 20 | 30 |
• Design Review | • 设计复审 | 20 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 40 |
• Design | • 具体设计 | 30 | 40 |
• Coding | • 具体编码 | 400 | 600 |
• Code Review | • 代码复审 | 30 | 40 |
• Test | • 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 10 | 20 |
• Size Measurement | • 计算工做量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 过后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 600 | 900 |
此次作结对项目本着能够学到东西的目的,我对本身的代码的大体模型改了不少次,第一周本身尝试的时候虽然作出了符合要求的程序,可是内在关系仍是很是杂乱的,彻底不知足SOLID原则;在听了相关讲解以后,对设计模式,如何作需求分析,怎样写出高内聚低耦合的程序有了必定的了解,所以我努力的对本身的程序不断修改,努力完成一份符合设计原则的代码;在个过程当中遇到了很是多的问题,解决完这个问题,又会产生下个问题等待优化,我不得不上网百度,和同窗讨论,这样两个思想的碰撞产生的是无穷的力量,不只增长了个人知识储备,还大大提升了本身的抗压能力,写完代码很是有成就感。