Livro 4 - Aplicativo Previsão do Tempo
6. Lógica da Aplicação
6.1. Classe Weather
A classe Weather encapsula as variáveis que representam os diversos elementos relacionados às condições climáticas de um determinado dia. Para realizar tarefas essenciais, como a conversão do carimbo de data/hora para o nome do dia correspondente e a formatação de números em strings apropriadas, a classe faz uso das funcionalidades fornecidas pelos pacotes java.text e java.util.
Para incorporar essa funcionalidade em seu projeto, crie um novo arquivo Kotlin no diretório principal do projeto, nomeando-o Weather.
Construtor
No Kotlin, a declaração do construtor de uma classe pode ser realizada de maneira direta no corpo da própria declaração da classe. Dessa forma, é possível criar um construtor de maneira simples, como exemplificado abaixo:
class Weather(var dayOfWeek: String,
var minTemp: String,
var maxTemp: String,
var humidity: String,
var description: String,
var iconURL: String) {}
Este trecho de código fornece um construtor padrão que aceita os valores da previsão e os atribui às variáveis correspondentes. Vale notar que esse processo é notavelmente simplificado no Kotlin, eliminando a necessidade de configurar manualmente as variáveis ou declará-las individualmente. Além disso, o acesso às variáveis pode ser feito sem a necessidade de implementar métodos getters/setters. Isso significa que podemos realizar operações de forma direta, como exemplificado abaixo:
var previsao: Weather = Weather(...)
previsao.description = "Dia Ensolaro"
var descricao = previsao.description
Dessa maneira, o Kotlin oferece uma sintaxe concisa e eficiente para lidar com a inicialização e manipulação de objetos, contribuindo para um código mais legível e de fácil manutenção.
Padrão de projeto Factory
Neste projeto, é necessário realizar algumas conversões durante a criação dos dados de previsão do tempo. Por exemplo, o carimbo de data deve ser convertido em um dia da semana antes de ser armazenado na variável dayOfWeek, e os valores de temperatura também precisam ser formatados para incluir o símbolo "ºC" no final. Para alcançar esses objetivos, optaremos por seguir um padrão de projeto conhecido como Factory.
O padrão de projeto Factory (ou Fábrica) é um padrão de criação que fornece uma interface para criar instâncias de uma classe, permitindo que a classe delegue o processo de instanciação para suas subclasses. O objetivo principal é abstrair o processo de criação de objetos, tornando-o mais flexível e adaptável às mudanças.
Adicione o seguinte código a classe Weather.
// Factory method - para criar um novo objeto weather
companion object{
fun create(timeStamp: Long, minTemp: Double, maxTemp: Double,
humidity: Double, description: String, iconName: String): Weather {
val numberFormat: NumberFormat = NumberFormat.getInstance()
NumberFormat.getInstance().setMaximumFractionDigits(0)
var dayOfWeek = convertTimeStampToDay(timeStamp)
var minTemp = numberFormat.format(minTemp) + " \u00b0C"
var maxTemp = numberFormat.format(maxTemp) + " \u00b0C"
var humidity = NumberFormat.getPercentInstance().format(humidity / 100.0)
var description = description
var iconURL = "http://openweathermap.org/img/w/$iconName.png"
return Weather(dayOfWeek,minTemp,maxTemp,humidity,description,iconURL)
}
private fun convertTimeStampToDay(timeStamp: Long): String {
// Cria um objeto Calendar com os dados atuais
val calendar = Calendar.getInstance()
// Configura a hora
calendar.timeInMillis = timeStamp * 1000
// obtem o fuso horário do dispositivo
val tz: TimeZone = TimeZone.getDefault()
// ajusta a hora com o fuso horário obtido
calendar.add(
Calendar.MILLISECOND, tz.getOffset(
calendar.timeInMillis
)
)
// SimpleDataFormat retorna o nome do dia
val dataFormatter = SimpleDateFormat("EEEE")
return dataFormatter.format(calendar.time)
}
}
O código apresenta uma aplicação do padrão de projeto Factory Method aplicado na criação de objetos do tipo Weather. O método create desempenha o papel fundamental, sendo encarregado da instanciação de objetos da classe Weather. Nesse contexto, ele recebe parâmetros que encapsulam as informações essenciais para a criação de uma nova instância de Weather.
No código utilizamos o objeto NumberFormat para formatar os valores das temperaturas em ºC sem vírgulas e a umidade em porcentagem (%). O caractere especial º é representado pelo código UTF-8 \u00b0. A variável iconURL faz uso de uma template padrão para criar a string correspondente. Essa string pré-definida corresponde ao endereço web no qual a OpenWeatherMap disponibiliza os ícones utilizados para representar diversas condições climáticas, como nuvens com chuva, dia ensolarado, entre outras. O método convertTimeStampToDay é usado para descobrir o nome do dia semana referente ao carimbo de data e será comentado logo a seguir.
Método convertTimeStampToDay
O método privado convertTimeStampToDay converte um carimbo de data em um nome de dia da semana. Esse método auxiliar desempenha a função de interpretar um valor longo, que representa o número de segundos decorridos desde 1º de janeiro de 1970, GMT (a convenção padrão para representação de tempo em sistemas Linux e, por conseguinte, Android).
Para realizar essa conversão, utilizamos um objeto Calendar. Configuramos o calendário com a localização atual do dispositivo, utilizando o método getInstance, para obter datas no idioma correspondente. Além disso, definimos o fuso horário por meio da variável tz. Informamos ao calendário a data desejada por meio do método add e, posteriormente, empregamos a classe SimpleDateFormat para extrair apenas o nome do dia da semana, indicado pelo parâmetro “EEEE”.