我的应用程序使用连接到PC的测量仪器。我希望能够使用来自不同供应商的类似工具。
所以我定义了一个接口:
interface IMeasurementInterface
{
void Initialize();
void Close();
}到目前一切尚好。在测量之前,我需要设置仪器,这意味着对于不同的仪器,参数是非常不同的。所以我想定义一个接受参数的方法,它可以有不同的结构:
interface IMeasurementInterface
{
void Initialize();
void Close();
void Setup(object Parameters);
}然后,我会将对象强制转换为我需要的任何对象。这是要走的路吗?
发布于 2008-10-26 16:27:15
你最好想出一个抽象的“参数”类,这个类由每个不同的仪器参数扩展……例如,然后使用泛型来确保将正确的参数传递给正确的类……
public interface IMeasurement<PARAMTYPE> where PARAMTYPE : Parameters
{
void Init();
void Close();
void Setup(PARAMTYPE p);
}
public abstract class Parameters
{
}然后对于每个特定的设备,
public class DeviceOne : IMeasurement<ParametersForDeviceOne>
{
public void Init() { }
public void Close() { }
public void Setup(ParametersForDeviceOne p) { }
}
public class ParametersForDeviceOne : Parameters
{
}发布于 2008-10-26 16:50:42
对我来说,Factory模式听起来可能很有用,特别是如果你要对你的应用程序进行单元测试。
发布于 2008-10-27 06:26:29
如果您要处理多个设备类型,那么控制器+设备接口分离将是一个很好的解决方案。
解耦
使用名称值对允许您将代码分离到设备+控制器+应用程序代码结构中
示例代码
class DeviceInterface
{
void Initialize(IController & Controller);
void Close();
bool ChangeParameter(const string & Name, const string & Value);
bool GetParam(string & Name, string &Value );
}每个设备实现在创建时都应该使用控制器的标识来创建,该控制器可以接受其命令并将其转换为实际的设备命令
interface IController
{
Initialize(DeviceSpecific & Params);
Close();
bool ChangeParameter(string & Name, string & Value);
bool ChangeParams(string & Name[], string &Value []);
}您的用户代码将如下所示
IController objController = new MeasurementDevice(MeasureParram);
DeviceInterface MeasureDevice = new DeviceInterface(objController);
string Value;
MeasureDevice.GetParam("Temperature", Value);
if (ConvertStringToInt(Value) > 80)
{
MeasureDevice.ChangeParameter("Shutdown", "True");
RaiseAlert();
}DeviceInterface类所要做的就是将命令传递给控制器。控制器应负责设备通信。
接口分离的优势
防止更改
这种类型的解耦将允许您将应用程序代码与控制器隔离。设备中的更改不会影响用户代码
应用程序代码的可维护性
此外,用户代码始终是干净的,您只需要处理应用程序逻辑。但是,如果您定义了多个接口/创建了具有多种类型的特定于控制器的参数结构的模板或泛型,那么您的代码中将包含大量与设备相关的垃圾,这可能会损害可读性,并在设备/其参数更改时产生维护问题。
实现简化
您还可以将不同的控制器实现划分到自己的项目中。此外,您的应用程序还可以使用XML文件等在更动态的环境中配置命令和响应,这些文件可以与控制器类一起提供,这样整个应用程序本质上就会变得更加动态。
真实生活
来自该领域领导者的最新生产控制器项目之一也以同样的方式工作。但他们使用LON进行设备通信。
LON ?
控制器(比如空调/锅炉/风扇等)中使用的LON协议网络使用此概念与各种设备通信
因此,您需要的只是一个接口,该接口可以与您的设备通信,然后使用LON将名称值对发送到设备。使用标准协议还允许您与测量仪器以外的其他设备进行通信。如果您的设备使用LON,则可以使用LON的开源实现。
如果你的设备不支持LON,那么你可能不得不设计一些东西,用户代码仍然在名称值对上工作,而相反的接口将你的名称值对翻译成一个等价的对应控制器struct+,并以设备能够理解的方式与个体设备通信。
希望这能对你有所帮助。
https://stackoverflow.com/questions/238184
复制相似问题