Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于类/命名空间的代码组织在JavaScript/Node.js中是否相关?_Javascript_Node.js_Ecmascript 6_Project Organization - Fatal编程技术网

基于类/命名空间的代码组织在JavaScript/Node.js中是否相关?

基于类/命名空间的代码组织在JavaScript/Node.js中是否相关?,javascript,node.js,ecmascript-6,project-organization,Javascript,Node.js,Ecmascript 6,Project Organization,免责声明:我是Node.js新手 有许多基于类的语言,您可以/必须使用名称空间来组织代码,例如:Java、PHP、ActionScript 3……对于其中的一些语言,如果您选择/必须使用名称空间,则通常有一组管理项目组织的常用做法和约定: 类构成基本的代码单元,职责分布在多个类中 类文件层次结构位于单个顶级目录中(大多数情况下:src/或lib/) 每个源文件只包含一个类定义,没有其他内容 每个类驻留在命名空间(或包)层次结构的特定级别,该层次结构反映了文件系统;例如: 在Java中:cla

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

有许多基于类的语言,您可以/必须使用名称空间来组织代码,例如:Java、PHP、ActionScript 3……对于其中的一些语言,如果您选择/必须使用名称空间,则通常有一组管理项目组织的常用做法和约定:

  • 类构成基本的代码单元,职责分布在多个类中
  • 类文件层次结构位于单个顶级目录中(大多数情况下:
    src/
    lib/
  • 每个源文件只包含一个类定义,没有其他内容
  • 每个类驻留在命名空间(或包)层次结构的特定级别,该层次结构反映了文件系统;例如:
    • 在Java中:class
      com.badlogic.gdx.Application
      可以在
      src/com/badlogic/gdx/Application.Java
      文件中找到
    • 在PHP中(使用PSR-0):类
      Symfony\Component\HttpKernel\Kernel
      可以在
      src/Symfony/Component/HttpKernel/Kernel.PHP
      文件中找到
  • 可以通过特定语句将外部类符号导入当前范围:
    • 在Java中:
      import com.badlogic.gdx.Application
    • 在PHP中:
      使用Symfony\Component\HttpKernel\Kernel
我已经习惯了这种类型的项目组织,但我确实意识到它是特定于基于类/名称空间的语言的,并且可能与JavaScript/Node.js的常用习惯用法不匹配。如果我正确理解Node.js模块的概念,它是1个源文件=1个模块,但是从我在许多NPM包中看到的情况来看,一个模块通常会导出多个符号,而且这些导出通常是函数而不是类/构造函数,因此它与上述约定有很大的不同

因此,我有以下问题:

  • 在JavaScript/Node.js中,考虑“仅类”方面的责任分配(使用传统的构造函数+原型组合方法或新的
    速记)是否相关
  • 在Node.js项目的上下文中,上述项目组织类型是否可能
在JavaScript/Node.js中,考虑“仅类”(或“仅原型”)方面的责任分配是否相关

老实说,我真的不明白这个问题。如果您使用类,您应该遵循OOP原则,但如果您不这样做,您仍然需要找到函数之间的内聚,并基于此将它们组织到模块和文件夹中

上面描述的代码组织类型在Node.js项目的上下文中是常见的还是相关的,并且在技术上是否可以实现而不需要太多麻烦

脚本模块没有名称空间,这使得事情变得更容易(记住C++和C++项目通常有一个与名称空间完全不同的文件夹结构)。使用文件夹作为名称空间,你会没事的。没有这样的规则,每个源文件只能有一个类。我通常开始在一个文件中编写类和函数,当文件变大时,我会重新组织成多个文件。JavaScript的模块系统非常灵活,您可以按照任何方式组织代码

如果不是,在Node.js项目中,处理职责重新划分和代码重用的传统方法是什么

和其他地方一样

在JavaScript/Node.js中,考虑“仅类”(或“仅原型”)方面的责任分配是否相关

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

让namespace成为src下的路径

/src/org/xml/XMLDocument.js
并且有一个与流行的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;
使用该类

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

// create an instance     
const doc = new XMLDocument('./mydoc.xml');
所以,是的,当你用面向对象的方法解决问题时,遵循面向对象的结构是相关的。还有其他的方法

另一种面向“创建者”的自定义样式:

 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;
  }
您知道,开发人员遵循一些模式,并以这种风格编写所有项目代码

在Node.js项目的上下文中,上述项目组织类型是否可能

由于某些特性,Node.js项目可以具有任何类型的代码组织:

  • Javascript模块系统只是引用文件系统中某个地方的js文件。因此,对文件放置没有特殊限制。有些模块是内置的,或者可以通过npm安装

  • 模块导出可以将一个或多个“东西”导出到外部世界。所以这里也有很大的灵活性

  • Javascript本身可以很容易地以多种风格编写,包括函数式、面向对象、过程式等。它允许开发人员修改Javascript自身的许多特性。因此,可能会“模仿”许多编程风格


  • 当然,没有“规则”本身强制执行“一个文件一个类”的习惯用法,但在许多基于类/名称空间的语言中,这是一个公认的惯例。我的问题是,是否有可能在Node.js中«模仿»该约定+名称空间。也许我的问题不够清楚/具体,我已经编辑过了。在代码中提到名称空间也是值得的,不仅仅是在文件名中(例如)。非常感谢这个令人敬畏的完整答案,这正是我想要的。