В рубиновой жемчужине, которую я пишу, я должен взять в качестве входных данных некоторые известные параметры запроса и массировать их в строку запроса, а затем использовать эту построенную (url) строку в качестве конечной точки отдыха для извлечения этих данных.Какие шаблоны или стратегии программирования следует использовать для устранения небольших несоответствий в обработке данных?
Теперь есть некоторые странные несоответствия входных данных, и я разворачиваю свой код, чтобы нормализовать входные данные в последовательный вывод.
def build_query(params, endpoint)
limit = Hash[limit: params[:limit] || 0]
skip = Hash[skip: params[:skip] || 0]
asc = Hash[asc: params[:asc] || ""]
desc = Hash[desc: params[:desc] || ""]
query = [limit, skip, asc, desc].select { |hash| hash.values.none? { |val| val == '' || val == 0 } }
encoded = query.map{ |q| q.to_query }.join("&")
references = build_references(params[:include]) || ""
query_string = references.empty? ? "#{endpoint}#{encoded}" : "#{endpoint}#{references}&#{encoded}"
end
Вы увидите, что выше references
кусок params
не обрабатываются точно так же, как и остальные параметры. В ближайшее время появятся более противоречивые краевые дела. И единственный способ, которым я знаю, как бороться с ними, - это разблокировать мой код внутри этой функции. Скоро это будет беспорядочно!
Итак, как мне теперь отредактировать этот код? Куда мне идти, чтобы справиться с этой сложностью? Должен ли я использовать сотрудничающие объекты (ParamsBuilder
или QueryManager
) и какую-то стратегию полиморфизма?
Я хотел бы сохранить мой код простым и функциональным как можно больше.
У вас есть пример для параметров и конечной точки, и что должно быть возвращено методом? –