我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何从Moco解析程序库设计

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何从Moco解析程序库设计

如何从Moco解析程序库设计,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Moco在程序库设计包括两个方面,如何设置服务器和如何让服务器运行起来。

先说简单的,如何让服务器运行。最简单的选择是让用户自己启动服务器,然后,在测试结束之后关闭服务器。这么一来,每个测试都大概会是这样:

public void shouldWork() {    ... setup server ...    try {      server.start();      ... your test here ...     } finally {      server.stop();    }  }

作为一个框架,留给客户使用的接口一定简单,把实现细节封装在框架以内。如果每个测试都这么写,用户很快就会骂娘了。现在的Moco的做法是使用了running方法,把Server启停的细节封装了起来。

running(server, new Runnable() {    @Override   public void run() throws Exception {      assertThat(helper.get(root()), is("foo"));    }  });

我知道你不喜欢匿名内部类,我也不喜欢,但是,这是Java的局限。等到Java 8驾临,相信一切会有所改观。

设置服务器,也就是在什么样的请求,给什么样的应答。Moco有一个很关键的起点,那便是DSL,要知道,之前的一段时间我刚刚完成了《领域特定语言》的翻译。于是,API的可读性成了一件非常重要的事。

说起来很简单,但是,要知道匹配请求的条件有很多,而且还可能任意组合。如果这些条件是彼此独立的(“或”),我可以用变参来解决,但有时,这些条件是相关的(“与”),那该怎么办呢?拜函数式编程思路所赐,我想到了函数组合的方式。

我知道,Java没有一等公民的函数,但是,Java里有一等公民的对象,我们可以用对象模拟函数,事实上,这也是很多面向对象程序设计语言解决函数组合的一种方式,而这种对象称为函数对象,也叫functor。

把需要的条件封装成一个个函数对象,然后通过几个简单的运算符就可以将它们组合起来。目前Moco里提供了and和or两个运算符用于组合。

server.request(and(by(uri("/foo")), by(method("put")))).response("bar");  server.request(or(by("foo"), by(uri("/foo")))).response("bar");

随着面向对象思路的普及,函数组合的写法会越来越普遍的,它会成为程序员工具箱中的必备品。

DSL是一个重要的考量,所以,这里没有直接new对象,而是用函数(比如uri、method)做了一层封装。或许你会说,那为了可读性,我可以把类名设计成一个可读的样子,但new一个对象的问题在哪呢?就在new上。一方面,new是为了创建一个对象,这是实现细节,与我们要表达的内容不在一个层次,另一方面,你会发现多个new会让这句话显得不连贯。这句话?是的,我们的写法就像是用一句话声明一个东西一样,而我们期望自己讲的内容有一定的连贯性,而这才是DSL。

一旦设计成DSL,单个函数的文档也就失去了意义,更重要的是一个用法的文档。所以,在Moco里,我写了文档,却没有写JavaDoc。

在Moco里,请求和应答里可能有同样的东西,比如file,而request和response的参数类型是不一样的。如果file能够返回不同类型是***的,可惜在Java里面,我们不可能根据返回类型做重载。一种解决方案是为request和response分别设计一个函数,比如requestFile和responseFile,但显然,这种做法会把同样的逻辑分散到两个类实现里,而且这样需要共享的东西不只是file,还有其它一些东西。

在计算机问题里,加上一个中间层永远是一个重要的解决方案。这也是by的目的所在。这样一来,这些共享的东西就可以做成一个抽象(Resource),对请求来说,只要有一个by,就可以适配成Matcher。

在Moco设计中,还涉及到了一个框架设计中很重要的点:类型。Java是静态类型程序设计语言,利用好类型,就可以在编译期把错误报出来,而不会留到运行时,fail fast是很重要的一个程序设计实践。

Moco目前支持一些Content Type检测。如果把这个Content Type放到Resource里面,你会发现不是所有Resource都需要这个,比如method,我们当然可以在Resource接口里支持Content Type,在不需要的地方抛出异常。

在Moco里,我的做法是引入了一个ContentResource,支持Content Type,它继承于Resource,这样依赖,需要Content Type的接口(比如content),直接支持ContentResource,而其它部分继续支持Resource,这样,如果一不小心用错的话,编译就会报错。

再有一点是关于Publish接口,在Moco的实现里有一个Setting,还有一个BaseSetting,如果观察实现,在设置Request会创建出一个BaseSetting,但其返回的接口是Setting。这么做的一个原因是,因为Setting出现在用户可以使用的接口上,而BaseSetting是留给内部实现的,它提供了一些用于内部实现的方法,而用户是不应该使用这些方法的,所以,将二者做了一个分离,这样一来,保证了用户不会误操作。同样处理的还有HttpServer和ActualHttpServer。

