Обработка XML-файл конфигурации, который хранит регулярных выражений и строк формата для инструмента документации


Я расследую некоторые функции для инструмента ScalaDoc, что позволит авторам библиотек ссылку на документацию, созданные сторонние инструменты, такие как javadoc.

Моя идея состоит в том, чтобы иметь некоторые конфигурации (в XML), который определяет, какой пакет префиксы принадлежат к который продавец и, как создать действительный URL-адрес с именем класса, хранимых в XML как регулярные выражения и строки формата.

Мне нужен только один публичный метод getLink(объект: строка): вариант[струн] , который возвращает некоторые(validURL) или нет, если имя пакета не поддерживается данной конфигурации. Все остальное можно изменить так, как я хочу, если это улучшает код.

Рассмотрим этот код:

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 перед думою это очень плохо, но я не хочу, чтобы создать совпадений дважды.
  • Какие переменные среды я должен использовать таким образом, что инструмент может подобрать конфигурацию из текущего каталога или из произвольного места с переключателем командной строки?
  • Есть ли лучший способ сделать простой кэширования, чем через withDefault мутировать базовой карте?
  • Любые идеи о том, как улучшить поиск?
  • Есть какие-то идеи для названия получше? Я не доволен сопоставление, Ссылка, Ссылка ... вещи все на месте.


646
5
задан 19 августа 2011 в 01:08 Источник Поделиться
Комментарии
1 ответ


Любые идеи о том, как улучшить поиск?

Использование параллельного кэша. Суть в том, что независимо от того, насколько хорошо или плохо вы подстановки функции, ничто не сравнится с попадания в кэш игре..


Есть ли лучший способ сделать простой кэширования, чем через withDefault в
мутировать базовой карте?

getOrElseUpdate(key, value)

2
ответ дан 15 марта 2014 в 07:03 Источник Поделиться