class/namespace-based 代码组织与 JavaScript/Node.js 相关吗?

Is class/namespace-based code organization relevant in JavaScript/Node.js?

免责声明:我是Node.js新手。

有许多基于 class 的语言,您可以在其中 can/must 使用 命名空间 来组织代码,例如:Java , PHP, ActionScript 3… 对于其中的许多语言,如果您 choose/have 使用名称空间,通常会有一组管理项目组织的通用实践和约定:

我习惯了这种类型的项目组织,但我确实意识到它是 class/namespace-based 语言所特有的,它可能不符合 JavaScript/Node.js 的惯用语。如果我正确理解 Node.js 模块的概念,它是 1 source file = 1 module,但是从我在很多 NPM 包中看到的,一个模块通常导出不止一个符号,而且这些导出通常是函数而不是 classes/constructors,因此它与上述约定有很大不同。

所以,我有以下问题:

In JavaScript/Node.js, is it relevant at all to think about distribution of responsibilities in terms of «classes only» (or «prototypes only» for that matter)?

老实说我不太明白这个问题。如果你使用 classes,你应该遵循 OOP 原则,但如果你不使用,你仍然需要找到你的函数之间的内聚性,并根据它在模块和文件夹中组织它们。

Is the type of code organization described above usual or relevant at all in the context of a Node.js project, and is it technically implementable without too much trouble?

Javascript 模块没有命名空间,这使事情变得更容易一些(请记住,C# 和 c++ 项目通常具有与命名空间完全不同的文件夹结构)。使用文件夹作为命名空间,你会没事的。没有这样的规则,每个源文件只能有一个 class。我通常在单个文件中开始编写 classes 和函数,并在文件变大时重组为多个文件。 JavaScript 的模块系统非常灵活,您可以按照自己的方式组织代码。

If not, what are the traditional ways of handling repartition of responsibilities and code reuse in a Node.js project?

和其他地方一样。

In JavaScript/Node.js, is it relevant at all to think about distribution of responsibilities in terms of «classes only» (or «prototypes only» for that matter)?

在 Javascript 中,这是一种选择,而不是一种强制。您甚至可以明智地使用文件结构来实现完整的 OOP。或者只是将模块编写为纯函数。我建议您坚持使用更容易让其他人(可能想要理解您的代码)遵循的结构。例如,OOP 样式:

命名空间为src下的路径

/src/org/xml/XMLDocument.js

并且 class 与流行的 OOP 语言非常相似:

 // imports
 const fs = require('fs');
 const XMLNode = require('./XMLNode');

 // class def
 class XMLDocument extends XMLNode {

   // constructor
   constructor(filePath){
     ...
   }

   // property getter
   get filePath(){
     ...
   }

   // method
   function getElementsByName(name){
     ...
   }

 }

 // export class to outer world
 module.exports = XMLDocument;

使用class

// import
const XMLDocument = require('./org/xml/XMLDocument');

// create an instance     
const doc = new XMLDocument('./mydoc.xml');

所以是的,当您以 OOP 方式解决问题时,遵循 OOP 结构是相关的。还有其他方法。

另一种面向"creator"的自定义样式:

 function createXMLDocument(filePath){
     const doc = {};
     doc._type = "XMLDocument";
     ... // make the object have XMLDocument features
     return doc;
  }

  function createDXMLDocument(filePath){
     const doc = cerateXMLDocument(filePath);
     doc._type = "DXMLDocument";
     ... // modify parent object with DXML features
     return doc;
  }

你看,开发人员遵循一些模式并以这种风格编写所有项目代码。

Is the type of project organization described above possible at all in the context of a Node.js project?

一个 Node.js 项目可以有任何类型的代码组织,因为某些特性:

  1. Javascript 模块系统只是引用文件系统中某处存在的 js 文件。所以对文件放置没有特别的限制。有些模块是内置的,或者可以通过 npm 安装。

  2. 模块导出可以将一个或多个"things"导出到外部世界。所以这里也有很大的灵活性。

  3. Javascript 本身可以很容易地写成多种风格,函数式,OOP,过程式等。它允许开发者修改很多 Javascript 本身的性质。因此可能 "mimic" 多种编程风格。