使用Java设计模式的重要性,NodeJs等


36

随着Javascript在未来几年内将成为Web上无处不在的编程语言,每隔五分钟就会弹出新的框架,并且事件驱动的编程在服务器端和客户端均处于领先地位:

作为Java语言开发人员,您是否认为传统设计模式比其他语言/环境重要或重要?

请命名您作为Javascript开发人员经常使用的前三种设计模式,并举例说明它们如何对您的Javascript开发有所帮助。


5
有人认为设计模式(尤其是GoF模式)是语言不足的迹象(请参阅此讨论)。由于JavaScript本质上是原型且具有功能,因此我想说另一套模式是适用的/有用的。

对回应非常感兴趣... +1提出问题:)
usoban 2011年

2
Stoyan Stefanov 撰写的《JavaScript Patterns》一书提供了大量关于可在JS中使用的模式的资源。它们中的许多是专门为JS而存在的,而不是针对任何其他语言而存在的。
IgorGanapolsky

Javascript有其自己的模式。除了Igor提到的那本书之外,还有Addy Osmani的Learning Javascript Design Patterns,这是免费的。
user16764 2012年

Answers:


23

作为Java语言开发人员,您是否认为传统设计模式比其他语言/环境重要或重要?

经典设计模式不适用于JavaScript。

适用的是编写模块化和功能性代码。

您应该混合使用构造函数和一流函数。

作为JavaScript开发人员,我个人致力于将JavaScript视为LISP,而不是Java。因此,尝试模拟monad和高级功能样式代码,而不是模拟经典的OOP代码。

请命名您作为Javascript开发人员经常使用的前三种设计模式,并举例说明它们如何对您的Javascript开发有所帮助。

同样,设计模式并没有真正应用那么多,但以下是三个重要的构造。

  1. 使用闭包
  2. 使用头等舱功能
  3. 在有或没有的情况下使用对象工厂 new

请留下某种背景,与使用传统设计模式进行相同类型的代码相比,我可以展示这些技术的示例。

让我们看一些经典的设计模式,以及如何在js中实现它们以及更适合js本身的替代模式:

观察者模式:

node.js这很简单events.EventEmitter。在jQuery$.fn.bind&& $.fn.trigger。在backbone这是Backbone.Events.triggerBackbone.Events.bind。这是日常代码中使用的非常常见的模式。

我从不停止思考,“嘿,我在这里使用观察者模式!”。不,这只是传递消息的低级方法或级联更改的方法。

例如,在主干中,所有MVC视图都绑定到models onchange事件,因此更改模型会将所有更改自动级联到视图。是的,这是一个功能强大的模式,但是它在事件驱动的编程中非常普遍,没有意识到到处都在使用它。

