我有一个DLL,它导出许多函数来获取或设置某些底层数据对象中的各种值。在某些情况下,DLL将通过注册的回调函数指针使用它向应用程序发出通知。然后,应用程序应通过DLL接口中的特定函数响应通知(尽管不是必须立即)。在收到响应之前,可以读取DLL中的数据对象,但不能写入。
DLL当然必须全局导出所有方法。但是如果已经发出通知,则所有setter功能都是禁止的。
在我的脑海中,我可以想到两个解决方案:我可以实现一个简单的基于标志的状态机制,并将每个setter包装在if语句中,检查此标志。或者我可以根据State模式实现这两种状态。
第一个解决方案应该很便宜,但要求所有开发人员记住在实现新的导出的setter函数时检查标志。如果在某些时候只读状态需要基于原始通知的某种类型的响应,它可能会变得丑陋。 第二种解决方案需要在两种状态下实现新的导出函数,这促使开发人员考虑函数在只读模式下的作用。但是大多数方法在两种状态下都会做同样的事情,其余的方法应该什么也不做,甚至抛出异常......
是否有更好的方法来实现类似的目标?
答案 0 :(得分:1)
这个怎么样:转到第二个解决方案,但不要复制你的功能,保持原样。相反,让它们全部委托给由两个类实现的接口:一个表示正常状态的行为,另一个表示只读状态。当您切换到只读状态时,使您正在使用的指针指向只读实现。如果您担心在两个类中复制状态,请使用包含所有公共数据而不是接口的抽象类。
另一种选择是指向成员函数的指针:不是使用多态调用,而是调用指向成员函数的指针。切换到只读模式时,更改所有指针,使它们指向只读模式成员函数。这样,您还可以避免在dll界面中复制函数。