我应该重构此代码吗?

时间:2009-02-06 17:34:29

标签: c# asp.net refactoring

我正在修改现有网站上的控件。来自站点的所有控件都继承自形成基类。我需要隐藏母版页上的几个链接,所以我在我的控件上写了这个方法:

private void HideCartLink (bool visible)
{
  Control control1 = Page.Master.FindControl( "link1" );
  control1.Visible = visible;

  Control control2 = Page.Master.FindControl( "link2" );
  control2.Visible = visible;
}

然后我转向另一个控件,我不得不做同样的事情。所以我重构了我的代码并用这个修改了我的基类:

public void HideMasterPageControl (string controlName, bool visible)
{
    Control control = Page.Master.FindControl( controlName );
    control.Visible = visible;
}

并在我的控件上添加了此方法:

void CartLinkVisible(bool visible)
{
    ////hide cart link
    HideMasterPageControl("link1", visible);
    HideMasterPageControl("link2", visible);
}

现在我转向第三个控件并意识到我必须做同样的事情。

我是否应该再次重构我的代码,以便我的基类有一个方法可以明确知道隐藏哪些链接?或者我应该让我的基类通用,让我的控件决定隐藏什么?

我不确定这里的规则是什么......

2 个答案:

答案 0 :(得分:4)

如果我是诚实的,我会更倾向于将其颠倒过来。根据页面的标准,我会根据需要添加添加按钮/链接。这将为您提供更像工具栏的东西,实际上您可以使其可配置(或基于用户权限)每个页面上显示哪些按钮/链接。

这可以帮助您摆脱以什么为基础的隐藏位置,隐藏可能存在甚至不存在的内容。

当然,假设你做不到这一点,说实话,你可能是做坏事的最好的。关于最终实施,不要过于担心。只需几个控件就可以了,并且会因为过度复杂而使它变得更糟。

但您可能需要考虑Visitor pattern。这意味着您要实现一个“访问”所有给定控件上的链接的类,然后转到配置以查找是否应该隐藏它们。这将节省您对链接的控件名称进行硬编码,并允许该方法位于不知道实际控件的基类中。

答案 1 :(得分:1)

我有一个通用的基本方法,可以调用虚方法来获取隐藏和循环它们的链接列表。第二种方法的基本实现将包含最常见隐藏链接的列表。每个控件我都会覆盖添加或修改该列表的方法。

尽管如此,我必须同意Neil,如果你翻转逻辑并确定需要包含哪些链接以及哪些链接需要被排除,这似乎更好。