複合条件検索機能の最適化と実装改善

複数の検索条件を組み合わせた店舗検索機能実装において、従来のコード構造は条件ごとに個別メソッドを定義し、パラメータ処理が重複していました。これにより新規条件追加時に全メソッドの修正が必要になり、保守性が著しく低下していました。本稿では、辞書を活用したパラメータ管理とURL生成ロジックの統一化を通じた効率化手法を解説します。
従来の実装では、区域・特色などの各検索条件ごとに専用メソッドを用意し、パラメータ処理ロジックが重複していました。以下は区域条件と特色条件のURL生成メソッド例です。
protected string GenerateAreaUrl(object areaId) { var baseUrl = "SearchShop.aspx?a=1"; if (areaId.ToString() != "0") { baseUrl += "&region=" + areaId; } if (!string.IsNullOrEmpty(Request["keyword"])) { baseUrl += "&keyword=" + Request["keyword"]; } if (!string.IsNullOrEmpty(Request["category"])) { baseUrl += "&category=" + Request["category"]; } return baseUrl; } protected string GenerateFeatureUrl(object featureId) { var baseUrl = "SearchShop.aspx?a=1"; if (featureId.ToString() != "0") { baseUrl += "&feature=" + featureId; } if (!string.IsNullOrEmpty(Request["keyword"])) { baseUrl += "&keyword=" + Request["keyword"]; } if (!string.IsNullOrEmpty(Request["region"])) { baseUrl += "&region=" + Request["region"]; } return baseUrl; }
この構造の問題点は、条件追加時に全メソッドを修正する必要がある点です。解決策として、全パラメータを動的管理する辞書を導入し、共通のURL生成ロジックを実装しました。
private Dictionary<string, string> currentParams = new Dictionary<string, string>(); protected override void OnLoad(EventArgs e) { base.OnLoad(e); foreach (string key in Request.QueryString.Keys) { string value = Request.QueryString[key]; if (!string.IsNullOrEmpty(value)) { currentParams[key] = value; } } } protected string BuildSearchUrl(string paramKey, string paramValue) { var updatedParams = new Dictionary<string, string>(currentParams); if (!string.IsNullOrEmpty(paramValue)) { updatedParams[paramKey] = paramValue; } else { updatedParams.Remove(paramKey); } var segments = updatedParams.Select(p => $"{p.Key}{p.Value}"); return $"search.aspx?query={string.Join("/", segments)}/"; } protected string RemoveParam(string paramKey) { var updatedParams = new Dictionary<string, string>(currentParams); updatedParams.Remove(paramKey); var segments = updatedParams.Select(p => $"{p.Key}{p.Value}"); return $"search.aspx?query={string.Join("/", segments)}/"; }
多選択条件の処理にはビットマスクを活用し、効率的なフィルタリングを実現しました。各条件を2のべき乗値で表現し、AND演算で複数条件のマッチングを簡略化しています。
string queryCondition = "SELECT * FROM Restaurants WHERE "; int selectedServiceFlags = 0b101; // 1番目と3番目のサービスが選択中 queryCondition += $" AND (serviceMask & {selectedServiceFlags}) > 0";

タグ: C# ASP.NET URL生成 コードリファクタリング パラメータ管理

7月8日 16:08 投稿