根据SOLID编写JavaScript

时间:2011-01-17 09:54:12

标签: javascript solid-principles

在开发JavaScript时是否有人使用过SOLID编程原理(或任何部分)?

我刚开始阅读它,但似乎找不到任何人用它来JS。我发现易于实施/使用的唯一部分是“单一责任原则”。

我正在寻找的是使用这些原则的文章或示例。有没有争论为什么不应该使用某些部分呢?

例如,“接口隔离原则”表示“许多客户端特定接口优于一个通用接口的概念。”

但据我所知,JS中没有接口这样的东西(如果它会很好的话)。

5 个答案:

答案 0 :(得分:52)

看起来Derek Greer试图通过他在Fresh Brewed Code上的SOLID JavaScript系列文章对此进行了尝试:

  1. The Single Responsibility Principle
  2. The Open/Closed Principle
  3. The Liskov Substitution Principle
  4. The Interface Segregation Principle
  5. The Dependency Inversion Principle

答案 1 :(得分:13)

JavaScript有时候会像C ++,C#和Java那样低调,但实际上它是一种非常强大的函数式编程语言,也具有面向对象的功能(尽管它并没有真正归类为面向对象的)

也许很多开发人员都会瞧不起它,因为很多开发人员习惯于看到糟糕的编程实践,因此也会看到JavaScript中的错误行为。由于某种未知的原因,在客户端看起来更加可以接受。这是我想改变的。

我相信这些SOLID原则是可靠的。 (没有双关语)。如果遵循这些惯例,您将不太可能积累由草率代码,快捷方式和架构创建的技术债务。您的代码将更易于维护,更可重用,更模块化,耦合更少,可扩展和可扩展。当您的产品被设计而不是只是肆无忌惮地打击时,您还将有助于展示JavaScript的全部功能。

本文档介绍了SOLID的基础知识。无论您是指C ++,Java,JavaScript还是任何其他面向对象的语言,都适用相同的规则。

http://www.codeproject.com/Articles/60845/The-S-O-L-I-D-Object-Oriented-Programming-OOP-Prin.aspx

以下是有关JavaScript概念的更多信息:http://www.colourcoding.net/blog/Tags/SOLID%20Principles/default.aspx

答案 2 :(得分:4)

这个被接受的答案是有缺陷的。我建议阅读下面由Ryan Rensford链接的五篇文章。 last article得出以下结论,我没有透露(我强调):

  

在我们的考试过程中,我们看到SOLID设计原则如何适用于JavaScript而不是其他语言,在JavaScript开发中,每个原则都显示具有一定程度的适用性。 / p>

SOLID适用于面向对象的编程。 JavaScript是一种基于原型的语言,但允许以OOP方式编程(如果你真的很努力的话)。许多人认为你不应该试图强迫你学习的语言范例(如C ++ / C#/ Java)到其他人(JavaScript)。这是一篇关于OOP in JS的文章,该文章也得出了这个结论。

Prototype.js,CoffeeScriptJohn Resigs Simple JavaScript Inheritance中有一些OOP方法(每个方法都有自己的陷阱)。

但是SOLID的术语(接口,抽象)很难以适当的方式应用于vanilla JavaScript。您将能够应用“S”,也许是“L”(这是很好的概念)。但进一步需要构造类似接口(无论如何在动态语言中很难找到,合同可能有效)以及限制继承/修改的能力。

答案 3 :(得分:2)

此演示文稿:Derick Bailey的SOLID JavaScript In A Wobbly (World Wide Web)演示了如何在开发javascript时使用SOLID编程原理。

他多次明确地解决了javascript中的接口问题。在javascript中,接口更像是一种约定,因此由您决定如何定义它们。您可以编写一个空对象定义(将其视为抽象类或接口)。或者您可以依赖文档来获取协议/合同。

在更概念的层面上,对象的方法签名隐式地定义了它的接口,因此在javascript中你经常可以通过“duck-typing”来完成并仍然遵循SOLID。 (!)以下是演示文稿中“界面隔离原则”的示例:

// Copyright 2014 Muted Solutions, LLC, and freely distributable and re-usable under the MIT License

// JavaScript has no interface construct ...
// sooooooo..... use inheritance instead? o_O

// Rectangle
// ---------

function Rectangle(){}

Rectangle.prototype.area = function(){
  return this.height * this.width;
};

Rectangle.prototype.setHeight = function(height){
  this.height = height;
};

Rectangle.prototype.setWidth = function(width){
  this.width = width;
};

// Square
// ------

function Square(){}

Square.prototype.area = function(){
  return this.size * this.size;
};

Square.prototype.setSize = function(size){
  this.height = size;
  this.width = size;
};

此代码以及来自演讲的所有其余示例代码都发布在GitHub上:https://github.com/derickbailey/solid-javascript

答案 4 :(得分:0)

大多数SOLID主体都依赖于抽象,在其他语言(如Java)中,我们可以通过使用接口进行抽象,而Javascript没有接口,这是否意味着我们无法实现SOLID原则JavaScript的? 答案是不。 这是一篇很好的文章来澄清事情。

  

http://www.yusufaytas.com/achieving-abstraction-in-javascript/

     

因此,JavaScript是一种弱类型语言,并且没有经典的抽象支持。我们试图通过定义接口并使用它们来实现JavaScript中的抽象。然而,接口根本不会影响我们的代码。它们只不过是一种记录人类代码的方式。即使我们完全删除了接口,我们上面显示的所有示例都将完全相同。但是,它是关于使角色明确。这提高了代码的可读性,可理解性和可维护性。

一般而言,SOLID原则的主要目标是使代码可读且易于修改,将SOLID应用于代码就是尽量不重复自己并使代码更好更清洁。