构建用于正则表达式的抽象Java API

当您在 Java 中使用正则表达式时,依赖某一具体 regexp 库通常不是个好 主意。如果使用抽象层,您可以在不同 regexp 库之间切换,降低您的代码与特 定库之间的耦合,并能选择哪个库最适合您的需要。如果您正在考虑在下一个项 目中使用 Java regexp 库,软件开发人员 Jose San Leandro Armendariz 将向 您演示如何使代码独立于所选择的具体库。并让您进一步了解 regexp 及其工作 原理,随后还提供了一些练习。

简介

尽管您可能认为编写需要分析文本的 Java 应用程序是一项简单任务,但象 许多事情一样,它会很快变得复杂起来。那的确是我在编写代码以解析 HTML 页 面时的经验。开始的时候,我偶尔会使用 Perl5 正则表达式(regexp)。但是 ,由于某些原因(稍后说明),我后来常常使用它们。

背景知识

在我的经验中,大多数 Java 开发人员都需要解析某种文本。通常,这意味 着他们最初要花一些时间使用象 indexOf 或 substring 那样的与 Java 字符串 相关的函数或方法,并且希望输入格式永远不变。但是,如果输入格式改变,那 么用于读取新格式的代码维护起来就会变得更复杂、更困难。最后,代码可能需 要支持自动换行(word wrapping)、区分大小写等。

由于逻辑变得更加复杂,所以维护也变得很困难。因为任何更改都可能产生 副作用并使文本解析器的其它部分停止工作,所以开发人员需要时间修正这些小 错误。

有一定 Perl 经验的开发人员可能也有过使用正则表达式的经验。如果够幸 运(或优秀)的话,这位开发人员能够说服团队其余的人(或至少是团队领导) 使用这项技术。新的方法将取消编写用来调用 String 方法的多行代码,它意味 着将解析器逻辑的核心委托出去,并替换为 regexp 库。

接受了有 Perl5 经验的开发人员的建议后,团队必须选择哪个 regex 实现 最适合他们的项目。然后他们需要学习如何使用它。

在简要地研究了从因特网上找到的众多可选方案后,假设团队决定从人们更 熟悉的库中选择一个使用,如属于 Jakarta项目的 Oro。接下来,对解析器进行 较大程度地重构或几乎重新编写,并且解析器最终使用了 Oro 的类,如 Perl5Compiler 、 Perl5Matcher 等。

这一决定的后果很明显:

代码与 Jakarta Oro 的类紧密地耦合在一起。

团队承担了风险,因为不知道非功能性需求(如性能或线程模型)是否将得 到满足。

团队已花费时间和财力来学习并重新编写代码,以使它使用 regexp 库。如 果他们的决定是错误的并且选择了新的库,则这一工作在成本上将不会有很大区 别,因为将需要再次重新编写代码。

即使库工作正常,如果他们决定应该迁移到全新的库(例如,包括在 JDK 1.4 中的库),怎么办?

去耦的好处

有没有办法使团队知道哪个实现最适合他们的需要呢(不仅现在能将来也能 )?让我们试着寻找答案。

避免依赖任何特定的实现

前面的情形在软件工程中十分常见。在有些情况中,这样的情形会导致较大 的投资和较长的延期。当不了解所有后果就作出决定而且决策制定人不太走运或 缺乏必需的经验时,就常常会发生这种情况。

时间: 2024-12-21 20:33:45

构建用于正则表达式的抽象Java API的相关文章

用JAX-RPC构建RPC服务和客户机:使用Java API构建基于RPC的Web服务(一)

简介:远程过程调用(RPC)是基于 Simple Object Access Protocol(SOAP)或 Representational State Transfer(REST)的现代 Web 服务的前身.因为所有 Java 平台的 Web 服务 API 都构建 在从 RPC 引入的概念之上,所以要想用 Java 语言编写有效且高效的 Web 服务,理解 Java API for XML-Based RPC(JAX-RPC)几乎是必需的.本教程讲解如何获取.安装和配置 JAX-RPC 并构

处理JSON的Java API :JSON的简介

