重构,测试和调试

  利用Lambda表达式,方法引用以及Stream改善程序代码的可读性:

    重构代码,用Lambda表达式取代匿名类

    用方法引用重构Lambda表达式

    用Stream API重构命令式的数据结构

  从匿名类道Lambda表达式的转换

    Runnable runner = new Runnble(){

      public void run(){

        System.out.println("Hello");

      }

    };  

    --> Runnable runner = () -> System.out.println("Hello");  

    匿名类和Lambda表达式中的this和super的含义是不同的。在匿名类中,this代表的是类自身,但在Lambda中,它代表的是包含类。其次匿名类可以屏蔽包含类的变量,而Lambda表达式则会报编译错误。

    在涉及重载的上下文里,将匿名类转换为Lambda表达式可能导致最终的代码加晦涩。实际上匿名类的类型是在初始化时确定的,而Lambda的类型取决于它的上下文。

    interface Task{

      public void execute();

    }

    public static void doSomething(Runnable r){ r.run();}

    public staitc void doSomething(Task t){ t.execute();};

    -->

    doSomething() -> System.out.println("Danger"); //此时两个类都是合法的目标类型

    doSomething(Task) -> System.out.println("Danger"); //显式指定了需要使用的类型

  采用函数式接口

    可以采用有条件的延迟执行和环绕执行这两种模式重构代码,利用Lambda表达式带来灵活性。当需要从客户端代码频繁的去查询一个对象的状态是为了传递参数,调用该对象的一个方法,那么可以考虑实现一个新的方法,以Lambda或者方法表达式作为参数,新方法在检查完该对象的状态后才调用原来的方法。

    有条件的延迟执行

      Java8 API的log新添了一个log的重载方法,接受了一个Supplier作为参数。

        public void log(Level level, Supplier<String> msgSupplier);

        -->

        public void log(Level level, Supplier<String> msgSupplier){

          if(logger.isLoggable(level)){

            log(level, msgSupplier.get());

          }

        }

    环绕执行

      当业务具有同样的准备和清理阶段,可以将这部分代码用Lambda表达式实现,这种方式的好处是可以重用准备和清理阶段的逻辑,减少重复冗余的代码。

      String oneline = processFile((BufferedReader b) -> b.readLine());

      String twoline = processFile((BufferedReader b) -> b.readLine() + b.readLine());

      public static String processFile(BufferedReaderProcessor p) throws IOException{

        try(BufferedReader br = new BufferedReader(new FileReader("text.txt"))){

          return p.process(br);

        }

      }

      public interface BufferReaderProcessor{

        String process(BufferReader b) throws IOException;

      }

   访问者模式常用于分离程序的算法和它的操作对象。单例模式一般用于限制类的实例话,仅生成一个对象。

  

  策略模式

    策略模式代表了解决一类算法的通用解决方案,可以在运行时选择使用哪种方案。策略模式包含三部分内容:一个代表某个算法的接口;一个或多个该接口的具体实现,它们代表了算法的多种实现;一个或多个使用策略对象的客户。

  模板方法

    若需要采用某个算法的框架,同时又希望有一定的灵活度,能对它的某些部分进行改进,采用模版方法设计模式是比较通用的方案。

  观察者模式

    某些事件发生h时,主题需要自动地通知其他多个观察者。

  责任链模式

    责任链模式是一种创建成立对象序列的通用方案。一个处理对象可能需要在完成一些工作之后,将结果传递给另一个对象,这个对象接着做一些工作幕后再转交给下一处对象,以此类推。这种模式是通过定义一个代表处理对象的抽象类实现的,在抽象类中会定义一个字段来记录后续对象。一旦对象完成它的工作,处理对象就会将它的工作转交给它的后继。

  工厂模式

    无需向客户端暴漏实例化逻辑就能完成对象的创建.

  因为lambda表达式没有名字,所以对lambda表达式进行调试是十分困难的。在程序异常时,编译器只能为它们指定一个名字,若方法引用指的是同一个类中生命的方法,那么它的名称是可以在栈跟踪中显示的。

  对流操作中的流水线进行调试是可以调用peek方法。peek在流的每个元素恢复运行之前插入一个动作。

  numbers.stream().peek(x -> System.out.println("from stream: " + x))

          .map(x -> x + 7)

          .peek(x -> System.out.println("after map"))

          .collect(toList());    

时间: 2024-10-10 22:22:04

重构,测试和调试的相关文章

测试与调试

测试与调试 主要负责人:赵琳琳http://www.cnblogs.com/zhaolinlin/p/4591685.html 1.测试功能 改日历记事本主要包括查看更改日历,在指定的日期上设置日志来方便大家记事,该日志记录的东西可添加可删除. 2.测试分析 根据软件的功能绘制测试用例图. 3.根据绘制的用例图制定测试方案. (1)查看.更改日历 (2)在指定的日期下建立日志 (3)日志的添加删除操作 (4)查看以往的日志 运行结果 一.测试结果 1.打开主界面,鼠标左键点击,查看日历界面.如图

