2013-04-03 90 views
0

我的應用程序使用屬性文件來加載多個屬性。將相關字段封裝到伴隨對象/類中並避免重複

應用程序的每個實例都有3個與環境有關的參數 - 其中一個是屬性,另外兩個是基於它的計算。

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環境*屬性應該以某種方式封裝。

我稱爲尋求的抽象Discriminator,因爲它用於區分3(現在)的環境類型。因爲在一個運行的應用程序,只有一組這樣的環境中*屬性,我實現它作爲一個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
現在感覺像tokenliveurlPrefix值應該住在一起(如應爲staging等等的) - 有點像一個鑑別類的一個實例的一部分。

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

因爲我還是想用environment.Discriminator.urlPrefix,我仍然需要Discriminator(現在)的同伴對象。

但我卡在這裏 - 我不知道如何結合概念。

我明顯要創建自己的3個Discriminator實例 - 基於具體的flag字段,但是如何?我如何調用構造函數 - 根據第一個參數傳遞最後兩個參數(這對所有實例通用)?

一旦我有了這個,我如何連接三個實例與Discriminator伴侶對象,以便我可以使用environment.Discriminator.urlPrefix

回答

2

可以初始化同時這樣既tokenurlPrefix

val (token, urlPrefix) = flag match { 
    case "live" => ("L", "") 
    case "staging" => ("S", "staging-") 
    case "test" => ("T", "test-") 
} 
+0

是的!我很努力地從成對創建案例對象(比如:Discriminator(flag match {.. =>(「L」,「')..}),當我實際上我根本不需要任何顯式對象。謝謝! – teo

1

爲什麼不替換此:

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

的東西返回一個元組?例如

val tokens = flag match { 
     case "live" => ("L", "")