原文链接  作者:Jitendra Kotamraju   译者:撒木 处理JSON的各种解析.生成.处理.转换和查询的JAVA API JSON (JavaScript Object Notation)是一种轻量级的.基于文本的.完全独立于语言的数据交换格式.它非常方便人们和机器的阅读和书写.JSON 有两种结构类型的表现方式:对象和数组.对象是名/值对的无序集合.数组是值(value)的有序集合.值的类型可以是字符串(在双引号中).数字(整数或浮点数).逻辑值(true或false).数组(

Erlang是未来用于并发性的Java?

问题描述 未来的计算是并发计算.现今甚至桌面CPU也是多核的,当客户给他们的服务器购买了越来越多的CPU时,他们期望其应用伸缩自如以利用他们的新投资.但是今天的许多软件系统并不能做到这一点.处理并发计算是件困难的事情.但是在普遍使用的编程语言中,并发机制与同一语言的许多其他抽象相比是低层机制,对解决这一问题没有帮助.处理并发性需要做许多工作,但是有使其更简单的方法.Ralph Johnson 撰写了一篇关于 Erlang 将成为 下一个Java的博文.Erlang进程间通讯的视角完全不同,而且R

使用RTC提供的Plain Java API进行客户端开发

通过阅读本文,您将学会如何使用 Plain Java API 编写客户端代码来进行 RTC 上的二次开发,提高管理 Work Item 整个生命周期的效率,更加高效的实现团队合作. Rational Team Concert (RTC) 是构建在 IBM Rational 面向软件交付技术的下一代协作平台 Jazz 上的第一个协作式的开发环境,它包含了集成的源代码控制.工作项(Work Item)管理和构建管理等功能.http://www.aliyun.com/zixun/aggregation

Google证实下一版Android不再使用Oracle专属的Java API

Google正计划将Java应用程序接口(APIs)从Orcale专属的Java开发套件(JDK)换成开源的OpenJDK.Hacker News在上月率先曝光了"神秘的Android代码库",而Google亦向VentureBeat证实"Android N"将仅仅依赖于OpenJDK,而不是Android自有的Java API版本. 一名Google发言人告诉VentureBeat: 作为一个开源的平台,Android建立在开源社区的协作之上. 在我们即将发布的新

WizTools.org oEmbed Java API 0.2.0发布

WizTools.org oEmbed Java API是一个Java实现的oEmbed API.它的特点是简单.可扩展性和最低减少第三方的依赖性. WizTools.org是一个用Java开发的,用来测试正则表达式的工具. WizTools.org oEmbed Java API 0.2.0该版本是第一次公开发布,支持Maven中央资源库.与以前的版本相比,这个版本有一个方便的类用于建设oEmbed网址. 软件信息:http://code.google.com/p/wiztools-oembe

DB2 NoSQL JSON 功能(三) 使用 Java API 编写应用程序

管理 JSON 文档 - 使用事务和不使用事务 概述 简介 DB2 JSON 是一个可用于 DB2 Linux, Unix and Windows 10.5 的 Technology Preview,提供了以下特性: 一个命令行 shell 用于管理和查询 JSON 数据 一个 Java API 用于应用程序开发 一个有线监听器用于接受和响应通过网络发送的请求. 图 1. DB2 JSON 组件 本文将介绍如何使用 Java 接口管理和查询 DB2 JSON 文档存储中的 JSON 文档.还将讨

HBase Java API详解

[本文转自HBase Java API详解] HBase是Hadoop的数据库,能够对大数据提供随机.实时读写访问.他是开源的,分布式的,多版本的,面向列的,存储模型. 在讲解的时候我首先给大家讲解一下HBase的整体结构,如下图: HBase Master是服务器负责管理所有的HRegion服务器,HBase Master并不存储HBase服务器的任何数据,HBase逻辑上的表可能会划分为多个HRegion,然后存储在HRegion Server群中,HBase Master Server中存

Google确认下一个Android版本将不会使用Oracle的Java API

在下一个Android版本中Google将会把应用程序接口(APIs)的实现替换为OpenJDK,它是Oracle私有的Java开发工具包(JDK)的开源版本.Google确认了Android N将会仅依赖于OpenJDK,而非Android自身实现的Java APIs.一位Google的发言人说:"最为一个开源平台,Android的构建是基于开源社区的合作.在即将到来的Android的下一个版本Android N,我们计划将所有Android的Java语言开发包用OpenJDK实现,从而为开发