C# 此设计模式(扩展视图辅助对象)可接受吗?
负责用户输入并将其发送回模型的类(ViewHelper)越来越大,我想创建一个继承ViewHeper类的扩展类(ExtendedViewHelper)。问题是,我不知道它是否遵循纯OO设计。下面是一个类图: 现在有一些代码可以进一步简化它: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 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?我的视图只负责显示和创建属性。我非常喜欢服务层和功能层的概念。不幸的是,我从来没有实施过。你知道关于这个话题有什么好的网站吗?大部分都与架构相关。以下是我可以推荐的一些可能的资源:从我的学习方式来看,最重要的原则是可靠的。它们最适用于类级别,但也适用于组件级别,只是方式有所不同。