如何移除每个回调钩子中的重复校验逻辑?
移除钩子函数中重复校验逻辑的几种实用方案
1. 用装饰器统一处理校验
写一个装饰器函数封装校验逻辑,用它包裹所有需要校验的钩子方法,让每个钩子只需要关注核心业务逻辑:
// 定义装饰器函数 function requireSomeCheck(target, propertyKey, descriptor) { const originalMethod = descriptor.value; descriptor.value = function(...args) { if (!this.someCheck) return; return originalMethod.apply(this, args); }; return descriptor; } class SomeClass { get someCheck() { // ... 原有的校验逻辑 } @requireSomeCheck hookA(args) { // ... 核心业务逻辑 } @requireSomeCheck hookB(args) { // ... 核心业务逻辑 } @requireSomeCheck hookZ(args) { // ... 核心业务逻辑 } }
2. 构造函数中批量包装钩子方法
不想用装饰器语法的话,可以在构造函数里批量定位需要校验的钩子,动态包装它们的执行逻辑,只需要维护一个钩子名称列表即可:
class SomeClass { get someCheck() { // ... 原有的校验逻辑 } constructor() { // 维护需要校验的钩子方法名列表 const hooks = ['hookA', 'hookB', 'hookZ']; hooks.forEach(hookName => { const originalMethod = this[hookName]; this[hookName] = (...args) => { if (!this.someCheck) return; originalMethod.call(this, args); }; }); } hookA(args) { // ... 核心业务逻辑 } hookB(args) { // ... 核心业务逻辑 } hookZ(args) { // ... 核心业务逻辑 } }
3. 提取公共校验方法手动调用
如果不想改动太多原有结构,最直接的方式是把校验逻辑抽成公共方法,每个钩子方法里调用它来判断是否执行核心逻辑:
class SomeClass { get someCheck() { // ... 原有的校验逻辑 } // 公共校验方法 _checkAndProceed(callback) { if (!this.someCheck) return; callback(); } hookA(args) { this._checkAndProceed(() => { // ... 核心业务逻辑 }); } hookB(args) { this._checkAndProceed(() => { // ... 核心业务逻辑 }); } hookZ(args) { this._checkAndProceed(() => { // ... 核心业务逻辑 }); } }
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

