Введите класс в другой класс - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть класс Tag и класс TagCollection для хранения нескольких тегов.Теперь классу TagRepository необходимо создать новый объект Tag для возврата.Но когда я пытаюсь создать новый Tag внутри TagRepository, он возвращает ошибку:

Тег не определен

Вот как я включаю всеклассы в основных файлах JavaScript:

const Tag = require('./class/Tag.js');
const TagCollection = require('./class/TagCollection.js');
const TagRepository = require('./repository/TagRepository.js');

Как мы обычно имеем дело с этим?Я мог бы просто включить необходимые классы в конструктор класса, который их требует.Но это кажется грязным, когда мне нужно включить несколько классов.

Единственное другое решение, о котором я мог подумать, - это сделать необходимые классы глобальными, чтение в Интернете кажется плохой практикой.Ниже я включил все классы

Tag.js

module.exports = class Tag {
  constructor() {
    this.id;
    this.name;
  }

  setId(id) {
    this.id = id;
  }

  setName(name) {
    this.name = name;
  }

  getId() {
    return this.id;
  }

  getName() {
    return this.name;
  }
}

TagCollection.js

module.exports = class TagCollection {
  constructor() {
    this.tags = [];
  }

  addTag(tag) {
    this.tags.push(tag);   
  }

  setTags(tags) {
    this.tags = tags;
  }

  getTags(tags) {
    return this.tags;
  }
}

TagRepository.js

module.exports = class TagRepository {
  constructor(conn) {
    this.conn = conn;
  }

  getAll(callback) {
    let tempTagCollection = new TagCollection;

    this.conn.query(`SELECT \`id\`, \`name\` FROM \`tag\` WHERE 1`, function (error, tags) {
      tags.forEach((tag) => {
        //Create single tag 
        let tempTag = new Tag;

        //Set properties
        tempTag.setName(tag.name);
        tempTag.setId(tag.id);

        //Add single tag to collection
        tempTagCollection.addTag(tempTag);
      })

      callback(tempTagCollection);
    })
  }
}

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Единственное другое решение, о котором я могу подумать, - это сделать необходимые классы глобальными, чтение в Интернете кажется плохой практикой.

Вы правы, создание глобальных переменных должностарайтесь избегать как можно большего, поскольку это способствует хрупкому и трудному отладке кода.

Каждый файл можно рассматривать как модуль.Мне лично нравится хранить по одному файлу на класс, поэтому я могу рассматривать сам класс как модуль.В каждом модуле вы должны require каждый класс, от которого вы зависите.

Поэтому я буду использовать классический пример Animal / Cat / Dog:

//Animal.js
module.exports = class Animal { ... }

//Cat.js
const Animal = require('./Animal');
class Cat extends Animal { ... }

//Dog
const Animal = require('./Dog');
class Dog extends Animal { ... }

В NodeJS, хотяоба Cat & Dog требуют Animal, Animal.js выполняется только один раз.Таким образом, каждый модуль, которому требуется Animal, получит тот же класс Animal.

Я мог бы просто включить необходимые классы в конструктор класса, который их требует.

Я бы тоже этого не делал.Использование require в конструкторе, даже если файл require будет выполнять файл только в первый раз, когда он был необходим, он все равно проходит через алгоритм разрешения файла узла, который является дорогостоящим процессом и может вызвать узкие места в производительности.Обычно лучше, чтобы ваши операторы require находились вне конструкторов или функций.Держите их в верхней части файла, где все требования будут запускаться один раз при загрузке приложения.

Как вы теперь можете видеть внутри TagRepository, для него требуются два класса, класс Tag и TagCollection.Я пойду по этому поводу?

Внутри TagRepository.js вам просто нужно просто иметь 2 оператора include, по одному для каждого файла, см. Ниже.

const Tag = require('./Tag');
const TagCollection = require('./TagCollection.js');

// Both Tag and TagCollection is now usable

class TagRepository { ... }

Дополнительная информация о модулях NodeJSможно найти здесь

https://nodejs.org/dist/latest-v10.x/docs/api/modules.html#modules_modules

0 голосов
/ 16 февраля 2019

Вам нужно «требовать» каждый класс, который вам нужен, в каждом файле, который вам нужен, поэтому в отличие от (например) PHP, вы не можете просто требовать всего один раз для каждой программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...