You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多个组件存在重复的客户状态校验逻辑,是否应封装Customer服务的checkArchived方法?

解答

非常建议你把这段重复逻辑抽成独立的Customer服务统一处理,这是典型的公共逻辑收敛场景,优势十分明确:

  • 降低维护成本:遵循DRY(不要重复自己)原则,后续如果要调整归档标记的文案、修改过滤规则,仅需修改服务内的checkArchived方法一处即可,无需遍历所有用到这段逻辑的组件逐一修改,也能避免漏改导致的多组件表现不一致问题。
  • 提升逻辑可测性:独立的服务方法可以很方便地编写单元测试覆盖各类边界场景(比如空客户列表、全归档客户列表等),无需绑定组件上下文即可完成测试。
  • 简化组件逻辑:组件仅需要调用服务拿到处理后的结果即可,不需要关心内部的归档处理细节,组件职责更清晰。

参考实现

服务实现建议不要直接修改传入的原数组/原对象,尽量返回新的副本,避免意外副作用影响其他依赖原数据的逻辑:

import { Injectable } from '@angular/core';

// 可替换为你项目中实际的Customer类型定义
interface Customer {
  name: string;
  archived: boolean;
  [key: string]: any;
}

@Injectable({
  providedIn: 'root'
})
export class CustomerService {
  checkArchived(customers: Customer[], hasBoundProjectCustomer: boolean): Customer[] {
    if (hasBoundProjectCustomer) {
      // 映射返回新数组,不修改原数据
      return customers.map(item => ({
        ...item,
        name: item.archived ? `${item.name} (Archived)` : item.name
      }));
    } else {
      return customers.filter(item => !item.archived);
    }
  }
}

组件内调用方式:

export class MyComponent {
  project: Project;
  choices: any;

  // 注入服务
  constructor(private customerService: CustomerService) {}

  ngOnInit(): void {
    this.createForm();
  }

  createForm() {
    // 调用服务方法替换原有重复逻辑
    this.choices.customers = this.customerService.checkArchived(
      this.choices.customers,
      !!this.project.customer
    );

    // 其余表单逻辑
    // ....
  }
  // ...
}

可选优化

如果你的场景是需要在模板中动态处理客户列表的展示,也可以把这段逻辑封装为Angular纯管道,按需调用即可。


内容的提问来源于stack exchange,提问作者nandesuka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:15:04