Разве неправильно требовать / импортировать класс, который уже импортирован выше по цепочке наследования? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть внешняя библиотека ( Objection.js ), которую я использую в своем приложении Node.js. Я создал класс базовой модели, который расширяет класс Objection Model для моих моделей сущностей:

const { Model } = require('objection')

class ModelBase extends Model {
    // implementation not important for this question
}

В моих модельных классах, которые расширяют мою базу, бывают моменты, особенно при кодировании relationMappings, когда мне приходится обращаться к свойствам / перечислениям в Model базовом классе. Я мог бы сделать это в моих расширенных моделях следующим образом:

const ModelBase = require('./model-base')

class SomeModel extends ModelBase {
    static get relationMappings () {
        const SomeOtherModel = require('./some-other-model')
        return {
            someOtherModel: {
                relation: ModelBase.BelongsToOneRelation,
                modelClass: SomeOtherModel,
                // etc.
            }
        }
    }
}

Обратите внимание на строку relation: ModelBase.BelongsToOneRelation. Это работает, но я думаю, что это вводит в заблуждение, поскольку BelongsToOneRelation НЕ является членом ModelBase. Что кажется мне более ясным и правильным, так это импортировать / требовать Model от возражения, чтобы я мог получить доступ к BelongsToOneRelation оттуда, например:

const { Model } = require('objection')
// other code just like above until the relationMappings...
                relation: Model.BelongsToOneRelation

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

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Я думаю, что это вводит в заблуждение, поскольку .BelongsToOneRelation НЕ является членом ModelBase

На самом деле это так: это унаследованный член.

Я предпочитаю явно импортировать суперкласс и получить доступ к члену там. Будет ли это вызывать проблемы, такие как требование цикла или версия циклической зависимости на JavaScript?

Нет, не будет. Иерархия наследования и область видимости не имеют ничего общего с зависимостями вашего модуля.

2 голосов
/ 12 апреля 2019

Будет ли это вызывать проблемы, например, требовать циклы или версию циклической зависимости JavaScript, если я импортирую / требую класс, который уже находится в области видимости в цепочке наследования?

Нет,Модуль будет выполнен при необходимости в первый раз, затем, если выполнение завершено, объект exports будет кэширован, и в дальнейшем require() s вернет тот же объект.

Если у вас есть циклическая зависимость,один из require() s вернет объект экспорта до выполнения модуля, поэтому объект экспорта к тому времени будет пустым, но позже будет заполнен свойствами.

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

...