45

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

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

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

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

但是据我所知,JS 中没有接口之类的东西(如果可以的话,那就太好了)。

4

5 回答 5

67

看起来 Derek Greer 正试图在 Fresh Brewed Code 上发表关于 SOLID JavaScript 的系列文章:

  1. 单一职责原则
  2. 开放/封闭原则
  3. 里氏替换原则
  4. 接口隔离原则
  5. 依赖倒置原则
于 2011-12-16T16:59:12.117 回答
14

JavaScript 有时会因为不如 C++、C# 和 Java 等而受到批评,但实际上它是一种非常强大的函数式编程语言,也具有面向对象的功能(尽管它并未真正归类为面向对象)

也许许多开发人员看不起它,因为他们中的许多人习惯于看到糟糕的编程实践,从而导致 JavaScript 中的错误行为。由于某些未知的原因,在客户端马虎似乎更容易接受。这是我想改变的。

我相信这些 SOLID 原则是可靠的。(没有双关语的意思)。如果您遵循这些约定,您将不太可能积累由草率的代码、快捷方式和没有架构造成的技术债务。您的代码将更易于维护、更可重用、更模块化、更不紧密耦合以及可扩展和可扩展。当您的产品经过精心设计而不是鲁莽地拼凑在一起时,您还将为展示 JavaScript 的全部功能做出贡献。

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

代码项目 - SOLID 面向对象的编程原则

这是colourcoding.net 上有关 JavaScript 概念的更多信息。

于 2011-01-17T10:06:14.880 回答
4

这个公认的答案是有缺陷的。我建议阅读下面 Ryan Rensford 链接的五篇文章。上一篇文章得出了以下我未能传达的结论(我强调):

虽然在我们的检查过程中,我们看到 SOLID 设计原则如何应用于 JavaScript 而不是其他语言,但每个原则都显示出在 JavaScript 开发中具有一定程度的适用性。

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

在 Prototype.js、 CoffeeScriptJohn Resigs 简单 JavaScript 继承中有一些面向 OOP 的方法(每种方法都有自己的陷阱)。

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

于 2011-01-17T10:08:00.057 回答
2

本演示文稿:由 Derick Bailey撰写的 SOLID JavaScript In A Wobbly(万维网)演示了如何在开发 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

于 2015-01-25T23:00:31.503 回答
0

SOLID原理大部分都依赖于抽象,在Java等其他语言中,我们可以通过接口来进行抽象,而Javascript没有接口,那是不是意味着我们无法在Javascript中实现SOLID原理呢?答案是否定的。这是一篇澄清事情的好文章。

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

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

一般来说,SOLID 原则的主要目标是使代码可读且易于修改,将 SOLID 应用到您的代码就是尽量不重复自己,并使您的代码更好更干净。

于 2017-07-04T19:31:42.437 回答