c# - 减少 Switch 语句数量的重构方法 - C#
问题描述
目前,我试图找到重构类似于以下内容的类的最佳方法:
public static SearchModel GetSearchResults(SearchModel model)
{
List<ResultModel> results = new List<ResultModel>();
try
{
string sqlCommand = string.Empty;
switch (model.Attribute)
{
case "Users":
sqlCommand = "GeneralUserSearch";
break;
case "Favorites":
sqlCommand = "UserFavorites";
break;
case "Email":
sqlCommand = "EmailSearch";
break;
}
using (SqlConnection conn = new SqlConnection("connection string"))
{
conn.Open();
using (SqlCommand cmd = AdoBase.GetSqlCommand(sqlCommand, conn))
{
switch (model.Attribute)
{
case "Users":
if(!string.IsNullOrWhiteSpace(model.Name)) {
cmd.Parameters.AddWithValue("Name", model.Name);
}
if(!string.IsNullOrWhiteSpace(model.Username)) {
cmd.Parameters.AddWithValue("Username", model.Username);
}
break;
case "Favorites":
cmd.Parameters.AddWithValue("Favorites", model.Favorites);
break;
case "Email":
cmd.Parameters.AddWithValue("Email", model.Email);
break;
}
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
ResultModel result = new ResultModel();
switch (model.Attribute)
{
case "Users":
result.Users.Add(reader["User"]);
break;
case "Favorites":
result.User = reader["User"];
result.Favorites = reader["Favorites"];
break;
case "Email":
result.User = reader["User"];
result.Email = reader["Email"];
break;
}
results.Add(result);
}
}
}
}
}
}
catch (Exception ex)
{
return ex;
}
return model;
}
由于搜索会根据 model.Attribute 中的值而变化,因此使用了 switch 语句。然而,大部分代码并不依赖于属性。有没有办法重构它以消除 switch 语句或将其减少到只有一个?
解决方案
开关是一种代码味道,表明您的代码不是面向对象的。在这种情况下,您可以使用不同类型的SearchModel
方法,并search
为每种类型实现不同的方法。
推荐阅读
- c# - 如何等到列表填充到 Plugin.Ble 中?
- python - 将格式(YYYY-MM-DD)中的日期拆分为数据框中的 3 个新列,分别为 Year、Month 和 Date
- vbscript - 服务器对象错误“ASP 0177:800401f3”
- cloudflare - Traefik:自动将子域添加到 cloudflare DNS
- laravel - 如果身份验证成功,请执行 Console.Log Laravel
- visual-studio-code - 每个选项卡的 VS Code 搜索(或独立搜索)
- javascript - JQuery 更改 HTML 但不更新屏幕
- css - 没有双边框或间隙的兄弟元素的边框
- react-native - 在 REACT NATIVE 中使用 STOMP 消息协议实现 SockJS 客户端
- oracle - 如何在不干扰现有接口的情况下更改 oracle ODI 中的源表和目标表连接详细信息?