【问题标题】:Examples of functional or dynamic techniques that can substitute for object oriented Design Patterns可以替代面向对象设计模式的功能或动态技术示例
【发布时间】:2011-08-04 12:08:32
【问题描述】:

这和Does functional programming replace GoF design patterns?有点关系

自从在 C# 中引入 lambda 和动态后,是否有任何标准设计模式可以被认为已过时或使用 lambda 或其他语言特性以其他方式解决?

例如,C# 的动态特性现在可以用来做多方法。 http://achoiusa.wordpress.com/2009/08/27/exploring-c-4-0-multimethods/ (我认为 Marc Gravell 有一些关于此的帖子?)

我个人现在倾向于使用 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# 的一些功能特性可能会降低一些 OOP 模式的吸引力。

【问题讨论】:

    标签: c# design-patterns dynamic lambda functional-programming


    【解决方案1】:

    设计模式不会因为单一语言的发展而过时。 模式通常与语言无关

    从某种意义上说,您可以说 .NET 使 Observer 模式在 .NET 1.0 中已经“过时”了。但是,这并不完全正确,因为 模式并没有过时 - 框架只是提供了该模式的默认实现,这意味着您很少需要自己实现它 .

    在同样的意义上你可以说delegates are just anonymous interfaces,所以Func&lt;T&gt;一个抽象工厂

    模式不会因为语言为它们提供惯用支持而消失。

    【讨论】:

    • >> "模式通常与语言无关" ,不完全是,OOP 和 FP 语言有不同的模式..
    • @Roger Alsing:OOP 和 FP 不是语言,而是范式。同意它们有不同的模式,但在一个范式中,模式通常与语言无关。
    • 是的,我只是想指出“语言不可知论”过于宽泛,“范式中的语言不可知论”在 IMO 中更为正确。因此,如果一个范式解决了另一个范式需要模式来解决的问题,那么人们可能会争辩说,在支持这两种范式的语言中不再需要该模式..
    【解决方案2】:

    作为 .net 或 C# 的一部分提供但程序员未明确实现的一些模式示例。我一般提供关于 .net 的答案,而不是特定于 C#

    1. 迭代器模式:通过使用 List 或 Collection,开发人员默认获取 IEnumerable 的实现。因此,不需要显式实现。但话虽如此,有人(在本例中为 .net 框架)正在为开发人员实现该模式。

    OOAD 设计模式不会过时,但开发人员无需了解实现即可使用此类模式。

    1. Object.Clone() 是另一个示例 - 原型设计。开发人员只需根据需求实现浅拷贝或深拷贝。但.net 框架保证支持原型模式。

    2. 装饰器 - 使用 XAML,您可以装饰具有额外职责的 UI 控件。文本框可以用边框颜色、宽度等进行装饰。

    3. 事件的隧道和冒泡是链或责任模式的一个示例

    4. 事件是 .net 中的一等公民,无需从头开始实施。这是一个观察者模式的例子,程序员无需从头实现即可使用。

    【讨论】:

      【解决方案3】:

      您拥有此答案中描述的访客模式:

      Inheritance and service class

      【讨论】:

        【解决方案4】:

        当然,最明显的就是策略模式,也可以用高阶函数来实现。

        【讨论】:

          猜你喜欢
          • 2010-11-29
          • 2011-04-12
          • 2010-12-25
          • 2016-01-31
          • 1970-01-01
          • 1970-01-01
          • 2013-12-09
          • 1970-01-01
          • 2013-04-02
          相关资源
          最近更新 更多