寒假作业(2/2)
基本情况
所属班级 | 班级链接 |
---|---|
作业要求 | 作业链接 |
其他参考文献 | 百度 |
第一部分:阅读《构建之法》并提问
1.书中2.3提到不经能效分析就进行优化,反而会事倍功半,前文还提到一个过早优化的例子。可能是现在实践还不足,不明白把每一部分都优化到力所能及的地步,应该能让程序的效能达到最理想的状态。在查看资料后知道,在大型项目开发的时候,项目规模巨大不可能对每一部分都进行优化,最好的方法就是在效能分析后对重复次数最多,最耗时的部分优化才是最正确的做法。
2.第4章中提到了结对编程和极限编程的思想。极限编程希望以最高的效率和质量来解决用户目前的问题。结对编程希望能够避免闭门造车减少后期维护的成本和时间。随着软件规模的变大,已经不是三两个人可以完成的了,如何在某种情况下选择哪种方式,在书中并没有准确提及。如何在实践中选择这两种方式?查阅资料后得知在大规模的项目中,两种方式是同时存在的,在较小的功能中通常采用极限编程的策略,在较大一些的功能会采用结对编程,甚至需要小组来完成。
3.第9章中提到了PM对于团队的作用,带领团队实现最重要目标,保持团队平衡。如果PM一开始对于用户需求的分析是有误的,项目开发到一半发现和项目的初心已经偏离,造成人力物力的损失,如何保证PM的领导能基本实现项目的目标,这时如何能最大程度的将项目拉回正轨?
4.第12章中提到用户体验,在在竞争越来越激烈的现在,随着软件复杂度的提高,软件功能出现了越来越多的冗余,就拿QQ来说,在其中的很多功能可能百分之九九的人都用不到,但是却是个公共功能,造成了用户硬盘空间的浪费,针对这种情况项目经理该如何规划?用户体验设计的一个重要目的就是要降低用户的认知阻力。对于这个问题查阅资料后得知,中功能有一部分是开发人员的点子,团队觉着有用便采纳了,但后续使用中发现使用率并不高,就拿QQ的兴趣部落来说,由于使用率过低,最后直接将这部分删除。
5.第17章中提到对于创造性思维的活动来说,创造力的激发和金钱成反比?奖金为何会没有作用?在查看资料才知道,创造力的激发和金钱还真是成反比。人脑其实非常孱弱,因此要好好发挥其灵光闪耀,则必须提供和营造良好的分享氛围,强调和激励工作人员去关注创造力本身,而不去纠结奖金激励。
冷知识
微软也曾经是jcp甚至是java的主要贡献者,但是利益驱使下,想扩展java,从而破坏java跨平台的特性,所以跟sun闹翻,其本质原因就是想让客户写的java代码跟windows绑定,sun坚决不同意,闹翻,今天回头看这个结果,只能说:双输,sun挂了,微软的ria也离挂不太远了,silverlight已经放弃了,比起当年ie自带有jvm的支持来说,那完全就是两回事。
第二部分
项目地址
PSP表格
psp2.1 | Personal Software Process Stages | 预估耗时(min) | 实际耗时(min) |
---|---|---|---|
Planning | 计划 | 20 | 25 |
Estimate | 估计这个任务需要多少时间 | 20 | 20 |
Develoment | 开发 | 1000 | 1140 |
Analysis | 需求分析(包括学习新技术) | 200 | 240 |
Design Spec | 生成设计文档 | 30 | 40 |
Design Review | 设计复审 | 25 | 20 |
Coding Standard | 代码规范设计 | 60 | 70 |
Design | 具体设计 | 60 | 70 |
Coding | 具体编码 | 400 | 450 |
Code Review | 代码复审 | 60 | 60 |
Test | 测试(自我测试,代码修改,提交修改) | 60 | 60 |
Reporting | 报告 | 30 | 30 |
Test Repor | 测试报告 | 20 | 15 |
Size Measuremen | 计算工作量 | 20 | 15 |
Postmortem&Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 25 |
合计 | 1025 | 1140 |
解题思路描述
1.文件数处理,将文件数据直接从文件中取出,获得结果后将结果拼接成字符串,利用bufferedwriter写入文件中,读取文件数据使用bufferedreader。
2.文件中字符串的长度直接使用length()方法获取,在返回字符串长度。
3.单词数的统计采用正则表达式来分割字符串,再用matches()方法获取匹配的单词,忽略字符数小于4,数字开头等。在利用map<string ,integer>,将单词和对应出现次数加入wordMap中。
4.统计行数,利用bufferedreader中的readline()方法,整行读取,读取整行数据同时判断是否为空行,为空则忽略改行。直到最后为空,文件完全读取。
5.对单词出现的频率进行排序。利用map<string,intger>对象,利用sort方法和匿名内部类的比较器进行排序,最后返回一个list对象。
6.将数据拼接成完整字符串,利用bufferedwriter写入对应的文件中。
代码规范链接
设计与实现过程
1.读取文件数据
public static String charactersCount(String filePath)
{
BufferedReader bReader=null;
StringBuilder str=null;
try
{
FileReader reader=new FileReader(filePath);
bReader=new BufferedReader(reader);
str=new StringBuilder();
int flag;
//str.append(bufferedReader.read());
while ((flag=bReader.read())!=-1)
{
str.append((char)flag);
}
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}finally
{
try
{
bReader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return str.toString();
}
2.字符数统计
//字符数总数统计
public static int charactersNumberCount(String str)
{
//将字符串改为字符
char[] ch = str.toCharArray();
int num = 0;
for(int i = 0; i < ch.length; i++) {
if(ch[i] >= 0 && ch[i] <= 127) {
num++;
}
}
return num;
}
3.行数统计,利用readerline每次读取一行,在判断该行是否为空行
//计算行数
public static int linesNumberCount(String filePath)
{
File file=new File(filePath);
int count=0;
if(file.exists())
{
try
{
BufferedReader in = new BufferedReader(new FileReader(file));
String line;
while((line = in.readLine()) != null)
{
//忽略空行
if(!line.equals("") )
{
count ++;
}
}
//System.out.print(count);
in.close();
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
}
return count;
}
4.按照单词出现频数进行排序
//按单词频率进行排序
public List<Map.Entry<String,Integer>> SortMap()
{
List<Map.Entry<String,Integer>> wordList=new ArrayList<Map.Entry<String, Integer>>(wordsMap.entrySet());
Collections.sort(wordList, new Comparator<Map.Entry<String, Integer>>()
{
//利用匿名内部类实现排序
@Override
public int compare(Map.Entry<String, Integer> map1, Map.Entry<String, Integer> map2)
{
if (map1.getValue().equals(map2.getValue()))
{
return map1.getKey().compareTo(map2.getKey());
}
else
{
return map2.getValue()-map1.getValue();
}
}
});
return wordList;
}
性能改进
在单词排序部分利用匿名内部类的方式利用比较器提高比较速度。
单元测试
对字符数,单词数统计和行数统计都进行了测试
1.字符数统计测试
public void testCharactersNumberCount() {
String str="helloworld\nmyname\nisjohn";
String strTest="";
for(int i=0;i<10000;i++)
strTest+=str;
System.out.print(Lib.charactersNumberCount(strTest));
assertEquals(Lib.charactersNumberCount(strTest),240000);
}
2.单词数统计测试
public void testWordsNumberCount() {
String str="hello world \n myname \n isjohn\n";
String strTest="";
for(int i=0;i<10000;i++)
strTest+=str;
System.out.print("\n"+Lib.wordsNumberCount(strTest));
assertEquals(40000,Lib.wordsNumberCount(strTest));
}
3.行数统计测试
public void testLinesNumberCount() throws IOException {
String str="helloworld\nmyname\nisjohn";
String strTest="";
//地址为本地测试文件地址
String outPath="D:\\\\eclipse\\\\wordcount_java\\\\src\\\\wordcount_java\\\\test.txt";
for(int i=0;i<10000;i++)
strTest+=str;
FileOutputStream fileOutputStream=new FileOutputStream(outPath);
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream,"UTF-8");
BufferedWriter bufferedWriter=new BufferedWriter(outputStreamWriter);
bufferedWriter.write(strTest);
System.out.print(Lib.linesNumberCount("D:\\\\eclipse\\\\wordcount_java\\\\src\\\\wordcount_java\\\\test.txt")+"\n");
assertEquals(19115,Lib.linesNumberCount(outPath));
}
异常处理
1.使用了FileNotFountExpection文件不存在
2.输入输出异常IOExpection。
心路历程
这次作业是我们第二次寒假作业,相对第一次作业这次我碰到更多的麻烦,也学了更多东西,github和git的使用单元测试junit的使用,接触到了PSP,更好的规划自己的时间。看了邹欣老师的《构建之法》这本书,对于软件工程,程序员又有了更深入的了解。对于软件的开发也更加清晰。