Актуальна ли организация кода на основе классов / пространств имен в JavaScript / Node.js?

Заявление об ограничении ответственности: я новичок в Node.js.

Существует ряд языков на основе классов, в которых вы можете / должны использовать пространства имен для организации своего кода, например: Java, PHP, ActionScript 3… Для ряда из этих языков, если вы выберете / имеете для использования пространств имен обычно существует набор общих практик и соглашений, которые регулируют организацию проекта:

  • Классы образуют базовые блоки кода, а обязанности распределяются между несколькими классами.
  • Иерархия файлов классов находится в единственном каталоге верхнего уровня (чаще всего: src/ или lib/).
  • Каждый исходный файл содержит определение одного класса и ничего больше.
  • Each class resides at a specific level of a namespace (or package) hierarchy, which mirrors the filesystem; for example:
    • in Java: class com.badlogic.gdx.Application would be found in the src/com/badlogic/gdx/Application.java file
    • в PHP (с PSR-0): класс Symfony\Component\HttpKernel\Kernel будет найден в файле src/Symfony/Component/HttpKernel/Kernel.php
  • Foreign class symbols can be imported into the current scope via a specific statement:
    • in 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?

person fabschurt    schedule 25.01.2017    source источник


Ответы (2)


В JavaScript / Node.js уместно ли вообще думать о распределении ответственности в терминах «только классов» (или «только прототипов» в этом отношении)?

В Javascript это выбор, а не поручение. Вы можете использовать полное ООП даже с точки зрения файловой структуры. Или просто пишите модули как чистые функции. Я бы посоветовал вам придерживаться структуры, которой будет легче следовать другим, желающим понять ваш код. Например, стиль ООП:

Пусть пространство имен будет путем к src

/src/org/xml/XMLDocument.js

и иметь класс, очень похожий на популярные языки ООП:

 // 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 может иметь любую организацию кода из-за определенных функций:

  1. Модульная система Javascript - это не что иное, как ссылка на файл js, присутствующий где-то в файловой системе. Так что особых ограничений на размещение файлов нет. Есть модули, которые встроены или могут быть установлены через npm.

  2. Экспорт модуля может экспортировать одну или несколько «вещей» во внешний мир. Так что здесь тоже много гибкости.

  3. Сам Javascript может быть легко написан во многих стилях, функциональных, ООП, процедурных и т. Д. Это позволяет разработчику изменять многие собственные свойства Javascript. Следовательно, возможно "имитировать" многие стили программирования.

person S.D.    schedule 27.01.2017
comment
Также стоит упомянуть пространства имен в коде, а не только в именах файлов (например, stackoverflow.com/questions/32230966/) - person Wiktor Zychla; 27.01.2017
comment
Большое спасибо за этот прекрасный и полный ответ, это именно то, что я искал. - person fabschurt; 27.01.2017

В JavaScript / Node.js уместно ли вообще думать о распределении ответственности в терминах «только классов» (или «только прототипов» в этом отношении)?

Если честно, я не очень понимаю этот вопрос. Вы должны следовать принципам ООП, если используете классы, но если вы этого не сделаете, вам все равно нужно найти взаимосвязь между вашими функциями и организовать их в модули и папки на основе этого.

Является ли описанный выше тип организации кода обычным или актуальным в контексте проекта Node.js, и можно ли его технически реализовать без особых проблем?

Модули Javascript не имеют пространств имен, что немного упрощает работу (помните, что проекты C # и C ++ обычно имеют структуру папок, полностью отличную от пространств имен). Используйте папки как пространства имен, и все будет в порядке. Нет такого правила, что у вас может быть только один класс на исходный файл. Обычно я начинаю писать классы и функции в одном файле и реорганизовываю их в несколько файлов, когда файл становится большим. Модульная система JavaScript очень гибкая, вы можете организовать код буквально как хотите.

Если нет, каковы традиционные способы обработки перераспределения обязанностей и повторного использования кода в проекте Node.js?

Как и везде.

person Tamas Hegedus    schedule 25.01.2017
comment
Конечно, не существует «правила» как такового, обеспечивающего соблюдение идиомы один класс на файл, но это хорошо устоявшееся соглашение во многих языках, основанных на классах / пространствах имен. Мой вопрос был действительно в том, можно ли «имитировать» это соглашение + пространства имен в Node.js. Возможно, мой вопрос был недостаточно ясным / конкретным, я его отредактировал. - person fabschurt; 25.01.2017