複数の検索条件を組み合わせた店舗検索機能実装において、従来のコード構造は条件ごとに個別メソッドを定義し、パラメータ処理が重複していました。これにより新規条件追加時に全メソッドの修正が必要になり、保守性が著しく低下していました。本稿では、辞書を活用したパラメータ管理とURL生成ロジックの統一化を通じた効率化手法を解説します。
従来の実装では、区域・特色などの各検索条件ごとに専用メソッドを用意し、パラメータ処理ロジックが重複していました。以下は区域条件と特色条件のURL生成メソッド例です。
protected string GenerateAreaUrl(object areaId)
{
var baseUrl = "SearchShop.aspx?a=1";
if (areaId.ToString() != "0")
{
baseUrl += "®ion=" + 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 += "®ion=" + 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";