实现一个简单的外观来隐藏较低级别的解决方案。有一个数据模型:
public class OutControl
{
//---------Первая группа---------//
public const byte Call = 0x00;
public const byte Nop = 0x01;
public const byte Alarm = 0x02;
public const byte Warning = 0x03;
public const byte Nol = 0x04;
public const byte Action = 0x05;
public const byte Pull = 0x06;
//---------Вторая группа---------//
public const byte Push = 0x00;
public const byte Buzzer = 0x01;
public const byte Temp = 0x02;
public const byte Ring = 0x03;
public const byte SwitchOff = 0x04;
public const byte SwitchOn = 0x05;
public const byte Reverse = 0x06;
public const byte Reserve = 0x07;
//-------Опкоды для записи в определенный блок------//
public const byte FirstBlock = 0x06;
public const byte SecondBlock = 0x07;
}
问题是每个变量都属于一个特定的块。第一组(7 个变量)到 FirstBlock,第二组到 SecondBlock,操作码相同。我不明白你怎么能在块之间自动切换,这样以后,在 main 中,只需调用该方法:
static void Main(string[] args)
{
Facade facade = new Facade();
facade.SetData(Model.OutControl.Buzzer, true);
}
绕过块的安装。只向方法传递一个带有操作码的常量,以及一个用于设置标志的布尔变量:
public class Facade
{
private Model.OutControl _outs;
public Facade()
{
_outs = new Model.OutControl();
}
public void SetData(byte outs, bool action)
{
switch (как можно переключать?)
{
case ?:
_outs.Set(Model.OutControl.FirstBlock, outs, action);
break;
case ?:
_outs.Set(Model.OutControl.SecondBlock, outs, action);
break;
}
}
}
作为一个直截了当的解决方案,迭代 if() 中的每个块,但在我看来,它可以更优雅地完成。例如,用多态替换?
我们有相同的 OOP,好吧,你到底是什么?:)
显然你需要某种分离。而这里最正确的做法是用枚举代替常量。
但目前尚不清楚这个工具是如何使用的。如果操作码只是从文件中读取,您需要确定它们属于哪个类别,并且操作码是相同的......好吧,抱歉 - 没有足够的信息可以分发。但是解释器以某种方式将它们分开。使用相同的标志。
如果你想对用户隐藏这个选择,那么你可以在不同的范围或不同的位网格中制作操作码。
例如,第一节的操作码在 1-10 范围内,第二节的操作码在 20-30 范围内。
在您的方法中,您会看到操作码在 20-30 范围内传递,并且您了解我们正在讨论第二部分。
没错,在代码中它看起来不直观......
另一个选项浮现在脑海中,不那么“狂野”:
您可以用字符串替换数字常量,并在类中存储一个字典
Dictionary<string,Typle<byte,byte>- 其中元组的第一个元素是操作码,第二个元素是节。您的方法将采用一个字符串,并且您已经可以在其中通过字典获取操作码。