【问题标题】:Is Observable as static class member a good practice?Observable 作为静态类成员是一个好习惯吗?
【发布时间】:2021-07-23 01:41:16
【问题描述】:

我最近开始从事一个新的 Angular 项目,我发现在不相关的组件之间共享状态的常见实现是使用 rxjs Subject/BehaviorSubject 作为类的静态成员。

例如:

export class AbcService {
  private static importantData: Subject<any> = new Subject();
  
  static get importantData$(): Observable<any>{
    return AbcService.importantData.asObservable()
  }
}

用法:

@Component({
  ...
})
export class DefComponent {
  constructor() {
    AbcService.importantData$.subscribe(...)
  }
}

我试图思考这种方法的优点,但我无法通过这样做找到任何重要的价值,而且它也与注入概念形成对比。

我错过了什么,将可观察对象声明为静态类成员有什么好处?

【问题讨论】:

  • 我从来没有真正遇到过这个..老实说我也想不出直接的好处..?

标签: javascript angular typescript oop rxjs


【解决方案1】:

这不是个好主意 因为这个类必须是可测试的。 该类必须在不查看其代码的情况下显示其依赖关系。DefComponent 依赖于 AbcService。您必须查看代码才能了解它。 最后,如果您更改静态类的名称,则必须将其更改为它使用的任何您不知道的文件。 相反,最好使用工厂模式或接口,以便它既可测试又显示依赖性。 我建议您阅读 SOLID 原则。 https://en.wikipedia.org/wiki/SOLID

【讨论】:

  • 我知道 SOLID,我的直觉是这是一种不好的做法。但是我对OOP和其他语言而不是js不够熟悉。因此,我寻找这种方法的优缺点。你能解释一下为什么它不可测试吗?因为你不能注入测试服务?替换所有代码也将使用非静态成员进行。你的回答是缺乏信息。
  • 如果你的类存储状态(数据),运行多个测试可能会相互影响,所以编写测试会更难。你的示例代码很简单,但大规模可能会发生。
  • 静态类很难或不可能模拟。因此,如果您正在测试一个依赖于静态类的类,那么模拟可能不是一个简单的选择。
【解决方案2】:

这里的好处是任何静态方法的好处——也就是说,可以在不实例化类的情况下调用该方法。限制是静态方法使用的任何静态类属性将在所有调用之间共享。

但是,在这个用例中,限制本身就是好处 - 服务应该来自单一来源。这在您使用非单例的不可注入服务时很有用。


我为此编写了一个库。它可以创建广播器并将数据广播到多个接收器。或者它可以创建侦听器来接收来自多个发送者的数据。

它提供了更多功能,例如在广播器之前创建接收器的能力(从动态加载的组件广播到静态组件)、命名空间、接收器范围等。

它大大简化了这个用例。

这里是图书馆:https://www.npmjs.com/package/ng-interconnect

这是广播公司的示例:

 let messageStream: IMessageStream = createBroadcaster('home/stateChanged');   //Create a broadcaster```
 
 ...
 ...
 /*Receive from it from another component somewhere in the hierarchy*/
 
 let userReceiver = receiveFrom('home/stateChanged', 'contacts/user', (data, error, complete) => {
  console.log(data);
  console.log(error);
  console.log(complete);
 })
 
 
 '''
 '''
 /*Broadcast messages from the first component*/
 nessageStream.emit('logged-in');

【讨论】:

    【解决方案3】:

    你是对的。这并没有额外的优势,尤其是在 Angular 的情况下,因为它确保服务是单例的,因此不需要这样做。

    但是,它在非角度场景中可能很有用。

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-19
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多