我正在研究ScalaDoc工具的一些特性,它允许库编写人员链接到第三方工具(如JavaDoc )创建的文档。
我的想法是有一些( XML )配置,它指定哪个包前缀属于哪个供应商,以及如何从类名创建一个有效的URL,作为正则表达式和格式字符串存储在XML中。
如果给定的配置不支持包名,我只需要一个公共方法getLink(entity: String): Option[String],它可以返回Some(validURL)或None。如果它改进了代码,其他的一切都可以随我的意愿进行更改。
请考虑以下代码:
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有什么想法吗?Mapping,Link,Reference .到处都是事情。发布于 2014-03-15 19:13:32
对如何改进lookUp有什么想法吗?
使用并发缓存。关键是,不管您的查找功能有多好或有多差,从性能上讲,没有什么能胜过缓存命中的性能。
是否有更好的方法来进行简单的缓存,而不是使用withDefault来修改底层映射?
getOrElseUpdate(key, value)https://codereview.stackexchange.com/questions/4215
复制相似问题