'注册'具有自动发现的基类的额外方法

时间:2018-02-16 15:04:17

标签: javascript node.js ecmascript-6

我正在研究一个基类,它将检查一组常用方法,并对每个方法执行某些操作:

class BaseClass {

  get router() {
    if (!this._router) {
      this._register();
    }
    return this._router;
  }

  _register() {
    this._router = new Router()
    if (this.list) {
      this._router.use('/', this.list);
    }      

    if (this.detail) {
      this._router.use('/:id', this.detail);
    }
    // etc...

   }

}

我想允许班级用户注册'他们自己的定制方法也是如此。 作为第一遍,我想让它们覆盖_register

class MyClass extends BaseClass {      
  list() {...}

  _register() {
    super._register();
    this._router.use('/custom/route', this.customMethod);
  } 
}

嗯...这不太好,因为他们必须添加super样板并了解_router

我的下一个最好的方法是添加一个方法来注册基类中的额外内容:

addExtraRoute(route, method) {
  this._extras[route] = method
}

然后在_register方法中循环它,将它们全部添加。 这稍微好一点,因为用户可以随后注册'他们在构造函数中的方法:

class MyClass extends BaseClass {
    constructor() {
      super();
      this.addExtraRoute('/custom/route', this.customMethod);
    }
}

仍然不是很好:

  • 定义方法和注册之间没有位置,这有点难以阅读
  • 仍然是超级样板&需要确保我们知道要传递给基类的任何参数。

什么是更好的设计?

1 个答案:

答案 0 :(得分:0)

在设计一些被称为“为扩展设计”的类层次结构时,有一种常见的模式。出于这个原因,我们通常创建一些空的(占位符)方法,这些方法将被客户端覆盖并在我们的生命周期内的某个地方执行。请考虑以下事项:

class BaseClass {
 constructor() {
    _register(this.getExtraRoutes());
  }

  _register(routes) {
    ...
  }

  getExtraRoutes() {
    return [];
  }
}

class MyClass extends BaseClass {
  getExtraRoutes() {
    return { ... }
  }
}

这是你要找的东西吗?