0

私のアプリケーションは、プロパティ ファイルを使用して複数のプロパティをロードします。

アプリケーションのすべてのインスタンスには、環境に関連する 3 つのパラメーターがあります。そのうちの 1 つはプロパティで、残りの 2 つはそれに基づいて計算されます。

class Environment(val properties: Properties) {
    val dbUrl = valueOrError("db.url")
    val host = valueOrError("host")
    //... 

    val environmentFlag = valueOrError("env.flag") 
    val environmentToken = environmentFlag match {
        case "live" => "L"
        case "staging" => "S"
        case "test" => "T"
    val environmentUrlPrefix = environmentFlag match {
        case "live" => ""
        case "staging" => "staging-"
        case "test" => "test"
    }       

}

3 つの環境* プロパティは何らかの方法でカプセル化する必要があるように思えます。

Discriminator3 つの (今のところ) 環境タイプを区別するために使用されるため、私はこの抽象化を seeked と呼びました。1 つの実行中のアプリケーションでは、そのような environment* プロパティのセットが 1 つしかないため、次のように実装しましたobject

class Environment(val properties: Properties) { 
    val dbUrl ... 

    object Discriminator {
        val flag = valueOrError("env.flag")
        val token = flag match {
            case "live" => "L"
            case "staging" => "S"
            case "test" => "T"
        val urlPrefix = flag match {
            case "live" => ""
            case "staging"=> "staging-"
            case "test" => "test-"
        }
     }
}

私は呼び出すことができます: environment.Discriminator.urlPrefix、これは問題ありませんが、どうすればコードを改善できますか? 重複を取り除くにはどうすればよいmatchですか? これで、との値が一緒に存在する必要
があるように感じられます(for などの値と同様に) - Discriminator クラスの 1 つのインスタンスの一部のようなものです。tokenurlPrefixlivestaging

abstract class Discriminator(val flag = valueOrError("env.flag"), 
                             val token: String
                             val urlPrefix: String)

私はまだ を使いたいのでenvironment.Discriminator.urlPrefixDiscriminator(現在の) コンパニオン オブジェクトが必要です。

しかし、私はここで立ち往生しています - 概念を組み合わせる方法がわかりません。

flag具体的なフィールドに基づいて、Discriminator の 3 つのインスタンスを自分で作成する必要があることは明らかですが、どうすればよいでしょうか。コンストラクターを呼び出すにはどうすればよいですか? 最初のパラメーターに基づいて最後の 2 つのパラメーターを渡します (これはすべてのインスタンスに共通です)。

これを取得したら、3 つのインスタンスを Discriminator コンパニオン オブジェクトに接続して、 を使用できるようにするにはどうすればよいenvironment.Discriminator.urlPrefixでしょうか?

4

2 に答える 2

2

次のように両方tokenurlPrefix同時に初期化できます。

val (token, urlPrefix) = flag match {
  case "live" => ("L", "")
  case "staging" => ("S", "staging-")
  case "test" => ("T", "test-")
}
于 2013-04-03T14:44:47.913 に答える
1

これを置き換えてみませんか:

   val token = flag match {
        case "live" => "L"
        ....
    val urlPrefix = flag match {
        case "live" => ""
        .....

タプルを返す何かで?例えば

   val tokens = flag match {
        case "live" => ("L", "")
于 2013-04-03T14:40:29.453 に答える