ルビーの宝石で私は入力として特定の既知のクエリパラメータを受け取り、それらをクエリ文字列にマッサージし、そのデータを取得するための残りのエンドポイントとしてその構築された(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
あなたはparams
のreferences
片が残りのパラメータと同じように扱われていないことの上に表示されます。間もなくエッジのケースが少しずつ矛盾しています。そして、私がこれらを処理する方法を知っている唯一の方法は、この関数の中で自分のコードをフォークすることです。それはすぐに乱雑になるだろう!
このコードをどのようにリファクタリングする必要がありますか?この複雑さを管理するためにここからどこに行くべきですか?コラボレーションオブジェクト(ParamsBuilder
またはQueryManager
)と何らかの多型戦略を使用する必要がありますか?
コードをできるだけ単純で機能的に保ちたいと思います。
paramsとエンドポイントの例がありますが、そのメソッドから返されるものは何ですか? –