其次,即使MailBot仅仅需要得到是否匹配的返回信息,而无需得到匹配的文本,匹配器也会返回一个匹配的字符串。这意味着为了简单地使用BadRegExpMatcher来验证一个特定格式的日期标题,你也必须创建二个 String对象━━供匹配器使用的输入文本和匹配结果文本。创建二个对象似乎不会对性能产生重大影响,但如果必须为MailBot处理的每条邮件的标题创建二个对象,就可能严重地影响程序的性能。这一问题并不出在MailBot本身的设计上,而是出在BadRegExpMatcher的设计上。
注意:不返回String对象而返回一个"轻量级"的Match对象也不会在性能上带来很大的改进。尽管创建一个Match对象的代价要比创建一个String对象的代价低一些,它还是会产生一个char数组,并拷贝数据,仍然创建了一个对调用者并非必需的临时性的对象。
BadRegExpMatcher只接受它需要的输入数据类型,而不是可以接受我们方便提供的数据类型,仅就这一点,它就非常不理想。使用BadRegExpMatcher还会带来别的危害,其中的一个潜在的危害是这样将对MailBot的性能带来更多的影响。尽管在处理邮件的标题时必须避免使用Strings,但又必须创建许多的Strings对象供BadRegExpMatcher使用,因此你可能放弃不使用String对象的目标,而更加不受限制地使用它。一个设计不恰当的组件会影响使用它的程序的性能,即使以后找到了一个无需使用String对象的表达式组件,整个程序仍然会受到影响。
一个恰当的接口
如何定义BadRegExpMatcher才能避免上述的问题呢?首先,BadRegExpMatcher应该不指定其输入文本的格式,它应该能够接受其调用者可以高效地提供的任何一种数据类型。其次,它不应该为匹配结果自动地生成一个String对象,只需要返回足够的信息让调用者来决定是否需要生成匹配结果字符串。(也可以提供一个方法来完成这一任务,但这并非是必需的。)一个性能比较好的接口应该是这样的:
class BetterRegExpMatcher {
public BetterRegExpMatcher(...);
/** 使匹配器可以接受多种格式的输入━━ String对象、字符数组、字符组数的子集,如果不匹配,返回-1;如果匹配,则返回开始匹配的偏移地址。*/
public int match(String inputText);
public int match(char[] inputText);
public int match(char[] inputText, int offset, int length);
/** 如果匹配,则返回匹配的长度;如果不是完全匹配,则调用程序应该能够从匹配的偏移处生成匹配的字符串 */
public int getMatchLength();
/** 如果调用程序需要,就可以很方便地得到匹配字符串的子程序 */
public String getMatchText();
}
文章来源于领测软件测试网 https://www.ltesting.net/