小结一番,简化用户接口,设计DSL,利用好类型,区分Publish接口。

看完上述内容,你们掌握如何从Moco解析程序库设计的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何从Moco解析程序库设计

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何从Moco解析程序库设计

如何从Moco解析程序库设计,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Moco在程序库设计包括两个方面,如何设置服务器和如何让服务器运行起来。先说简单的,如何让服务器运行。
2023-06-17

结构化程序设计解析

  结构化程序设计(structuredprogramming)是进行以模块功能和处理过程设计为主的详细设计的基本原则。结构化程序设计是过程式程序设计的一个子集,它对写入的程序使用逻辑结构,使得理解和修改更有效更容易。  其概念最早由E.W.Dijikstra在1965年提出的,是软件发展的一个重要的里程碑。它的主要观
结构化程序设计解析
2024-04-18

怎么解析Java多线程程序设计

小编今天带大家了解怎么解析Java多线程程序设计,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎么解析Java多线程程序设计”的知识
2023-06-03

如何浅析Java多线程程序的设计机制

本篇文章为大家展示了如何浅析Java多线程程序的设计机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。浅析Java多线程程序设计机制多线程是Java语言的一大特性,多线程就是同时存在N个执行体,按几
2023-06-03

如何解析反应式编程 RxJava 设计原理

这篇文章给大家介绍如何解析反应式编程 RxJava 设计原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、ReactiveX 与 RxJavaReactiveX 的全称为Reactive Extension,一般缩
2023-06-03

如何分析SQL Server 数据库的设计

如何分析SQL Server 数据库的设计,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、数据库设计的必要性在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表
2023-06-26

vb程序设计如何建立窗口

要建立窗口,可以使用Visual Basic(VB)的窗体设计器来设计窗体。以下是基本的步骤:1. 打开Visual Basic,并创建一个新的Windows Forms应用程序项目。2. 在解决方案资源管理器中,双击Form1.vb文件以
2023-09-08

C语言如何设计并行程序

设计并行程序的关键在于充分利用计算机处理器的多核心和多线程能力,以提高程序的性能和效率。以下是设计并行程序的一般步骤:分析程序的计算密集型部分:首先确定程序中哪些部分是计算密集型的,即需要较长时间才能完成的计算任务。这些部分是并行化的潜在
2023-10-27

C#如何解析适配器设计模式

这篇文章将为大家详细讲解有关C#如何解析适配器设计模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天看到一个园子里的朋友写了一篇ASP.NET的适配器设计模式的文章。其中提到了把输入的电
2023-06-17

java如何实现日历应用程序设计

这篇“java如何实现日历应用程序设计”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java如何实现日历应用程序设计”文章吧
2023-07-02

Java如何从 XML 解析器获取选项设置信息

本文介绍了使用Java从XML解析器(DOM、SAX、XPath)获取选项设置信息的详细步骤。通过DOM解析,可创建解析器并遍历XML文档的选项元素;通过SAX解析,需创建事件处理器来处理开始元素事件,从而获取选项信息;而XPath解析则使用表达式提取选项设置信息。这三种方法均可有效获取XML中的选项设置,为用户提供了灵活的选择。
Java如何从 XML 解析器获取选项设置信息
2024-04-02

Python如何从 XML 解析器获取选项设置信息

Python提供XML解析库,允许从XML文档获取选项设置信息。使用ElementTree.parse()函数获取XML文档并访问XML属性,如元素属性和全局选项。自定义XML解析器可进一步定制解析。其他方法包括XMLParser.parser()、root.iterfind()和root.findall()。通过ElementTree,开发者可灵活地从XML文档中提取信息并满足解析需求。
Python如何从 XML 解析器获取选项设置信息
2024-04-02

如何设置Win7打开文件默认程序服从安排

双击打开android文件是最使用电脑最基本的操作,但就是这么简单的一个动作,操作系统也会经常搞错。例如想要打开一张图片时,如果Win7中安装了两款可以打开图片的软件,系统就有可能把这两款软件搞混,调用错误的程序打开图片。虽然Win7很智能
2023-05-26

PHP如何从 XML 解析器获取选项设置信息

本指南详细介绍了如何使用xml_parser_get_option()函数从PHPXML解析器获取选项设置。此函数可配置解析器行为,如实体解析和DTD处理。本文涵盖了语法、参数、返回值和可用的选项,并提供示例来演示其使用。了解和配置这些选项有助于优化XML解析的性能和准确性。
PHP如何从 XML 解析器获取选项设置信息
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录