简介
尽管您可能认为编写需要分析文本的 java 应用程序是一项简单任务,但象许多事情一样,它会很快变得复杂起来。那的确是我在编写代码以解析 Html 页面时的经验。开始的时候,我偶然会使用 Perl5 正则表达式(regeXP)。但是,由于某些原因(稍后说明),我后来经常使用它们。
背景知识
在我的经验中,大多数 Java 开发人员都需要解析某种文本。通常,这意味着他们最初要花一些时间使用象 indexOf 或 substring 那样的与 Java 字符串相关的函数或方法,并且希望输入格式永远不变。但是,假如输入格式改变,那么用于读取新格式的代码维护起来就会变得更复杂、更困难。最后,代码可能需要支持自动换行(Word wrapping)、区分大小写等。
由于逻辑变得更加复杂,所以维护也变得很困难。因为任何更改都可能产生副作用并使文本解析器的其它部分停止工作,所以开发人员需要时间修正这些小错误。
有一定 Perl 经验的开发人员可能也有过使用正则表达式的经验。假如够幸运(或优秀)的话,这位开发人员能够说服团队其余的人(或至少是团队领导)使用这项技术。新的方法将取消编写用来调用 String 方法的多行代码,它意味着将解析器逻辑的核心委托出去,并替换为 regexp 库。
接受了有 Perl5 经验的开发人员的建议后,团队必须选择哪个 regex 实现最适合他们的项目。然后他们需要学习如何使用它。
在简要地研究了从因特网上找到的众多可选方案后,假设团队决定从人们更熟悉的库中选择一个使用,如属于 Jakarta 项目的 Oro。接下来,对解析器进行较大程度地重构或几乎重新编写,并且解析器最终使用了 Oro 的类,如 Perl5Compiler、Perl5Matcher 等。
这一决定的后果很明显:
去耦的好处
有没有办法使团队知道哪个实现最适合他们的需要呢(不仅现在能将来也能)?让我们试着寻找答案。
避免依靠任何特定的实现
前面的情形在软件工程中十分常见。在有些情况中,这样的情形会导致较大的投资和较长的延期。当不了解所有后果就作出决定而且决策制定人不太走运或缺乏必需的经验时,就经常会发生这种情况。
可将该情形概括如下:
这一问题的解决方法是使代码更加独立于提供者。这引入了新的层 ― 同时去除客户机和提供者的耦合的层。
在服务器端开发中,很轻易找到使用该方法的模式或体系结构。下面引用一些示例:
在假想的开发团队示例中,他们正在寻找这样的层:
新闻热点
疑难解答