【问题标题】:Public or private - Angular 2 component class methods confusion公共或私有 - Angular 2 组件类方法混淆
【发布时间】:2016-10-24 12:31:25
【问题描述】:

我很难理解组件类中哪些方法应该是私有的,哪些应该是公共的。

判断方法是公共的还是私有的似乎相当容易,例如:

export class MyServiceClass {
  private _cache = {}; // this value is private and shouln't be accessed from outside
  public accessCache(){ // it's public as it's an API method
    return this._cache;
  }
  public setCache(newVal){
     this._cache = newVal;
  }
}

按照这个逻辑,组件中的所有方法都应该是私有的,因为任何方法都不应该暴露在类之外。 (根据to that post组件和它的视图是一个实体)

export class MyComponent {      
  private _getRandomNumbers(){ // this is used in view only
    /*..*/
  }
}

没有悲剧,但是在this video 你可以了解到只有组件的公共方法才应该进行单元测试。按照上面的操作,我找不到任何理由在组件类中使用公共方法,但我仍然有一些值得测试的方法(尤其是视图中使用的方法)。这意味着我完全迷失了角度世界中私有和公共方法的含义。

所以我的问题很简单:

组件中的哪些方法应标记为公共和私有。

【问题讨论】:

  • 为什么视频中的陈述会引起混淆?只测试组件的公共 API 是正常的。
  • 您通常有输入和输出以及注入的依赖项,这些依赖项获取组件调用的方法或提供可观察的订阅。您还可以访问生成的 DOM 并测试它是否包含预期的内容。
  • @GünterZöchbauer 这是因为遵循这个逻辑,当组件中的所有方法都是私有的(仅在内部或组件模板中使用)时,没有什么可测试的。
  • 如果你想在不调查结果视图的情况下测试组件类(仅限控制器),那么我认为将视图视为不同的单元并使视图访问的所有成员都是有意义的公开而不是私有。
  • @GünterZöchbauer 这是一个非常有效的问题,它更多地适用于 Typescript 最佳实践而不是 Angular。考虑私有方法,黑盒会极大地损害可测试性。私有成员应该是可访问的、可监视的和可模拟的。 reflect-metadata 可以帮忙吗?我在功利主义环境 (DI) 中遇到过这种情况,但从来没有进行过基本的反思。

标签: angular typescript


【解决方案1】:

在组件类中,我会说,将所有内容设置为公共(如果没有访问修饰符,则默认为公共)。

在正常情况下,我们不扩展组件类,因此不需要访问修饰符,恕我直言。

在某些情况下,我们会继承一个组件。见这里component inheritance in Angular 2。但是,即使在这些情况下,也可能不需要访问修饰符。

...

export class MyComponent {
  // injected service as private
  constructor(private _randomSvc: RandomService) {} 

  getRandomNumbers(){ } // leave it as public

  @Input()
  myInput: string; // leave it as public

  @Output()
  myOutput; // leave it as public
}

记住 Javascript 本身没有访问修饰符。访问修饰符仅适用于开发(IDE)期间。虽然修饰符在某些情况下很有用,但我建议尽量减少它的使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2011-12-08
    • 2020-06-17
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多