0

私は持っている:

case class One(someParam: String) {
private val _defaultTimeout = readFromConfig("defaultTimeout")
val timeout: Timeout = akka.util.Timeout(_defaultTimeout seconds)
val info: Option[Info] = Await.result(someSmartService.getInformationForSomething(someParam)), timeout.duration)
}

一部の機密データを隠す (暗号化する) サービスを構築しています。私はそのような方法でそれをやっています:

def encrypt(oldOne: One): One = {
  val encryptedSomeParam = EncryptService.getHash(oldOne.someParam)
  val encryptedInfo = encryptInfo(oldOne.info)
  // what to do with that? ^^
  one.copy(someParam = encryptedSomeParam)
}

また、クラス 1 のこの「info」フィールド内のデータを暗号化する必要があります。問題は、それが val であり、val の値を再割り当てできないことです。それを行う簡単な方法はありますか?今のところ、var に変更することを考えていますが、最善の方法ではないと思います。また、次のように最初からこの値に暗号化されたデータを書き込むことはできません。

val info: Option[Info] = EncryptionService.encrypt(someSmartService.getInformationForSomething(someParam))

このフィールドは、フィールドを暗号化しない必要がある他の場所で使用されるためです。オブジェクトをデータベースに永続化する前に、機密データを暗号化したい。

何か案は?

前もって感謝します!

編集:これは悪い設計のように見えることを知っているので、誰かがそれを処理するより良いアイデアを持っているなら、私はあなたからの連絡を楽しみにしています:)

4

1 に答える 1

2

infoケースクラスの引数も作成してみませんか?

case class One(someParam: String, info: Option[Info])

info次のようなコンパニオン オブジェクトを定義することで、のデフォルト値を実装できます。

object One {
  def apply(someParam: String): One = One(someParam, someSmartService.getInformationForSomething(someParam))
}

これによりOne、次のように s を操作できます。

One("foo")
One("foo", Some(...))
One(encryptedSomeParam, encryptedInfo)
One("plaintext").copy(someParam = encryptedSomeParam, info = encryptedInfo)

編集 1: 遅延情報

ケース クラスは、lazy val 引数を持つことはできません。つまり、どちらinfo: => Option[String]lazy val info: Option[String]引数の型として許可されません。

infoただし、パラメーターのない関数を作成できます

case class One(someParam: String, info: () => Option[String])

object One {
  def apply(someParam: String): One = One(someParam, () => Some(someParam))
}

そしてそれを次のように使用します

One("hi", () => Some("foo"))
println(One("hi", () => None).info())

コード クライアント コードを壊さずにこれらの変更を導入することは不可能であるため、これは明らかに理想的ではありません。より良い解決策を歓迎します。

編集 2: 遅延情報、ケース クラスなし

ケース クラスであることを主張しないOne場合 (たとえば、 が本当に必要なためcopy)、簡単に使用できるように、遅延値とコンパニオン オブジェクトを含む通常のクラスを使用できます。

class One(_someParam: String, _info: => Option[String]) {
  val someParam = _someParam
  lazy val info = _info
}

object One {
  def apply(someParam: String): One = new One(someParam, Await.result(...))
  def apply(someParam: String, info: => Option[String]): One = new One(someParam, info)
  def unapply(one: One) = Some((one.someParam, one.info))
}
于 2013-03-01T12:44:28.623 に答える