如何创建可以使用类的私有成员和方法的“方法修饰器”

我正在为操作机器的项目使用打字稿。有一个主要类根据我的应用程序事件来操作机器。我希望这个伪造的类实现可以让您对它的核心逻辑有所了解。

class Machineservice {
  constructor(
    private machine: Machine,) {
  }

  private onHome() { 
    //... 
   }

  private onmove(...args) { 
    //... 
  }

  private onHeaterTurnedOn() { 
    //... 
  }

  /*
    .
    .
    .
    methods continues

  */
}

创建此类后,我需要实现:

  • 机器繁忙逻辑
  • 所有通知用户的方法都具有相同的错误捕获机制
  • 事件方法绑定

要达到这个目的,我的方法就是这样:

class Machineservice {
  constructor(
    private machine: Machine,) {
    this.decorateMethods();
    this.registerToEvents();
  }

  private decorateMethods() {
    const decorationData = {
      "onHome": {makesBusy: true,catchesError: true},"onmove": {makesBusy: true,"onHeaterTurnedOn": {makesBusy: false,catchesError: false},};

    for (let key in decorationData) {
      const method = this[key];
      // ...
      if (/*...*/) {
        this[key] = this.catchesErrorDecorator(method);
      }

      if (/*...*/) {
        this[key] = this.makesBusyDecorator((method);
      }
    }
  }

  private makesBusyDecorator(method) {
    return async (...args) => {
      this.machine.makeBusy();
      await method(...args);
      this.machine.makeAvailable();
    }
  }

  private catchesErrorDecorator(method) {
    return async (...args) => {
      try {
        await method(...args);
      } catch (e) {
        // handle error
      }
    }
  }

  private registerToEvents() {
    anEventsource.on("ON_HOME_EVENT",this.onHome);
    anEventsource.on("ON_MOVE_EVENT",this.onmove);
    anEventsource.on("ON_HEATER_ON_EVENT",this.onHeaterTurnedOn);
  }

  private onHome() { /*...*/ }

  private onmove(...args) { /*...*/ }

  private onHeaterTurnedOn() { /*...*/ }

  /*
    .
    .
    .
    methods continues

  */
}

正如您看到的那样,这种方法越来越脏,我将实现一个新的想法,这将需要我再添加一种装饰方法。 (可能不会是最后一个)

我想过渡到打字稿装饰器,以实现事件绑定和我的自定义装饰逻辑。问题是我的自定义装饰器实际上正在使用类的私有成员和方法。您能建议我最干净的方法吗?

谢谢。

Q53558217 回答:如何创建可以使用类的私有成员和方法的“方法修饰器”

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3036248.html

大家都在问