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

时间:2017-01-25 13:17:16

标签: javascript node.js ecmascript-6 project-organization

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

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

  • Classes 构成基本代码单元,职责分布在多个类上。
  • 类文件层次结构位于单个顶级目录中(大部分时间: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中,根据“仅限类”(使用传统的构造函数+原型组合方法或新的{{}来考虑责任分配是否相关? 1}}速记)?
  • 在Node.js项目的上下文中,上述项目组织的类型是否可行?

2 个答案:

答案 0 :(得分:1)

  

在JavaScript / Node.js中,根据“仅限类别”(或“仅原型”)来考虑责任分配是否相关?

说实话,我真的不明白这个问题。如果你使用类,你应该遵循OOP原则,但如果你不这样做,你仍然需要找到你的功能之间的凝聚力,并根据它在模块和文件夹中组织它们。

  

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

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

  

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

和其他地方一样。

答案 1 :(得分:1)

  

在JavaScript / Node.js中,根据“仅限类别”(或“仅原型”)来考虑责任分配是否相关?

在Javascript中,这是一个选择而不是授权。你可以明智地完整的OOP文件结构。或者只是将模块编写为纯函数。我建议你坚持使用对于其他人来说更容易理解你的代码的结构。例如,OOP样式:

让命名空间成为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');

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

另一种面向自定义风格的“创作者”:

 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本身可以很容易地用很多样式,功能,OOP,程序等来编写。它允许开发人员修改很多Javascript本身的性质。因此可能“模仿”许多编程风格。