Chr*_*ris 4 c# design-patterns
我写了这组代码,觉得质量很差.正如您所看到的,在四个案例陈述中的每一个中,我最终重复了大量相同的代码,除了每种情况下的一些变化.不同的项目; 会话名称,网格名称和ManagerContext组名称.任何人都可以把这些混乱的代码带给我一个更好的方法吗?
private void LoadGroup(string option)
{
switch (option.ToUpper())
{
case "ALPHA":
VList<T> alphaList = FetchInformation(
ManagerContext.Current.Group1);
if (Session["alphaGroup"] != null)
{
List<T> tempList = (List<T>)Session["alphaGroup"];
alphaList.AddRange(tempList);
}
uxAlphaGrid.DataSource = alphaList;
uxAlphaGrid.DataBind();
break;
case "BRAVO":
VList<T> bravoList = FetchInformation(
ManagerContext.Current.Group2);
if (Session["bravoGroup"] != null)
{
List<T> tempList = (List<T>)Session["bravoGroup"];
bravoList.AddRange(tempList);
}
uxBravoGrid.DataSource = bravoList;
uxBravoGrid.DataBind();
break;
case "CHARLIE":
VList<T> charlieList = FetchInformation(
ManagerContext.Current.Group3);
if (Session["charlieGroup"] != null)
{
List<T> tempList = (List<T>)Session["charlieGroup"];
charlieList.AddRange(tempList);
}
uxCharlieGrid.DataSource = charlieList;
uxCharlieGrid.DataBind();
break;
case "DELTA":
VList<T> deltaList = FetchInformation(
ManagerContext.Current.Group4);
if (Session["deltaGroup"] != null)
{
List<T> tempList = (List<T>)Session["deltaGroup"];
deltaList.AddRange(tempList);
}
uxDeltaGrid.DataSource = deltaList;
uxDeltaGrid.DataBind();
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
Cad*_*oux 23
您应该能够将案例的各个部分提取到参数化的辅助函数:
function helper(grp, grpname, dg) {
VList<T> theList = FetchInformation(grp);
if (Session[grpname] != null)
{
List<T> tempList = (List<T>)Session[grpname];
theList.AddRange(tempList);
}
dg.DataSource = theList;
dg.DataBind();
}
private void LoadGroup(string option)
{
switch (option.ToUpper())
{
case "ALPHA":
helper(ManagerContext.Current.Group1, "alphaGroup", uxAlphaGrid);
break;
case "BRAVO":
helper(ManagerContext.Current.Group2, "bravoGroup", uxBravoGrid);
break;
case "CHARLIE":
helper(ManagerContext.Current.Group3, "charlieGroup", uxCharlieGrid);
break;
case "DELTA":
helper(ManagerContext.Current.Group4, "deltaGroup", uxDeltaGrid);
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个选项,还有进一步的重构,我敢肯定.
对于更深层次的重构,我会使用一组选项对象,可能是委托或类似的来查看表驱动.这种方式的工作方式是该选项将成为一个对象而不是一个字符串,该选项将具有配置它的属性和调用适当委托的方法.它实际上取决于你想要维护的抽象级别.有时,从常规控件继承并在子类中提供配置信息以便他们知道如何加载自身是值得的.
这里没有足够的空间来真正进入重构的深度.
jas*_*son 15
我更喜欢这样的东西:
private void LoadGroup(string option) {
Group group = GetGroup(option);
string groupName = GetGroupName(option);
Grid grid = GetGrid(option);
BindGroup(group, groupName, grid);
}
Group GetGroup(string option) {
// ideally this should be defined and initialized elsewhere
var dictionary = new Dictionary<string, Group>() {
{ "ALPHA", ManagerContext.Current.Group1 },
{ "BETA", ManagerContext.Current.Group2 },
{ "CHARLIE", ManagerContext.Current.Group3 },
{ "DELTA", ManagerContext.Current.Group4 }
};
return dictionary[option.ToUpperInvariant()];
}
string GetGroupName(string option) {
return option.ToLowerInvariant() + "Group";
}
Grid GetGrid(string option) {
// ideally this should be defined and initialized elsewhere
var dictionary = new Dictionary<string, Grid>() {
{ "ALPHA", uxAlphaGrid },
{ "BETA", uxBetaGrid },
{ "CHARLIE", uxCharlieGrid },
{ "DELTA", uxDeltaGrid }
};
return dictionary[option.ToUpperInvariant()];
}
void BindGroup(Group group, string groupName, Grid grid) {
VList<T> groupList = FetchInformation(group);
if (Session[groupName] != null) {
List<T> tempList = (List<T>)Session[groupName];
groupList.AddRange(tempList);
}
grid.DataSource = groupList;
grid.DataBind();
}
Run Code Online (Sandbox Code Playgroud)
现在看看我们如何与变化隔离开来.GetGroup例如,可以改变查找组的方式,如果需要更改组,我们不必担心找到查找组的所有位置.同样的GetGroupName和GetGrid.更重要的是,如果任何查找逻辑需要在任何地方重用,我们就不会重复自己.我们非常不受变化的影响,并且在这样考虑因素时永远不会重复.
请记住,这只是对您所展示内容的重构.根据您展示的内容,您可能需要考虑对整个方法进行更深入的重构.然而,这可能是不可行的.
所以:
private void LoadGroup(string option)
{
switch (option.ToUpper())
{
case "ALPHA":
BindData("alphaGroup", uxAlphaGrid, FetchInformation(ManagerContext.Current.Group1));
break;
case "BRAVO":
BindData("bravoGroup", uxBravoGrid, FetchInformation(ManagerContext.Current.Group2));
break;
case "CHARLIE":
BindData("charlieGroup", uxCharlieGrid, FetchInformation(ManagerContext.Current.Group3));
break;
case "DELTA":
BindData("deltaTeam", uxDeltaGrid, FetchInformation(ManagerContext.Current.Group4));
break;
default:
break;
}
}
private void BindData(string sessionName, GridView grid, VList<T> data) // I'm assuming GridView here; dunno the type, but it looks like they're shared
{
if (Session[sessionName] != null)
{
List<T> tempList = (List<T>)Session[sessionName];
data.AddRange(tempList);
}
grid.DataSource = data;
grid.DataBind();
}
Run Code Online (Sandbox Code Playgroud)