这种设计模式(扩展视图助手)是否可以接受?

时间:2014-11-18 19:48:16

标签: c# asp.net-mvc

负责用户输入并将其发送回模型的类(ViewHelper)越来越大,我想创建一个继承ViewHeper类的扩展类(ExtendedViewHelper)。问题是我不知道它是否遵循纯粹的OO设计。这是一个类图: Class Diagram

现在有些代码可以进一步简化它:

//ViewHelper class
public ViewHelper(View tempForm)
{
 xForm = tempForm;
 //some more code
}

//ExtendedViewHelper class
public ExtendedViewHelper(View yForm): base(xForm)
{
   //some more code 
}

//And the View
public View()
{
  //Instantiating the object to ExtendedViewHelper
  viewHelper = new ExtendedViewHelper(this);
  //Calling method from class ViewHelper
  viewHelper.OnButtonClicked();
  //and from ExtendedViewHelper
  ((ExtendedViewHelper)viewHelper).OnSecondBtnClicked();
}

你会说这是一个很好的解决问题的方法(如果它甚至被认为是一个问题),还是我过度工程?是否有更好的解决方案,或者我应该只使用Viewhelper(约700行代码)?

1 个答案:

答案 0 :(得分:2)

最佳解决方案是创建最少量耦合和最简单的类。

您的视图目前取决于它的ViewHelper。这是可以接受的。

但是,如果你的View将某些东西作为ExtendedViewHelper进行转换,那么它会耦合到两个对象,这可能会给系统带来两个改变的原因以及两个可以破坏的地方。这违反了单一责任原则。

View的一个角色应该是展示东西。它不应该关注系统功能的存在位置或如何处理命令。

ViewHelper也应该有一个角色。它应该充当从视图到控制器/服务/功能层的中介。 ViewHelper永远不应该有关于如何执行任何操作的实现细节。

所以更好的解决方案如下:

public View()
{
  //Instantiating the object to ExtendedViewHelper
  viewHelper = new ExtendedViewHelper(this);
  //Calling method from class ViewHelper
  viewHelper.OnButtonClicked();
  //and from ExtendedViewHelper
  viewHelper.OnSecondBtnClicked();
}

//OldViewHelper Constructor
public ViewHelper(View tempForm, OldFunctionalityService oldService)
{
     xForm = tempForm;
     xService = oldService;
}

//First Button Implementation Code
public void OnButtonClicked()
{
    xService.DoStuff();
}

//NewViewHelper Constructor
public ViewHelper(View tempForm, OldFunctionalityService oldService, NewFunctionalityService newService)
{
     xForm = tempForm;
     xService = oldService;
     xNewService = newService;
}

//Second Button Implementation Code
public void OnSecondBtnClicked()
{
    xNewService.DoStuff();
}