Реализую простой фасад для сокрытия более низкоуровневых решений. Есть модель данных:
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(), но сдается мне, что можно более элегантнее сделать. Например, заменить полиморфизмом?
interface IOperation
{
byte OpCode { get; }
byte BlockCode { get; }
}
class Operations
{
const byte FirstBlock = 0x06;
const byte SecondBlock = 0x07;
public readonly IOperation Call = new OperationImpl(0x00, FirstBlock);
public readonly IOperation Nop = new OperationImpl(0x01, FirstBlock);
...
public readonly IOperation Push = new OperationImpl(0x00, SecondBlock);
public readonly IOperation Buzzer = new OperationImpl(0x01, SecondBlock);
...
class OperationImpl : IOperation
{
public byte OpCode { get; }
public byte BlockCode { get; }
public OperationImpl(byte opCode, byte blockCode)
=> (OpCode, BlockCode) = (opCode, blockCode);
}
}
class Facade
{
...
public void SetData(IOperation operation, bool action)
=> _outs.Set(operation.OpCode, operation.BlockCode, action);
}
У нас же ООП, ну чего вы в самом деле? :)
Очевидно, что тебе необходимо какое-то разделение. И самым правильным способом здесь будет замена констант на Enum'ы.
//---------Первая группа---------//
enum First : byte
{
Call = 0x00,
Nop = 0x01,
Alarm = 0x02,
Warning = 0x03,
Nol = 0x04,
Action = 0x05,
Pull = 0x06,
}
//---------Вторая группа---------//
enum Second : byte
{
Push = 0x00,
Buzzer = 0x01,
Temp = 0x02,
Ring = 0x03,
SwitchOff = 0x04,
SwitchOn = 0x05,
Reverse = 0x06,
Reserve = 0x07
}
public void SetData(First outs, bool action)
{
_outs.Set(Model.OutControl.FirstBlock, (byte)outs, action);
}
public void SetData(Second outs, bool action)
{
_outs.Set(Model.OutControl.SecondBlock, (byte)outs, action);
}
Но пока непонятно - как этот инструмент используется. И если опкоды просто читаются из файла и нужно определить - к какой категории они онтосятся, а опкоды одинаковы... Ну, извините - недостаточно информации для распределения. Но ведь интерпретатор как-то их разделяет. Используй тот же признак.
Если хочется сделать этот выбор скрыто для пользователя, то можно сделать опкоды в разных диапазонах или в разной разрядной сетке.
Например, секция один имеет опкоды в диапазоне 1-10, а вторая в 20-30.
Внутри своего метода, видишь, что опкод был передан в диапазоне 20-30 и понимаешь, что речь идет о второй секции.
Правда, в коде- это будет смотреться не интуитивно понятно...
И еще в голову пришел 1 вариант, менее "дикий":
Можно заменить числовые константы на строки, а внутри класса хранить словарик Dictionary<string,Typle<byte,byte>
- где первый элемент кортежа- это опкод, а второй секция.
Твой метод будет принимать строку, а уже внутри ты через словарь можешь получить опкод.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется метод, который внутри себя запускает дважды другой метод, но второй раз асинхронноИ вот внутри Task не срабатывает SaveToDB()
Есть такая реализация: переходы три перехода между играми, когда мы перешли, срабатывает некий метод с корутиной в 3 секунды, но если очень...
В окно из бд загружаются данныеНо нужно сделать чтобы загрузилось не все сразу
Пишу аналог сайта Mnemonic Code Converter на C# Дошел до получения BIP32 Extended Private Key и BIP32 Extended Public KeyИспользую библиотеку NBitcoin