面向对象第三阶段学习总结

关于规格化的发展

  其实在第一次布置关于规格的作业时,我就尝试以规格,面向对象方法规格,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等问题,数次重构也让我对有关知识了解的更深刻.

posted @ 2018-05-30 19:05  正蓝  阅读(207)  评论(0编辑  收藏  举报