[英]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.