Примеры функциональных или динамических методов, которые могут заменить объектно-ориентированные шаблоны проектирования
Это несколько связано с Заменяет ли функциональное программирование шаблоны дизайна GoF?
С момента появления лямбда и динамики в С# существуют ли какие-либо стандартные шаблоны проектирования, которые можно считать устаревшими или решенными каким-либо другим способом с использованием lambdas или других языковых функций?
Например, динамические функции С# теперь могут использоваться для выполнения нескольких методов.
http://achoiusa.wordpress.com/2009/08/27/exploring-c-4-0-multimethods/
(Я думаю, что у Марка Гравелла было какое-то сообщение об этом?)
Лично я склонен делать фабрики, используя Func of T nowdays.
например.
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(...);
У кого-нибудь есть другие примеры?
[Изменить]
Конечно, шаблоны не устаревают сами по себе, но некоторые шаблоны являются специфическими для парадигмы, и поэтому, поскольку С# теперь является мультипарадигмой, некоторые функциональные свойства С# могут сделать некоторые из рисунков ООП менее привлекательными.
Ответы
Ответ 1
Образцы дизайна не устаревают только потому, что развивается один язык. Шаблоны обычно являются языковыми-агностиками.
В некотором смысле вы могли бы сказать, что .NET сделал шаблон Observer устаревшим уже в .NET 1.0. Однако это не совсем корректно, потому что шаблон не устарел. Структура просто предоставляет стандартную реализацию шаблона, что означает, что вы редко должны реализовывать его самостоятельно.
В том же смысле вы можете сказать, что делегаты - это просто анонимные интерфейсы, поэтому Func<T>
является Аннотация Factory.
Шаблоны не исчезают только потому, что язык предоставляет идиоматическую поддержку для них.
Ответ 2
Примеры некоторых шаблонов, которые предоставляются как часть .net или С#, которые явно не реализованы программистом. Я предоставляю ответ в отношении .net в целом и не специфичен для С#
- Итерационные шаблоны: с помощью разработчика List < > или Collection < > разработчик получает реализацию IEnumerable по умолчанию. Таким образом, явная реализация не требуется. Но, сказав это, есть кто-то (в данном случае,.net framework), который реализует шаблон для разработчика.
OOAD Шаблоны проектирования не устаревают, но разработчик не должен знать реализацию для использования таких шаблонов.
-
Object.Clone() - еще один пример - прототипирование. Разработчик должен просто реализовать мелкую или глубокую копию на основе этого требования. Но .net framework гарантирует поддержку шаблона прототипа.
-
Decorator - с помощью XAML вы можете украсить элемент пользовательского интерфейса с дополнительными обязанностями. Текстовое поле может быть украшено цветом, шириной и т.д.
-
Туннелирование и барботирование событий - пример шаблона Chain или ответственности
-
События - это граждане первого класса в .net, и их не нужно внедрять с нуля. Это пример шаблона Observer, который программист может использовать без реализации с нуля.
Ответ 3
У вас есть шаблон посетителя, как описано в этом ответе:
Наследование и класс обслуживания
Ответ 4
Конечно, очевидным будет шаблон стратегии, который также может быть выполнен с помощью функции более высокого порядка.