WebSocket协议中,我们有.on用来绑定on("message", ...事件的协议。同样,这是非常普遍的,但是它是流中的观察者,而不是基于经典OOP的观察者while (byte b = Stream.ReadNextByte())

这些都是Observer模式的强大功能。但这不是您使用的模式。这是该语言的简单部分。这只是代码。

纪念图案:

这只是JSON。它允许您序列化对象的状态,以便您可以撤消操作。

function SomeObject() {
    var internalState;

    this.toJSON = function() {
        return internalState;
    }

    this.set = function(data) {
        internalState = data;
    }

    this.restore = function(json) {
        internalState = JSON.parse(json);
    }
}

var o = new SomeObject();
o.set("foo"); // foo
var memento = JSON.stringify(o);
o.set("bar"); // bar
o.restore(memento);

在JavaScript中,我们本机支持纪念品的API。只需定义toJSON在任何对象上调用的方法即可。调用时JSON.stringify,它将在内部调用.toJSON对象以获取要序列化为JSON的真实数据。

这使您可以轻松制作代码快照。

再次,我没有意识到这是一种纪念品模式。这只是使用JSON序列化工具。

状态模式/策略模式:

您不需要状态模式。您具有一流的功能和动态类型。只需注入函数或动态更改属性。


雷诺斯,好的回答。至于示例,我在概念层面上进行了更多思考。例如:“观察者模式在情况上有所帮助……”

@Lewis选择一些您喜欢的设计模式,稍后我将尝试提出更合适的功能替代方案。
雷诺斯2011年

努力的方法和答案是出色的雷诺斯。谢谢。
刘易斯

@Lewis我尝试多看一些,但由于它们都是针对严格的经典OO语言而量身定制的,因此感到很困惑。如果还有其他特定的设计模式,请让我看看。
雷诺斯2011年

您忘记了原型模式
-aka

10

将此答案作为主观意见。

作为Java语言开发人员,您是否认为传统设计模式比其他语言/环境重要或重要?

如果您指的是传统的设计模式(例如Gang of Four),那么大多数技术都是与语言/平台无关的,例如“编程到接口,而不是实现”或“在类继承上具有重要的对象组成”,并且对JavaScript开发人员同样重要。

可能或不需要像其他语言一样或频繁地使用诸如创造,结构和行为等更具体的模式,因为语言功能会在很大程度上影响其使用。因此,某些语言(包括JavaScript)会根据其提供的功能或语法糖而拥有自己的设计模式。

总的来说,我会说传统设计模式与其他语言一样重要,但是JavaScript特定模式比传统模式更重要。

列出您作为JavaScript开发人员经常使用的前三种设计模式,并举例说明它们如何对您的JavaScript开发有所帮助

基本的JavaScript设计模式中,我主要使用以下模式

1.构造器模式(带有原型)

尤其是在编写node.js东西时在服务器端,因为它虽然缺乏本地封装,却非常适合编写模块。如果您在GitHub上浏览存储库,那么它在许多其他开发人员中也很流行,因此熟悉这种模式可以帮助您更好地理解其他代码。

2.显示模块模式

提供模块化的封装。

3.干式

尽管每个开发人员都应尽可能(不)尽可能地使用它,但这是特定于场景的。


谢谢!很好的答案,以及我希望得到的答复。尽管可以认为该问题是主观的,但类似的良好回答表明存在适当的答案。在“退出”之前,将等待更多响应。

2

在CS的设计课程中教授设计模式。它们不是必需的,但是如果您能找到类似的情况以找到经过深思熟虑的解决方案,那么它们确实很有用。

它还使程序员可以更轻松地进行通信。您也可以在模式方面与同事交谈。如果您在这里说我有我的观察者,那么这是怎么回事。

人们自然会想出自己可以适合设计模式的解决方案,但是设计模式有助于定义术语和标准思想,这将有所帮助。

这些模式没有什么超级引人注目的,最棒的是它们是可以反复使用的方式被规范和定义的想法。


1

您作为Javascript开发人员是否认为传统设计模式重要还是不重要

它们至关重要。

这是因为可重用解决方案的概念可以超越语言。-语法更改-实现更改-模式概念仍然存在。

任何语言的开发人员都可以通过学习模式而不是语法来学习高级JS。那些不知道这一点的人会错过。

请为您指定Java开发人员经常使用的前三种设计模式

有些模式会经常使用,有些人会反对这种模式。但是,很高兴知道它们,因为它们在高级JS中极为常见且功能强大。

1-命名空间-将代码包装在一个对象中。

var x =(function(){})();

2-ObjectConfiguration,类似工厂的模式。-将对象传递给函数,而不是一堆var。

var product = factory({});

3-回调功能。-传递一个函数作为参数,当任务完成时被调用。

函数longTask(function(){//完成后打电话给我});

就像我说的那样,有些人可能会争辩说,这些不是模式,但是它们非常常见且非常强大,应予提及,因为它们确实是解决常见问题的非常有用的可重用解决方案。这是设计模式的定义。

很好的问题。

希望能有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.