面向对象第三阶段学习总结
关于规格化的发展
其实在第一次布置关于规格的作业时,我就尝试以规格,面向对象方法规格,java编程规格等多个关键词在中文互联网上搜索过,试图对规格和规格的发展获得更多的了解,但得到的有用信息寥寥无几.所以直到现在我还一直好奇,如果说注重编程注释的质量已经是共识的话,为什么规格却没有获得更多的注意呢?(规格指狭义的布尔表达式等,这是我的猜测,我没有参加过真正的工程开发,所以对业界认知不足.但是确实公开的资料寥寥).如果说没有得到大家的认可的话,说明可能是存在某些不足,我们为什么要坚持以一种反人类的布尔表达式的JSF来代替自然语言的注释呢?这只是我一家之言,可能老师有更多别的方面的考虑,比如能够通过工具检测,更加规范等等,这些都是我考虑不到的.
规格化编程的发展历史
按照我的理解,规格化设计其实是和面对对象的编程思想,以及软件工程这门科学一起发展起来的,三者是相辅相成的.
在计算机发展的最初,从汇编语言一直到面向过程语言,像BASIC和C语言的流行,是没有规格这个说法的.人们通过辛苦地编程和debug完成工作,往往程序中充满了goto这种天马行空的做法,编程变得magic.经过科技的发展,程序变得越来越多样化和功能越来越强大,代码的数量也越来越长.为了让代码正常工作,程序员只好放弃goto这种不好的特性,通过结构化设计让程序更加规范和容易维护.
但是很快代码超过了一个小团队能够完成的上限,需要几十几百个人协同完成.这个时候,人们发现让程序运行起来变得越来越困难,de掉100个bug会出现200个新的bug.迫不得已之下,人们只好寻求另外的编程思想,那就是面向对象的思想.将大的工程分工,分成一个个小的模块,模块再细分,直到变成重复使用的数据结构和针对数据结构的操作方法,就是对象和方法.为了更好的描述对象的范围和特性,为了明示方法的操作方法,要求,和对数据造成的结果,产生了不同的规格化语言.我们接触的JSF算是其中一种.
三次作业的规格化bug
除了第二次有几个类因为完成的比较晚,没有来得及写repOK方法之外,互测者并没有报告更多的关于我规格方面的bug,当然,这是因为测试者的善良,我的规格化还是有很多不足和改进空间的.
/** * *@REQUIRES: none *@MODIFIES: System.in and System.out;this.requestItems; *@EFFECTS: while System.in has a line ,a line will be consumed; *some information will be written in System.out; *if the line can construct a Request,a new RequestItem will be added to the list; *if the line is a command line, call the command function */ public void run() { Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { String inputString = scanner.nextLine(); if(InputHandler.isLoadRequest(inputString)) { String[] strings = inputString.split(" ",-1); SysMain.load(strings[1]); } else if(inputHandler.isRoadChange(inputString)) { SysMain.setRoad(inputString); } else if(inputHandler.isLegal(inputString)) { Request request = new Request(inputString); synchronized (requestList) { requestList.add(new RequestItem(request)); requestList.notifyAll(); } } else { System.out.println("##illegal request"); } } scanner.close(); }
第一是类的功能不明确导致的方法的复杂,以至于只能用自然语言描述,这个问题出现在InputThread的run方法中,我们可以改正这个方法
public void run() { Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { String inputString = scanner.nextLine(); inputHandler.handle(inputString); }
scanner.close();
}
这样就可以保证关于输入的操作由InputHandler负责,而Thread只负责运行.
第二是方法的复杂程度太高,不得不使用自然语言.此处其实例子很多,就不赘述了.
第三则是对布尔语言的掌握程度不高导致的错误,这些虽然可能测试者看在写的很有诚意的份上放过了,但是其实是能够改正的.
结言
其实这三次作业还是特别锻炼能力的,因为三次是建立在统一基础上的,涉及到多线程,继承,GUI等问题,数次重构也让我对有关知识了解的更深刻.