Espera-se que o seguinte método Ruby retorne um array ou nulo, dependendo se a chamada da API foi bem-sucedida ou não.
# @return [Array or nil] - but should not throw error if anything fails
def fetch_coords_from_api
api_url = "some_api_url"
params = { api_key: ENV["API_KEY"] }
response = ApiClient.new(api_url, params).get
return unless response
json = JSON.parse(response.body)
return unless json.is_a?(Hash) && json["result"]
addresses = json["result"]
return unless addresses.is_a?(Array) && !addresses.empty?
address = addresses.find { |add| add["zip"] == zip }
return unless address&.key?("latitude") && address&.key?("longitude")
[ address["latitude"], address["longitude"] ]
end
Algum contexto: o método faz parte de uma classe que tenta vários métodos para recuperar coordenadas (se um método falhar, passamos para o próximo).
Isso funciona como esperado, mas também parece violar diversas práticas recomendadas e convenções (em relação às múltiplas verificações de um estado inválido). Alguém pode sugerir uma maneira mais robusta/eficiente/convencional/bonita de lidar com um cenário como esse?
Embora eu ainda não esteja claro sobre a implementação, aqui está como eu faria para refatorar o código que você tem agora para evitar todos os retornos iniciais
Isso usa correspondência de padrões para encontrar a entrada desejada, afirmando a estrutura especificada e fixando o CEP desejado. Se existir, retornará a latitude e a longitude como um
Array
valor, caso contrário, retornaránil
.