Использование опции Scala для проверки аргумента командной строки - PullRequest
3 голосов
/ 22 сентября 2011

Я использую интерфейс командной строки Apache для анализа командной строки в служебном приложении Scala.Одним из аргументов является номер порта базы данных (--port=), который переопределяет значение по умолчанию «5432» (для PostgreSQL).Я пытаюсь использовать класс Option, чтобы помочь в проверке.Вот код, который я придумал.Есть ли лучший способ сделать проверку?

val port = Option(commandLine.getOptionValue("port", "5432")) map {
  try {
    val value = Integer.parseInt(_)
    if (value < 1 || value > 65535) throw new NumberFormatException
    value
  } catch {
    case ex: NumberFormatException =>
      throw new
        IllegalArgumentException("the port argument must be a number between 1 and 65535")
  }
} get

Номер порта должен быть целым числом от 1 до 65535 включительно.

Было бы лучше сделать это?Почему или почему нет?

val port = Option(commandLine.getOptionValue("port")) map {
  try {
    val value = Integer.parseInt(_)
    if (value < 1 || value > 65535) throw new NumberFormatException
    value
  } catch {
    case ex: NumberFormatException =>
      throw new
        IllegalArgumentException("the port argument must be a number between 1 and 65535")
  }
} getOrElse(5432)

Ответы [ 2 ]

5 голосов
/ 22 сентября 2011

Признаюсь, я не уверен на 100%, что вы хотите получить в случае, если что-то пойдет не так, или если 5432 - это порт по умолчанию для каждого неправильного значения, но вот что я бы сделал:

def getPort(candidate: Option[String]) = candidate
   .map { _.toInt } // throws NumberFormatException
   .filter { v => v > 0 && v <= 65535 } // returns Option[Int]
   .getOrElse { throw new IllegalArgumentException("error message") } // return an Int or throws an exception
2 голосов
/ 22 сентября 2011

Полагаю, сейчас самое время изучить Валидацию.

import scalaz._
import Scalaz._

val port = {
  def checkRange(port: Int): Validation[String, Int] = {
    if (port < 1 || port > 65535) "port not in [1-65535]".fail
    else port.success
  }
  commandLine.getOptionValue("port", "5432")
    .parseInt.flatMap(checkRange) match {
    case Failure(e) => throw new IllegalArgumentException(e.toString)
    case Success(port) => port
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...