这是一个关于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();
}
}
我能想到的最接近的事情是使用布尔标志并在每个函数中检查它们以确保已经调用了必备函数,但我想我希望有更好的方法。
答案 0 :(得分:2)
这是我在寻找答案时找到的方法。这很简单,有帮助,但不会解决我的问题。
本质上,类是在问题中创建的,但是依赖函数被创建为受保护的,并且创建了一个公共成员以保持它们的顺序如下:
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(),但它们更容易管理,模块化程度更高。
答案 1 :(得分:1)
我认为问题与RemoteTool类的contract需要一些先决条件这一事实有关。例如:方法b()必须在方法a()之后执行()。
如果您的语言没有提供定义这些前提条件的机制,您需要自己实施。
我同意你的意见,要实现这个额外的功能(或这些特定的类合同功能) RemoteTool()类内部可能会降低您当前的设计。一个简单的解决方案可能是使用另一个类,负责在调用RemoteClass的特定方法之前强制执行所需的前提条件。(RemoteToolProxy()可以是一个合适的名称)
通过这种方式,您将解除具体功能和说明如何使用它的合同。
软件设计方法提供了其他替代方案Design by Contract 这可以为你提供其他方法来改善你的合同。