Какие шаблоны дизайна хорошо работают с лямбдами? - PullRequest
1 голос
/ 08 августа 2011

Какие шаблоны проектирования, по вашему мнению, хорошо работают с лямбда-выражениями / функциями?

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

В настоящее время лямбды активно используются в контейнерах IoC и DI (например, в фиктивных средах)

В этой области я вижу следующие паттерны GoF:

Moq использует шаблон Proxy с активным использованием лямбд; например:

var mock = new Mock<IFoo>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);

Вы можете обнаружить, что лямбда-выражения помогают реализовать шаблон Singleton в IoC контейнерах, например autofac , не ограничивая себя в тестируемости, как это делает обычный Singleton:

builder.Register(c => new MyClass()).SingleInstance();

И Factory Method шаблон путем доказательства вызова конструктора с параметрами в качестве регистрации типа:

builder
    .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
    .As<IObjectContainer>()
    .Named("CustomerObjectContainer");

Также

Expression <TDelegate> класс также тесно связан с Interpreter узором

1 голос
/ 08 августа 2011

Есть несколько ситуаций, когда я вижу, что они использовали справедливый бит:

С одной стороны, они отлично подходят для высокоуровневой итерации по коллекциям.Часто нам просто нужно применить какое-то преобразование к списку, дереву или чему-то еще.Использование лямбда-кода делает простой и компактный код для обработки коллекций.Для случайного бесполезного примера (в C # с использованием LINQ):

var list = new List<int>();
//...
list.Where(x => x < 10).Aggregate( (current, total) => total + current * current );

Без лямбда-кодов этот тип был бы ужасно и излишне велик.

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

Последний шаблон дизайна приходит к вам из JavaScript.Я не уверен, применимо ли это к лямбдам в целом, так как я не знаю, являются ли замыкания обязательным компонентом лямбд.Но так как многие языки позволяют лямбдам закрывать переменные, я все равно упомяну об этом.

Как вы можете знать или не знать, JavaScript способен к объектно-ориентированному проектированию посредством наследования на основе прототипов.Но один недостаток заключается в том, что он не имеет понятия абстракции данных.Однако недавно было обнаружено, что лямбды могут фактически использоваться для обеспечения абстракции данных.Используя замыкания анонимных функций (которые на самом деле являются лямбдами), мы можем выполнить это:

function Rectangle(width, height) {
    this.getWidth = function() { return width; }
    this.getHeight = function() { return height; }
}

Поскольку замыкания, определяемые getWidth и getHeight, включают параметры width и heightпараметры все еще можно использовать из методов.Но они нигде не поддерживаются, поэтому никакой другой код не имеет к ним доступа после выхода из конструктора Rectangle.Таким образом, width и height теперь являются частными для Rectangle и доступны только через предоставляемые методы доступа.

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

0 голосов
/ 27 марта 2013

Монадические паттерны полностью основаны на лямбдах и могут быть реализованы только при использовании лямбда-паттернов.Объяснение монад в C #: http://ericlippert.com/category/monads/

Монад в C ++: http://bartoszmilewski.com/2011/07/11/monads-in-c/

Python: http://www.valuedlessons.com/2008/01/monads-in-python-with-nice-syntax.html

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