Примеры функциональных или динамических методов, которые могут заменить объектно-ориентированные шаблоны проектирования - PullRequest
13 голосов
/ 13 апреля 2011

Это в некоторой степени связано с Заменяет ли функциональное программирование шаблоны проектирования GoF?

С момента появления лямбда-выражений и динамики в C # существуют ли какие-либо стандартные шаблоны проектирования, которые можно было бы рассмотретьустарел или решен каким-либо другим способом с использованием лямбда-выражений или других языковых функций?

Например, динамические функции C # теперь можно использовать для выполнения нескольких методов.http://achoiusa.wordpress.com/2009/08/27/exploring-c-4-0-multimethods/ (я думаю, что у Марка Гравелла был какой-то пост об этом?)

Лично я склонен работать на фабриках с использованием Func of T в наши дни.

например

public static class SomeFactory
{
     public static Func<IUnitOfWork> GetUoW = 
       () => new EF4UoW(new SomeModelContainer());
}

// usage

var uow = SomeFactory.GetUoW();

// testabillity

var testUoW = new InMemUoW();
testUoW.Add(new Customer()...);

SomeFactory.GetUoW = () => testUoW;

// the service can get an UoW using the factory
var result = SomeDomainService.DoStuff(...); 

У кого-нибудь есть другие примеры?

[Редактировать] Конечно, шаблоны сами по себе не устаревают, но некоторые шаблоны специфичны для парадигмы и, следовательно, поскольку C # теперь является мульти парадигмой, некоторые из функциональных свойствC # может сделать некоторые из шаблонов ООП менее привлекательными.

Ответы [ 4 ]

8 голосов
/ 13 апреля 2011

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

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

В том же смысле можно сказать, что делегаты - это просто анонимные интерфейсы , поэтому Func<T> - это Абстрактная фабрика .

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

2 голосов
/ 13 апреля 2011

Примеры некоторых шаблонов, предоставляемых как часть .net или C #, которые явно не реализованы программистом. Я даю ответ в отношении .net в целом и не относится к C #

  1. Шаблоны итераторов. Используя List <> или Collection <>, разработчик получает реализацию IEnumerable по умолчанию. Таким образом, явная реализация не требуется. Но, сказав это, есть кто-то (в данном случае, .net framework), который реализует шаблон для разработчика.

Шаблоны OOAD Design не устаревают, но разработчику не нужно знать реализацию, чтобы использовать такие шаблоны.

  1. Object.Clone () - еще один пример - создание прототипа. Разработчик должен просто реализовать мелкое или глубокое копирование в зависимости от требований. Но .net Framework гарантирует поддержку шаблона прототипа.

  2. Декоратор - с XAML вы можете украсить элемент управления пользовательского интерфейса с дополнительными обязанностями. Текстовое поле может быть украшено цветом рамки, шириной и т. Д.

  3. Туннелирование и развитие событий является примером цепочки или схемы ответственности

  4. События являются первоклассными гражданами в .net и не должны быть реализованы с нуля. Это пример шаблона Observer, который программист может использовать, не внедряя его с нуля.

1 голос
/ 10 марта 2015

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

1 голос
/ 13 апреля 2011

У вас есть шаблон посетителя, как описано в этом ответе:

Класс наследования и обслуживания

...