我正在为操作机器的项目使用打字稿。有一个主要类根据我的应用程序事件来操作机器。我希望这个伪造的类实现可以让您对它的核心逻辑有所了解。
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
*/
}
正如您看到的那样,这种方法越来越脏,我将实现一个新的想法,这将需要我再添加一种装饰方法。 (可能不会是最后一个)
我想过渡到打字稿装饰器,以实现事件绑定和我的自定义装饰逻辑。问题是我的自定义装饰器实际上正在使用类的私有成员和方法。您能建议我最干净的方法吗?
谢谢。