Конфигурационные данные в Scala — стоит ли использовать монаду Reader?

Как мне создать правильно функционирующий настраиваемый объект в Scala? Я посмотрел видео Тони Морриса о монаде Readerи до сих пор не могу соединить точки.

У меня есть жесткий -закодированный список из Clientобъектов:

class Client(name : String, age : Int){ /* etc */}

object Client{
  //Horrible!
  val clients  = List(Client("Bob", 20), Client("Cindy", 30))
}

Я хочу, чтобы Client.clientsопределялся во время выполнения с возможностью чтения из файла свойств или из базы данных. В мире Java я бы определил интерфейс, реализовал два типа источника и использовал DI для назначения переменной класса :

trait ConfigSource { 
  def clients : List[Client]
}

object ConfigFileSource extends ConfigSource {
  override def clients = buildClientsFromProperties(Properties("clients.properties"))  
  //...etc, read properties files 
}

object DatabaseSource extends ConfigSource { /* etc */ }

object Client {
  @Resource("configuration_source") 
  private var config : ConfigSource = _ //Inject it at runtime  

  val clients = config.clients 
} 

. Мне это кажется довольно чистым решением (не много кода, ясное намерение ), но этоvarвыскакивает (OTOH, мне это не кажется действительно хлопотным, так как я знаю, что будет вводиться один раз -и -только -один раз ).

Как бы выглядела в этой ситуации монада Readerи, объясните мне, как будто мне 5, в чем ее преимущества?

33
задан Larry OBrien 29 June 2012 в 00:06
поделиться