以下 ruby 方法预计返回一个数组或 nil,具体取决于 api 调用是否成功。
# @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
一些背景:该方法是尝试几种检索坐标的方法的类的一部分(如果一种方法失败,我们将转到下一种方法)。
这虽然按预期工作,但似乎也违反了一些最佳实践和惯例(关于对无效状态进行多次检查)。有人能建议一种更健壮/高效/常规/美观的方式来处理这种情况吗?
虽然我仍然不清楚这里的实现,但我将如何重构你现在的代码以避免所有早期的回报
它使用模式匹配,通过断言指定的结构并固定所需的邮政编码来查找所需的条目。如果存在,则返回纬度和经度,否则
Array
返回nil
。