Альтернатива if / else по комбинационной логике в C # - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над программой, которая использует систему сетки.Системе нужен метод, который работает с каждым элементом сетки на основе значения ее соседей 'elementType.В настоящее время я использую что-то вроде следующего:

enum ElementType{
    A,B
}

if (neighbourUp.elemType == ElementType.A && neighbourDown == ElementType.A){
    method1();
}

if (neighbourLeft == ElementType.A and current == ElementType.B){
    method2();
}

и так далее.Как вы можете видеть, с этим трудно справиться, когда количество типов увеличивается.В идеале я хотел бы использовать здесь полиморфизм, но я чувствую, что создание класса для каждой комбинации - это слишком много работы.Также могут быть случаи, когда метод для некоторых комбинаций один и тот же.

Я хотел бы получить несколько советов о том, как подойти к этому.Также ElementType должен быть расширяемым для размещения новых типов, которые могут быть добавлены позже.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

сохраняет оба значения в массиве с ключами и применяется к циклу для соседа, а затем к ElementType, затем вы можете сравнивать значения ключей до тех пор, пока элементы в массиве не будут.

0 голосов
/ 11 октября 2018

Я бы определил список правил, а затем ваш основной код просто зацикливался на всех ячейках, а затем вызывал правила, соответствующие ячейке.Затем вы можете относительно легко добавлять или удалять правила в будущем, не изменяя логику основного цикла.

Таким образом, вам нужен класс, представляющий правило, каждое правило указывает типы влево / вправо / вверх / вниз, которым оно соответствуетпротив и затем имеет метод, который вызывается в случае совпадения.Сделайте соответствующие поля обнуляемыми, чтобы вы могли указать, если вам все равно, какой тип соседа ...

class Rule
{ 
    public ElementType? Left { get; set; }
    public ElementType? Right { get; set; }
    public ElementType? Top { get; set; }
    public ElementType? Bottom { get; set; }
    public Action Process { get; set; }
}

... на практике вашему «процессу» потребуется хотя бы один параметр, ссылка наячейка, которая обрабатывается.Таким образом, вы можете изменить его на Action или как угодно.

0 голосов
/ 11 октября 2018

Вы можете использовать Шаблон разработки стратегии , который подходит под Поведенческие образцы , чтобы избежать выполнения кодовой базы в условиях, которые вы можете использовать.эти ссылки, чтобы узнать больше о шаблонах разработки стратегии

  1. https://www.dofactory.com/net/strategy-design-pattern

  2. https://www.youtube.com/watch?v=v9ejT8FO-7I

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...