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 使用名称空间,通常会有一组管理项目组织的通用实践和约定:
- 类构成基本代码单元,职责分散在多个classes.
- class 文件层次结构位于 单个顶级目录(大部分时间:
src/
或 lib/
)。
- 每个源文件包含一个单个class定义,仅此而已。
- 每个class驻留在命名空间(或包)层次结构的特定级别,它反映了文件系统;例如:
- 在 Java 中:class
com.badlogic.gdx.Application
将在 src/com/badlogic/gdx/Application.java
文件中找到
- in PHP(使用 PSR-0):class
Symfony\Component\HttpKernel\Kernel
将在 src/Symfony/Component/HttpKernel/Kernel.php
文件中找到
- 外部 class 符号可以通过特定语句 导入 到当前范围:
- 在 Java 中:
import com.badlogic.gdx.Application;
- 在 PHP 中:
use Symfony\Component\HttpKernel\Kernel;
我习惯了这种类型的项目组织,但我确实意识到它是 class/namespace-based 语言所特有的,它可能不符合 JavaScript/Node.js 的惯用语。如果我正确理解 Node.js 模块的概念,它是 1 source file = 1 module,但是从我在很多 NPM 包中看到的,一个模块通常导出不止一个符号,而且这些导出通常是函数而不是 classes/constructors,因此它与上述约定有很大不同。
所以,我有以下问题:
- 在 JavaScript/Node.js 中,根据 «classes only» 考虑责任分配是否相关(使用传统的 构造函数 + 原型composition 方法还是新的
class
shorthand)?
- 在 Node.js 项目的背景下,上述项目组织类型是否可能?
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 项目可以有任何类型的代码组织,因为某些特性:
Javascript 模块系统只是引用文件系统中某处存在的 js 文件。所以对文件放置没有特别的限制。有些模块是内置的,或者可以通过 npm 安装。
模块导出可以将一个或多个"things"导出到外部世界。所以这里也有很大的灵活性。
Javascript 本身可以很容易地写成多种风格,函数式,OOP,过程式等。它允许开发者修改很多 Javascript 本身的性质。因此可能 "mimic" 多种编程风格。
免责声明:我是Node.js新手。
有许多基于 class 的语言,您可以在其中 can/must 使用 命名空间 来组织代码,例如:Java , PHP, ActionScript 3… 对于其中的许多语言,如果您 choose/have 使用名称空间,通常会有一组管理项目组织的通用实践和约定:
- 类构成基本代码单元,职责分散在多个classes.
- class 文件层次结构位于 单个顶级目录(大部分时间:
src/
或lib/
)。 - 每个源文件包含一个单个class定义,仅此而已。
- 每个class驻留在命名空间(或包)层次结构的特定级别,它反映了文件系统;例如:
- 在 Java 中:class
com.badlogic.gdx.Application
将在src/com/badlogic/gdx/Application.java
文件中找到 - in PHP(使用 PSR-0):class
Symfony\Component\HttpKernel\Kernel
将在src/Symfony/Component/HttpKernel/Kernel.php
文件中找到
- 在 Java 中:class
- 外部 class 符号可以通过特定语句 导入 到当前范围:
- 在 Java 中:
import com.badlogic.gdx.Application;
- 在 PHP 中:
use Symfony\Component\HttpKernel\Kernel;
- 在 Java 中:
我习惯了这种类型的项目组织,但我确实意识到它是 class/namespace-based 语言所特有的,它可能不符合 JavaScript/Node.js 的惯用语。如果我正确理解 Node.js 模块的概念,它是 1 source file = 1 module,但是从我在很多 NPM 包中看到的,一个模块通常导出不止一个符号,而且这些导出通常是函数而不是 classes/constructors,因此它与上述约定有很大不同。
所以,我有以下问题:
- 在 JavaScript/Node.js 中,根据 «classes only» 考虑责任分配是否相关(使用传统的 构造函数 + 原型composition 方法还是新的
class
shorthand)? - 在 Node.js 项目的背景下,上述项目组织类型是否可能?
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 项目可以有任何类型的代码组织,因为某些特性:
Javascript 模块系统只是引用文件系统中某处存在的 js 文件。所以对文件放置没有特别的限制。有些模块是内置的,或者可以通过 npm 安装。
模块导出可以将一个或多个"things"导出到外部世界。所以这里也有很大的灵活性。
Javascript 本身可以很容易地写成多种风格,函数式,OOP,过程式等。它允许开发者修改很多 Javascript 本身的性质。因此可能 "mimic" 多种编程风格。