I decided to share with you an interesting approach which I constantly use
to replace switch statement in a nice and readable way. Colloquially speaking, it is called an action selector.
Without further ado, here’s an example. I think that code is self explanatory.
Example is a fiction with an abstract problem, which car buying decision you should make.
Very simple Car entity
public class Car { public int Age { get; set; } public decimal Price { get; set; } }
Action selector itself
public class ActionSelector { private readonly Dictionary<Func<Car, bool>, CarBuyDecision> _actionSelector; public ActionSelector() { _actionSelector = new Dictionary<Func<Car, bool>, CarBuyDecision> { {ShouldBuyACar, CarBuyDecision.BuyACar}, {ShouldAskForBetterPrice, CarBuyDecision.AskForBetterPrice}, {ShouldCollectSomeMoreMoney, CarBuyDecision.ShouldCollectMoreMoney} }; } private bool ShouldAskForBetterPrice(Car car) => car.Price > 20000m && car.Price < 25000m && car.Age < 12; private bool ShouldBuyACar(Car car) => car.Age < 10 && car.Price <= 20000m; private bool ShouldCollectSomeMoreMoney(Car car) => true; public CarBuyDecision PerformAction(Car car) { foreach (var key in _actionSelector.Keys) if (key.Invoke(car)) return _actionSelector[key]; return CarBuyDecision.NoDecision; } }
Action selector is:
- easlily extensible with another, even very complex conditions and actions
- fancy
- allowing code developer to explain the code flow