3

Scala アプリケーションのエラーを定義するとします。Error、 、 、 である必要がWarningありOkます。とに人間が読めるテキスト メッセージを含めたいと思い Errorます。Warning

たとえば、エラーリストで最も重大なエラーを見つけるために、数値コード (0 - Ok、1 - Warning、および 2 - )も割り当てたいと思います。Error

したがって、このエラーを次のように定義します。

オブジェクト MyErrors {  
  抽象封印されたケース クラス MyError(コード: Int、多分メッセージ: オプション[文字列])
  object Ok extends MyError(0, None)
  最終ケース クラス Warning(メッセージ) extends MyError(1, Some(メッセージ))
  最終ケース クラス Error(メッセージ) extends MyError(2, Some(メッセージ))
}

それは理にかなっていますか?どのように実装しますか?

4

3 に答える 3

8

私によるといくつかの問題:

  1. ケースクラスを拡張することはできません。考えsealed traitてみてくださいabstract class
  2. なぜそれらすべてがMyErrorsオブジェクトに囲まれているのですか?
  3. あなたは本当にIntフィールドが必要ですか?フィルタリングにはパターンマッチングを使用できます。
  4. のインスタンスOkとして持つことMyErrorは意味的に間違っているように見えます。私はむしろ使用したいStatus
  5. 選択の問題ですが、私はErroneousStatus
  6. Eitherデザインを始める前に、またはValidation代替案として検討しましたか?
于 2012-06-06T15:25:06.830 に答える
2

Nicolasによるタイプの名前変更に関する提案を発展させて、Status他の優れたコードをいくつか示します。

sealed trait Status {
  def code: Int
}
object Status {
  case object Ok extends Status {
    val code = 0
  }
  sealed trait WithMessage extends Status {
    def message: String
  }
  case class Warning (message: String) extends WithMessage {
    val code = 1
  }
  case class Error (message: String) extends WithMessage {
    val code = 2
  }
}

次に、次のように使用できます。

scala> Status.Ok
res0: Status.Ok.type = Ok

scala> Status.Warning("blabla")
res1: Status.Warning = Warning(blabla)

scala> Status.Error("blabla").code
res2: Int = 2
于 2012-06-06T17:06:32.523 に答える
2

これは、あなたがやろうとしていると私が思うことを行います:

object MyErrors extends Enumeration {
  val Ok = Value("ok", 0)
  val Warning = Value("warning", 1)
  val Error = Value("error", 2)

  class TypeVal(val name: String, val code: Int) extends Val(nextId, name)

  protected final def Value(name: String, code: Int) = new TypeVal(name, code)

  sealed case class MyError(error: TypeVal, maybeMessage: Option[String])

  def ok(msg: Option[String] = None) = new MyError(Ok, msg)
  def error(msg: Option[String] = None) = new MyError(Error, msg)
  def warning(msg: Option[String] = None) = new MyError(Warning, msg)

}

使用:

val e = MyErrors.error() 
// or
val f = MyErrors.ok(Option("Don't worry, be happy"))
f.error.code // Int = 0
f.maybeMessage // Option[String] = Some(Don't worry, be happy)

明らかに、かなりきれいにすることができます。しかし、それはあなたを動かすはずです。

于 2012-06-06T16:43:06.590 に答える