Back-End

22 nov, 2012

Sobre nulls e propriedades do sistema em Scala

Publicidade

Em Scala, normalmente é uma boa ideia evitar nulls em seu código. Em vez disso, é recomendado que você use a classe Option. É assim que funciona: se o valor com que você está trabalhando for NULL, ele é representado por None, caso contrário, ele é representado por Some(valor). Ambos None e Some são subclasses de Option.

Isso te permite escrever um código que seja muito mais expressivo do que ter ‘if != null‘ por todo o lugar. Além disso, é muito menos provável que você se esqueça de verificar para a nulidade. Uma forma de alavancar um valor de Option é através da combinação de padrões:

val myValue: Option[String] = Some("Hello")
myValue match {
  case Some(x) => println("my value is " + x)
  case None => println("nonthing found")
}

A classe Option também oferece algumas funções do tipo coleção que também permitem uma ótima leitura. A partir do Scaladoc:

val name: Option[String] = request.getParameter("name")
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper.getOrElse(""))

Observe como o código executa transformações e filtragem ‘if-like’ de uma forma muito limpa. Depois disso, eles tentam usar o valor com a função getOrElse, que permite que você passe um valor padrão para ser usado se o resultado da linha anterior foi None. Finalmente, se você realmente quer usar um argumento if, você pode chamar a função isDefined, que retorna true se o valor for Some, e false, caso contrário.

Agora vamos falar sobre as propriedades do sistema. Vamos encarar: lidar com as propriedades do sistema em Java é um saco. Você tem que pegar cada propriedade em que você está interessado e tem que verificar se ela está null ou empty. Depois de toda a discussão acima, você provavelmente está começando a adivinhar aonde quero chegar, né?

Bem, é melhor do que isso. Scala engloba as propriedades do sistema de uma maneira que podemos aproveitar todo a Option explicado acima. Essas propriedades são englobadas em uma classe chamada SystemProperties, podem ser acessadas pelo objeto “sys.props”. Experimente digitar em uma sessão no console do Scala para ver por si mesmo.

Uma vez que é um mapa, você pode usar qualquer função de mapa que possa usar com outros mapas. Além disso, você pode adicionar e obter as propriedades desse objeto, e elas serão refletidas nas propriedades do sistema atuais – o que significa que seu código Java também deve ser capaz de ler as propriedades, ainda que por meios mais tradicionais (ou seja, System.getProperty). Imprimir todas as propriedades do sistema é tão simples como:

sys.props.foreach(println)

E você poderia claramente fazer algo mais inteligente e útil com essas propriedades.

Existem duas funções disponíveis na classe SystemProperties que eu quero abordar aqui: get e getOrElse. A primeira retorna uma propriedade com um determinado nome, em uma Option. Com isso, você agora pode lidar com a sua propriedade com tudo o que a Option pode oferecer, como falamos acima. A segunda função, getOrElse, é basicamente uma forma direta de chamar a mesma função que você poderia chamar em uma Option. Por exemplo, digamos que você leia uma configuração de banco de dados de propriedades do sistema, e quer voltar para uma configuração padrão se a propriedade não for encontrada:

val dbURL = sys.props.getOrElse("myapp.database.url", "jdbc:postgresql://localhost:5432/mydb")

Muito melhor do que ler a propriedade e verificar se existe manualmente, certo?

***

Texto original disponível em http://jcranky.com/2011/06/04/about-nulls-and-system-properties-in-scala/