负责用户输入并将其发送回模型的类(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行代码)?
答案 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();
}