Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此设计模式(扩展视图辅助对象)可接受吗?_C#_Asp.net Mvc - Fatal编程技术网

C# 此设计模式(扩展视图辅助对象)可接受吗?

C# 此设计模式(扩展视图辅助对象)可接受吗?,c#,asp.net-mvc,C#,Asp.net Mvc,负责用户输入并将其发送回模型的类(ViewHelper)越来越大,我想创建一个继承ViewHeper类的扩展类(ExtendedViewHelper)。问题是,我不知道它是否遵循纯OO设计。下面是一个类图: 现在有一些代码可以进一步简化它: //ViewHelper class public ViewHelper(View tempForm) { xForm = tempForm; //some more code } //ExtendedViewHelper class public

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

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

//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行代码)?

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

您的视图当前依赖于它的ViewHelper。这是可以接受的

但是,如果您的视图将某个对象强制转换为ExtendedViewHelper,那么它将耦合到两个对象,这可能会给系统两个更改的原因和两个可能出现问题的地方。这违反了单一责任原则

视图的一个角色应该是显示内容。它不应该关心系统功能存在的位置或如何处理命令

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();
}

任何名为“ViewHelper”的类中可能已经有太多的内容(有数百行代码是另一个好指标)。你的“解决方案”根本不是。根据经验法则,你可能应该做的是将你的类分成5-10个不相互引用的类,因为它们可能不必相互引用。@Cubic“你的解决方案”中是否遗漏了一个词?所以这不是一个好的解决方案?我真的不喜欢有很多“有关系”的想法“在视图和帮助器类之间。但我可能错了。那么请告诉我。谢谢你的回答。实际上,我的控制器用作通信层,而ViewHelper执行所有事件处理程序和输入验证。如果我理解正确,我不应该强制转换为ExtendedViewHelper,而是将对象实例化为ExtendedViewHelper?我的视图只负责显示和创建属性。我非常喜欢服务层和功能层的概念。不幸的是,我从来没有实施过。你知道关于这个话题有什么好的网站吗?大部分都与架构相关。以下是我可以推荐的一些可能的资源:从我的学习方式来看,最重要的原则是可靠的。它们最适用于类级别,但也适用于组件级别,只是方式有所不同。