首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript/Node.js中基于类/命名空间的代码组织是否相关?

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

Stack Overflow用户
提问于 2017-01-25 13:17:16
回答 2查看 1.4K关注 0票数 3

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

有许多基于类的语言可以/必须使用名称空间来组织代码,例如: Java、PHP、ActionScript 3…。对于许多这样的语言,如果您选择/必须使用名称空间,那么通常有一组管理项目组织的通用实践和约定:

  • 类构成基本代码单元,责任分散在多个类中。
  • 类文件层次结构驻留在一个顶级目录中(大多数情况下是:src/lib/)。
  • 每个源文件只包含一个类定义,而不包含其他任何类。
  • 每个类驻留在名称空间(或包)层次结构的特定级别,该层次结构反映文件系统;例如:
    • 在Java中:类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中:use Symfony\Component\HttpKernel\Kernel;

我已经习惯了这种类型的项目组织,但我意识到它是特定于基于类/命名空间的语言的,而且它可能与JavaScript/Node.js通常的习惯用法不匹配。如果我正确理解Node.js模块的概念,那就是1源文件=1模块,但从我在许多NPM包中看到的情况来看,一个模块通常导出多个符号,而且这些导出通常是函数而不是类/构造函数,因此它与上面描述的约定非常不同。

因此,我有以下问题:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-27 06:31:39

在JavaScript/Node.js中,只考虑类(或仅限于原型)来考虑责任的分配是否相关?

在Javascript中,这是一种选择,而不是授权。您可以完全OOP,甚至文件结构明智。或者只是将模块编写为纯函数。我建议您坚持对其他人来说更容易遵循的结构,他们可能想了解您的代码。例如,OOP样式:

让命名空间成为src下的路径。

代码语言:javascript
复制
/src/org/xml/XMLDocument.js

并且有一个非常类似于流行的OOP语言的类:

代码语言:javascript
复制
 // 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;

使用类

代码语言:javascript
复制
// import
const XMLDocument = require('./org/xml/XMLDocument');

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

因此,是的,在以面向对象的方式处理问题时,遵循OOP结构是相关的。也有其他的方法。

另一种面向“创建者”的定制风格:

代码语言:javascript
复制
 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项目可以具有任何类型的代码组织:

  1. Javascript模块系统只是引用文件系统中某个位置的js文件。因此,没有对文件放置的特殊限制。有些模块是内置的,或者可以通过npm安装。
  2. 模块导出可以将一个或多个“事物”导出到外部世界。所以这里也有很大的灵活性。
  3. Javascript本身可以很容易地用多种风格、功能、面向对象、过程等方式编写,它允许开发人员修改Javascript本身的许多特性。因此,可能会“模仿”许多编程风格。
票数 1
EN

Stack Overflow用户

发布于 2017-01-25 13:37:44

在JavaScript/Node.js中,只考虑类(或仅限于原型)来考虑责任的分配是否相关?

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

在Node.js项目的上下文中,上面描述的代码组织的类型是通常的还是相关的,它在技术上是否可以在没有太多麻烦的情况下实现?

Javascript模块没有名称空间,这使事情变得简单一些(请记住,C#和c++项目通常有一个与名称空间完全不同的文件夹结构)。使用文件夹作为名称空间,您会没事的。没有这样的规则,即每个源文件只能有一个类。我通常开始在单个文件中编写类和函数,并在文件变大时将其重新组织为多个文件。JavaScript的模块系统非常灵活,您可以随意组织代码。

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

和其他地方一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41852627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档