Звучит так, будто вы хотите, чтобы какой-то набор правил проверял элемент.Я думаю, что самая простая форма, чтобы сделать это более читабельным, это передать элемент, свойства правила и действие отдельному методу:
public bool RunActionIf(Item item, Shape shape, Color color, Material material, Action action)
{
if(item.ItemShape == shape && item.ItemColor == color && item.ItemMaterial == material)
{
action();
return true;
}
return false;
}
public void RunAction(Item item)
{
var result =
RunActionIf(item, Shape.square, Color.blue, Material.glass, Action1) ||
RunActionIf(item, Shape.square, Color.blue, Material.wood, Action2) ||
/* Implement your whole table like this */;
if(!result)
{
throw new ArgumentException("No matching rule found", nameof(item));
}
}
Основное преимущество этого метода состоит в том, что он корочеи с меньшими накладными расходами в декларации.Вы можете легко увидеть: форма X + цвет Y + материал Z = это действие.
Другое преимущество состоит в том, что легче реализовать определенные исключения, например, позволяя одному из параметров правила быть null
, чтобы указатьлюбой цвет, или использовать Color.any для поддержки этого, хотя я думаю, что путать any
в перечислении с другими цветами ... В любом случае, я отвлекся.Дело в том, что если вы хотите реализовать это, вы должны сделать это только в одном месте, не копируя его 16 раз.
Вы можете абстрагироваться от этого немного дальше, сделав такое правило отдельным объектом., который вы можете поместить в список или словарь, но для определения, подобного этому, это не делает , что намного более читабельным, хотя это добавляет некоторые преимущества тестируемости, а также возможностьдобавьте различные виды правил, не портя чистый список снова.