程序测试与调试

测试与调试 一.  背景和目的 随着现代科学技术的进步,人类社会正逐渐走向信息化,图书馆拥有丰富的文献信息资源,是社会系统的重要组成部分,在信息社会中作用愈来愈重要,我国图书馆计算机等信息技术的应用起步于20世纪70年代末期,随着改革开放的步伐得迅速发展,特别是90年代以后,我国图书馆信息网络建设取得了较大发展图书馆信息化建设迈向了一个新台阶. 我们的软件工程课程设计要求应用软件工程的方法对我们的项目进行详细的需求分析.概要设计.详细设计以及进行必要的测试,旨在让程序能够实现读者管理功能.采编管

测试及调试

对于图书管理系统的测试及调试 一:单元测试 系统说明 功能模块:读者管理.借.还书.浏览图书.查询管理. 读者管理功能主要是读者基本信息: 浏览图书功能包括浏览图书的 作者,出版社,以及图书的简介信息 借.还书功能主要是对读者借还书时信息的录入. 二:测试策略  测试策略包括用户界面测试.软件功能测试.软件可靠性测试.用户界面测试:  通过和用户交互如输入相应信息(包括正确信息和错误信息)来测试输出信息的正确性.   软件功能测试:对照用户需求来测试本系统的功能是否完全符合用户需求.  软件可靠

仓库管理测试与调试

测试与调试 1.输出界面 运行程序,进入主菜单界面,用户可以选择货物入库出库.加载货物信息. 信息查询.保存信息到文件.从文件中读入信息.退出系统等操作选项.为了避 免再次输入大量信息,可以先选择从文件中读入信息,将以前输入的信息重新显 示在屏幕上,再进行后续操作. 主菜单界面如图所示: 1.货物的入库 按照程序引导输入货物信息输入苹果.橘子.馒头各10个. (2).输出所有货物信息信息 在主菜单输入3进入货物查看界面,所有货物信息如下图显示所示: (3).货物出库 在主菜单中输入1进行货物出库

python测试与调试提示

测试与调试提示2.1 在交互模式输入一个python语句就会执行一个.在调试程序时,这种模式尤其有用. 测试与调试提示2.2 在一个文件调用python解释器后,解释器会在文件中的最后一个语句执行之后推出.然而,如果使用-i选项(例如python -i file.py)针对文件调用解释器,会导致编译器在执行了文件中的语句后进入交互模式.这非常使用于调试程序. 测试与调试提示2.3 如果一个表达式里包含许多运算符,请务必参考运算符优先级表,合适表达式中的运算符按自己希望的顺序执行,如表达式过于复杂

测试与调试技术

本文的内容是对<计算机系统概论>第二版(梁阿磊等译)中第十五章"测试与调试技术"的一个小结. 一.概论 程序员通常花费更多的时间来调试程序,而不是编写程序. 测试的目的是"暴露"问题(bug),而测试的目的是"解决"问题.测试代码的基本方法,通常是向程序(或局部代码)注入尽可能多的.各种各样的输入条件,以迫使软件暴露bug.以ToUpper函数的测试为例(该函数将输入的字母改为大写并返回).我们将传入所有可能的ASCII码,然后观察函

可进行JavaScript代码测试与调试的12个网站

概述:JavaScript是网站前端开发最为重要的一门编程语言,本文收集了能够在线测试与调试JavaScript代码的12个网站 1.JS Bin JS bin是一个为JavaScript和CSS爱好者们提供特定情况下的代码片段测试的网站.它可以让你和你的同伴合作调试代码.你可以在这里编辑和测试JavaScript和HTML代码,一旦你觉得满意,可以把相关的网址发送给你的同伴,以获取他们的看法和帮助. 2.JS Nice JS Nice 是一个用于JavaScript的反代码混淆以及反极简主义的

7.测试与调试

1.测试用例     测试功能点 开始时间 完成时间 测试人员 说明 软件运行测试 6.14 6.14p 李增佐 1.程序运行正常,ip连接无误,发送信息正确,对方能够及时收到: 2.缺点:程序不能突破内网,双方必须在同一网段. ip连接测试 发送对话测试 文件传输测试 6.15  6.15 郑丁鹏 1.文件传输功能正常,各个类型文件均能正常传输: 2.传输速度稳定,已接收的文件均能正常运行: 3.缺点:不能断点续传: 传输状态测试 文件完整性测试 2.测试结果 自动测试开始 文件传输测试 文件

python学习(十一)测试和调试

最近学习了python的错误处理和几种测试方法 1 try except 可以通过try except方式捕捉异常 try: print('try...') r = 10/0 print('result is :', r) except ZeroDiversionError as e: print('except is :', e) finally: print('finally ...') print('END') 可以捕捉不同类型的错误,编写多个except try: print('try.