繁体   English   中英

OOP,强制方法调用顺序

[英]OOP, enforcing method call order

题:

这是有关OOP实践的问题。 我在使用API​​时遇到了一种情况,其中需要按特定的顺序调用一系列方法。

案件:

控制智能传感器的操作。

交互的简化版本是这样的:首先必须将API配置为通过TCP与传感器连接,然后下一条命令开始扫描过程,然后接收多个项目的输入,直到给出停止命令为止。 那时必须给出一系列类似的断开命令。 如果这些命令无序执行,则会引发异常。

我在这里看到了模块化和封装概念之间的冲突。 每个步骤都是离散操作,因此应封装在单独的方法中,但它们也取决于正确的执行顺序。

我是从后来开发此代码的开发人员的角度考虑的。 似乎有些人必须对此系统有较高的了解,然后才能使用此代码,这会使它感到脆弱。 我可以添加有关此呼叫顺序的警告注释,但我希望有一些适合我情况的原理或设计模式。

这是一个例子:

class RemoteTool
{
    public void Config();
    public void StartProcess();
    public void BeginListen();

    public void StopProcess();
    public void StopListening();
}

class Program
{
    static void Main(string[] args)
    {
        RemoteTool MyRemoteTool = new RemoteTool();

        MyRemoteTool.Config();
        MyRemoteTool.StartProcess();
        MyRemoteTool.BeginListen();

        // Do some stuff

        MyRemoteTool.StopListening();
        MyRemoteTool.StopProcess();
    }
}

我能想到的最接近的方法是使用布尔标志并在每个函数中检入它们,以确保先决条件函数已被调用,但我想我希望有一种更好的方法。

这是我在寻找答案时发现的一种方法。 这很简单,有帮助,但不能解决我的问题。

从本质上讲,该类是完全在问题中创建的,但是从属函数是按受保护的方式创建的,并且创建了一个公共成员以使其保持顺序,如下所示:

class RemoteTool
{
    public bool Running = false;
    public void Run()
    {
        Config();
        StartProcess();
        BeginListen();

        Running = true;
    }

    public void Stop() {
        StopListening();
        StopProcess();

        Running = false;
    }

    protected void Config();
    protected void StartProcess();
    protected void BeginListen();

    protected void StopProcess();
    protected void StopListening();
}

问题在于您仍然必须以正确的顺序调用Stop()和Run(),但是它们更易于管理并且模块化程度更高。

我认为问题与RemoteTool类具有需要某些前提条件的合同有关。 例如:方法b()必须在方法a()之后执行()。

如果您的语言没有提供定义此类前提条件的机制,则您需要自己实现。

我同意您的观点,即在RemoteTool()类中实现此额外功能(或这些特定的类合同功能)可能会降低当前的设计水平。 一个简单的解决方案是使用另一个类,该类负责在调用RemoteClass的特定方法之前强制执行所需的前提条件。(RemoteToolProxy()可以是一个合适的名称)

这样,您将使具体功能与说明如何使用它的契约脱钩。

软件设计方法还提供了其他替代方法,称为按合同设计 ,可以为您提供改善类合同的其他方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM