private Maybe <BowlOf <EggsMixture> > MakeEggsMixture() { /* * Выглядит чуть лучше и писать несколько удобнее. * Если бы было ветвление логики, то пришлось бы разбивать на куски и миксовать с вызовом методов-аналогов * Select/SelectOrElse/Do/DoOrElse из первой части задания. * * Основной же минус - мы работаем с IEnumerable и на выходе тоже IEnumerable, что как бы не очень: * - нарушается семантика кода. Мы должны работать в терминах монады Maybe, а не последовательностей * - кое-что еще. Что? Подсказка: проблема в работе с объектами как объектами некоторого интерфейса */ var result = from pumpkinPieFilling in _cookingTable.FindCansOf <PumpkingPieFilling>(1m).ToMaybe() from sugar in _cookingTable.FindCupsOf <WhiteSugar>(3m).ToMaybe() from oil in _cookingTable.FindCupsOf <VegetableOil>(0.5m).ToMaybe() from water in _cookingTable.FindCupsOf <Water>(0.5m).ToMaybe() from eggs in _cookingTable.FindSome <Egg>(4m).ToMaybe() from eggsMixture in _cookingTable.FindBowlAndFillItWith(new EggsMixture()).ToMaybe() select eggsMixture; // !!!: result имеет тип IEnumerable<BowlOf<EggsMixture>> // нужно явно вернуться из IEnumerable в Maybe - для этого и нужен соответствующий экстеншн. return(result.ToMaybe()); }
private Maybe <BowlOf <EggsMixture> > MakeEggsMixture() { // как видишь, так можно, но чет не очень удобно - получается огромная вложенная блямба селектов // и это у нас еще логика не ветвистая! return(_cookingTable.FindCansOf <PumpkingPieFilling>(1m).ToMaybe() .Select(pumpkinPieFilling => _cookingTable.FindCupsOf <WhiteSugar>(3m).ToMaybe() .Select(sugar => _cookingTable.FindCupsOf <VegetableOil>(0.5m).ToMaybe() .Select(oil => _cookingTable.FindCupsOf <Water>(0.5m).ToMaybe() .Select(water => _cookingTable.FindSome <Egg>(4m).ToMaybe() .Select(eggs => _cookingTable.FindBowlAndFillItWith(new EggsMixture()).ToMaybe() )))))); }
private Maybe <BowlOf <EggsMixture> > MakeEggsMixture() { /* * Теперь мы оперируем только объектами типа Maybe<T> - * больше никаких непонятных преобразований в IEnumerable и обратно :) */ return (from pumpkinPieFilling in _cookingTable.FindCansOf <PumpkingPieFilling>(1m).ToMaybe() from sugar in _cookingTable.FindCupsOf <WhiteSugar>(3m).ToMaybe() from oil in _cookingTable.FindCupsOf <VegetableOil>(0.5m).ToMaybe() from water in _cookingTable.FindCupsOf <Water>(0.5m).ToMaybe() from eggs in _cookingTable.FindSome <Egg>(4m).ToMaybe() from eggsMixture in _cookingTable.FindBowlAndFillItWith(new EggsMixture()).ToMaybe() select eggsMixture); }