首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理XML配置,该配置存储文档工具的正则表达式和格式字符串。

处理XML配置,该配置存储文档工具的正则表达式和格式字符串。
EN

Code Review用户
提问于 2011-08-19 13:57:38
回答 1查看 568关注 0票数 5

我正在研究ScalaDoc工具的一些特性,它允许库编写人员链接到第三方工具(如JavaDoc )创建的文档。

我的想法是有一些( XML )配置,它指定哪个包前缀属于哪个供应商,以及如何从类名创建一个有效的URL,作为正则表达式和格式字符串存储在XML中。

如果给定的配置不支持包名,我只需要一个公共方法getLink(entity: String): Option[String],它可以返回Some(validURL)None。如果它改进了代码,其他的一切都可以随我的意愿进行更改。

请考虑以下代码:

代码语言:javascript
复制
object ExternalReferences2 {
  import java.util.regex._
  import collection.mutable._

  private object Mapping {
    def fromXml(mapping: scala.xml.NodeSeq) = {
      new Mapping(mapping \ "vendor" text, mapping \ "match" text, mapping \ "format" text)
    }
  }
  private case class Mapping(vendor: String, matches: String, format: String) {
    private val pattern = Pattern.compile(matches)
    private var currentMatcher: Matcher = null

    def hasValue(entity: String) = {
      currentMatcher = pattern.matcher(entity); 
      currentMatcher.matches
    }

    def getValue = {
      val range = 0 until currentMatcher.groupCount()
      val groups = range
                     .map (currentMatcher.group(_))
                     .filterNot (_ == null)
                     .map (_.replace('.', '/'))
      format.format(groups: _*)
    }
  }

  private val config =
    <external-links>
      <mapping>
        <vendor>OpenJDK</vendor>
        <match>{ """^(javax?|sunw?|com.sun|org\.(ietf\.jgss|omg|w3c\.dom|xml\.sax))(\.[^.]+)+$""" }</match>
        <format>{ "http://download.oracle.com/javase/7/docs/api/%s.html" }</format>
      </mapping>
    </external-links>

  private def lookUp(entity: String) =
    (config \ "mapping").view
      .map(m => Mapping.fromXml(m))
      .find(_.hasValue(entity))
      .map(_.getValue)

  private val links: Map[String, Option[String]] = Map[String, Option[String]]()
    .withDefault(entry => {val result = lookUp(entry); links += ((entry, result)); result})

  def getLink(entity: String) = links(entity)
}

我怎样才能改进代码呢?

  • hasValue之前调用getValue是非常糟糕的,但我不想创建两次matcher。
  • 我必须使用哪些环境变量,以便工具能够从当前目录或从任意位置使用命令行开关来获取配置?
  • 是否有更好的方法来进行简单的缓存,而不是使用withDefault来修改底层映射?
  • 对如何改进lookUp有什么想法吗?
  • 有什么更好的名字吗?我不喜欢MappingLinkReference .到处都是事情。
EN

回答 1

Code Review用户

发布于 2014-03-15 19:13:32

对如何改进lookUp有什么想法吗?

使用并发缓存。关键是,不管您的查找功能有多好或有多差,从性能上讲,没有什么能胜过缓存命中的性能。

是否有更好的方法来进行简单的缓存,而不是使用withDefault来修改底层映射?

代码语言:javascript
复制
getOrElseUpdate(key, value)
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/4215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档