Han*_*ody 5 c# design-patterns if-statement
我有很多这个方法if statements,其中我SharePoint list根据员工职位进行过滤。结果是query string 作为参数传递给另一个方法QuerySPList。
public List<Phone> GetListOfPhones(Employee emp)
{
List<Phone> records = new List<Phone>();
string query = string.Empty;
if (emp.Positions.Count == 1 && emp.Positions[0] == "Regular")
{
query = "";// some querystring
}
if (emp.Positions.Count == 1 && emp.Positions[0] == "OfficeDirector")
{
query = "";// some querystring
}
if (emp.Positions.Count == 1 && emp.Positions[0] == "Admin")
{
query = "";// some querystring
}
if (emp.Positions.Count == 2 && emp.Positions.Contains("Regular") && emp.Positions.Contains("OfficeDirector"))
{
query = "";// some querystring
}
var rawItems = QuerySPList(query);
foreach (SPListItem item in rawItems)
{
//business logic
}
return records;
}}
Run Code Online (Sandbox Code Playgroud)
我读过通过实施strategy pattern我们可以避免大量代码混乱if,但是,我是开发和设计模式的新手,所以我几乎不需要帮助,所以如果有人可以指导我我该怎么做并给我建议,随时回答我的问题。我有想法,但我认为我走错了方向。想法是创建interfaceIRoleHandler 然后将其实现为 3 classes,例如。RoleAdmin ,RoleRegular,RoleOfficeDirector类似这样的事情:
public interface IRoleHandler<T>
{
string handleRole(T obj);
}
public class RoleAdmin:IRoleHandler<Employee>
{
public string handleRole(Employee emp)
{
if (emp.Positions.Count == 1 && emp.Positions[0] == "Admin")
{
//return some string query
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后想法是创建dictionary,像这样:
Dictionary<string, IRoleHandler<Employee>> strategyHandlers = new Dictionary<string, IRoleHandler<Employee>>();
strategyHandlers.Add("Admin", new RoleAdmin());
strategyHandlers.Add("Regular", new RoleRegularUser());
Run Code Online (Sandbox Code Playgroud)
我不认为策略模式是你想要的。我只是重构您的代码以将其提取ifs到另一种方法。
public List<Phone> GetListOfPhones(Employee emp)
{
List<Phone> records = new List<Phone>();
string query = BuildQueryByEmployeePosition(emp);
var rawItems = QuerySPList(query);
foreach (SPListItem item in rawItems)
{
//business logic
}
return records;
}
private string BuildQueryByEmployeePosition(Employee emp)
{
if (emp.Positions.Count == 1 && emp.Positions[0] == "Regular")
return "";// some querystring
if (emp.Positions.Count == 1 && emp.Positions[0] == "OfficeDirector")
return "";// some querystring
if (emp.Positions.Count == 1 && emp.Positions[0] == "Admin")
return "";// some querystring
if (emp.Positions.Count == 2 && emp.Positions.Contains("Regular") && emp.Positions.Contains("OfficeDirector"))
return "";// some querystring
return ""; // some default query
}
Run Code Online (Sandbox Code Playgroud)
这是策略模式的精彩解释的链接(带有排序算法的真实示例)。
很高兴看到您是编程新手并且正在研究模式,但要注意:在不需要它们时使用它们是一种反模式。