同时使用和共享公共方法-正确的方法?

时间:2019-01-16 06:55:29

标签: javascript oop

正如标题所述,可以说我有一个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:

我认为这种方法不好。

  • 代码重复
  • 我正在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 :(得分:0)

方法1看起来很好。首先,您需要考虑的是公共合同。一些公共职能部门是否在内部使用另一个公共部门-不重要。您仍然需要测试覆盖每个公共API。

p.s。在一个类中拥有20-30个公共方法-是重新考虑设计并将类拆分为多个类/模块以符合Single Responsibility Principle的好时机:)