Model view controller 是";被动的;被认为是良好设计实践的对象?

Model view controller 是";被动的;被认为是良好设计实践的对象?,model-view-controller,oop,architecture,Model View Controller,Oop,Architecture,我发现自己经常创建一个没有公共方法且自包含的对象。它通常在其私有方法中处理传递给构造函数的参数事件,并且不引发任何事件或公开任何公共方法 我将这种类型的对象称为“被动”对象——没有定义任何公共方法的对象。所有的交互都发生在构造函数中传递的私有方法和参数事件中 通常,它是一些实用程序类,例如确保两个表单粘在一起的实用程序类: public class StickyForm : IDisposable { private readonly Form form; private rea

我发现自己经常创建一个没有公共方法且自包含的对象。它通常在其私有方法中处理传递给构造函数的参数事件,并且不引发任何事件或公开任何公共方法

我将这种类型的对象称为“被动”对象——没有定义任何公共方法的对象。所有的交互都发生在构造函数中传递的私有方法和参数事件中

通常,它是一些实用程序类,例如确保两个表单粘在一起的实用程序类:

public class StickyForm : IDisposable
{
    private readonly Form form;
    private readonly Form parentForm;

    public StickyForm(Form form, Form parentForm)
    {
        this.form = form;
        this.form.StartPosition = FormStartPosition.Manual;
        this.parentForm = parentForm;

        this.parentForm.LocationChanged += new EventHandler(parent_LocationChanged);
        this.parentForm.SizeChanged += new EventHandler(parent_SizeChanged);

        SetLocation();
    }

    void parent_SizeChanged(object sender, EventArgs e)
    {
        SetLocation();
    }

    void parent_LocationChanged(object sender, EventArgs e)
    {
        SetLocation();
    }

    private void SetLocation()
    {
        //compute location of form based on parent form 
    }

    public void Dispose()
    {
        this.parentForm.SizeChanged -= parent_SizeChanged;
        this.parentForm.LocationChanged -= parent_LocationChanged;
    }
}
但有时它也是某种控制器,提供两个视图之间的交互:

public class BrowseController
{
    private IBrowserView view;
    private IFolderBrowser folderBrowser;

    public BrowseController(IFolderBrowser folderBrowser, IBrowserView view)
    {
        this.view = view;
        this.folderBrowser = folderBrowser;

        this.folderBrowser.NodeOpened += folderBrowser_NodeOpened;
    }

    private void folderBrowser_NodeOpened(object sender, Core.Util.TEventArgs<IPictureList> e)
    {
        this.Browse(e.Value);
    }

    public void Browse(IPictureList content)
    {
        //stripped some code
        AddItemsToView(content);
    }

    private void AddItemsToView(IPictureList browser)
    {
        //call methods on view
    }
}
公共类浏览器控制器
{
私人IBrowserView视图;
专用IFolderBrowser文件夹浏览器;
公共浏览器控制器(IFolderBrowser folderBrowser,IBrowserView视图)
{
this.view=视图;
this.folderBrowser=folderBrowser;
this.folderBrowser.NodeOpened+=folderBrowser\u NodeOpened;
}
私有void folderBrowser_nodepened(对象发送方,Core.Util.TEventArgs e)
{
浏览(e.Value);
}
公共作废浏览(IPictureList内容)
{
//删除了一些代码
AddItemsToView(内容);
}
专用void AddItemsToView(IPictureList浏览器)
{
//视图上的调用方法
}
}
这种“被动”物体是否被视为良好的设计实践


这种类有更好的名称吗?

我看不出有什么不对。如果它能产生干净、可读的代码,那就去做吧

我不会将响应通知并更新其状态的对象称为完全被动的对象

另一种想法是,如果对象只是调整它们的状态以反映外部世界的变化,而不提供它们自己的变化,那么您可以将它们的“功能”切片并将其放入其他更活跃的“组件”中。这些对象可能没有足够的理由存在


但是,如果这个组织使您的代码结构更好、更清晰、更易于维护,那么就使用它,不用担心它。

对我来说似乎是一个很好的设计。不过,我不确定这个名字。这些课程看起来确实相当活跃。他们对事件做出反应,做一些事情。我认为,如果必须调用类上的方法来让它做一些事情,那么类会更被动,但通常情况下,除非被戳,否则它不会做任何事情

“控制器”这个名字怎么样。“controller”是UI中使用的类的更常用名称,它会导致视图和数据之间的交互,并且它们通常不需要公共方法


我肯定还有其他关于名字的想法。

从概念上讲,这似乎是一种战略模式的实现。尽管在这种特殊情况下,推理不同于“策略模式”,但它仍然可以生成可读性很强、粒度很好的代码。去做吧

更新:为了更清楚我的意思,考虑两个(或更多)类源于<代码> StickyForm <代码> < /P>

public class VeryStickyForm : StickyForm
{
//some implementation here
//but interface is completely inherited from StickyForm
}
public class SomewhatStickyForm : StickyForm
{
//some implementation here
//but interface is completely inherited from StickyForm
}
您可以根据运行时状态动态决定使用哪一个。。。你实施一个战略。
正如我所说的,您的解决方案在概念上类似于策略:您选择应用程序的某些行为方面,这些方面可以很好地抽象为策略,并将策略的实现移动到单独的类中,这些类不知道应用程序的其余部分,并且您的应用程序也不太了解策略的细节。即使您不以多态方式使用它,但与策略的相似性是显而易见的。

我认为有一个重要的标准可以满足这种设计:您能测试它吗?您的设计似乎是可测试的,但您可能必须小心,因为我可以看到这会导致一些相当不稳定的代码


关于名称,我认为这可能是一个例子。

对不起,但我看不出这种方法有任何战略模式的迹象。你能详细说明一下吗?这绝对不是一个策略-1。只有一种形式的粘性是可能的2。算法不会在运行时切换。根据您的方法,我们可以将所有您可以(可能)的子类称为策略:)