Одновременное использование и обмен публичными методами - правильный подход? - PullRequest
0 голосов
/ 16 января 2019

Как следует из названия, допустим, что у меня есть class со многими methods и 80% из них:

  • Мне нужно также установить как общедоступный (функциональность 1: 1)
  • Они используют друг друга

Какой подход является лучшим с точки зрения расширения и тестирования в будущем?Конечно, приведенные ниже примеры тривиальны, но давайте предположим, что у меня есть класс с 20-30 методами внутри.Если это поможет, проект написан на ReactJS.

Подход 1:

Этот подход самый быстрый для меня.

  • Нет повторения кода
  • Я используюfunctions внутри class, также совместно с внешним
  • Некоторые функции зависят от других

class Approach1 {
  names = [];

  /* Establish methods for users also */
  publicApi = {
    check: this.check,
    setValue: this.setValue
  };

  /**
   * Public method 1
   * @public
   * @param {string} name
   * @returns {boolean}
   */
  check = name => name === "foo";

  /**
   * Public method 2 using internally method 1
   * @public
   * @param {string} name
   * @returns {boolean}
   */
  setValue = name => {
    if (this.check(name)) names.push(name);
  };
}

Подход 2:

IНе думаю, что этот подход хорош.

  • Повторение кода
  • Я использую functions внутри class, также разделяю снаружи
  • Функции не зависят отдруг друга

class Approach2 {
  names = [];

  /* Establish methods for users also */
  publicApi = {
    check: this.check,
    setValue: this.setValue
  };

  /**
   * Public method 1
   * @public
   * @param {string} name
   * @returns {boolean}
   */
  check = name => name === "foo";

  /**
   * Public method 2 with own implementation
   * @public
   * @param {string} name
   * @returns {boolean}
   */
  setValue = name => {
    if (name === "foo") names.push(name);
  };
}

Подход 3:

Этот подход выглядит лучше, но я вижу много дополнительного кода.

  • Дополнительный код (мне нужно инкапсулировать почти каждый приватный метод)
  • Я разделяю один и тот же functions на приватный и публичный
  • Частный method может зависеть друг от друга
  • Публичный methods всегда зависит от частного methods

class Approach3 {
  names = [];

  /* Establish methods for users also */
  publicApi = {
    check: this.check,
    setValue: this.setValue
  };

  /**
   * Private method 1
   * @private
   * @param {string} name
   * @returns {boolean}
   */
  _check = name => name === "foo";

  /**
   * Private method 2
   * @private
   * @param {string} name
   */
  _setValue = name => {
    if (this._check(name)) names.push(name);
  };

  /**
   * Public method 1 (encapsulating private method)
   * @public
   * @param {string} name
   * @returns {boolean}
   */
  check = name => _check(name);

  /**
   * Public method 2 (encapsulating private methods 1 and 2)
   * @public
   * @param {string} name
   */
  setValue = name => {
    if (this._check(name)) this._setValue(name);
  };
}

Спасибо за любые советы:)

1 Ответ

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

Подход 1 выглядит совершенно нормально. Что нужно думать в первую очередь - это государственный контракт. Использует ли какая-либо публичная функция другую публику внутри или нет - не важно. Так как вам еще нужно покрыть тестами каждый кусочек публичного API.

p.s. наличие 20-30 открытых методов внутри одного класса - это хорошее время для переосмысления дизайна и разделения класса на несколько классов / модулей в соответствии с Принципом единой ответственности :)

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