为什么要将路由器设为私有?

Why make router private?

在Angular2+(4)routing tutorial中表示让router成为私有成员,例如:

constructor(
    private router: Router, // <- router is private
    private heroService: HeroService) { }
    ...
) {}

但它没有提供任何解释为什么路由器在这里是私有的。将其设为私有会使其更难测试,那么将其设为私有的原因是什么?它只是最佳实践,还是有一些安全隐患 public?

另外,具体来说,如何测试路由,以便在不同情况下导航到正确的路由?本教程根本没有提到测试 router/routes ?

封装。使您的字段 私有 和功能 public。使用您的 class in this case 的客户只需要知道它能做什么,而不是它是怎么做的。

TypeScript 中有 3 个访问级别,public, private, protected。这些关键字仅在 Typescript 级别受支持。

如果您将 variable/function 设为私有,它将 在 class 之外不可见

如果您设置variable/functionpublic,它将在class之外可见 ].

如果您使 variable/function 受到保护,它将 可见 仅在 class 本身中并且继承 class.

的任何 class

添加 privatepublicprotected 会隐式添加一个 class 级字段,传递的构造函数参数将分配给该字段。

这是用于减少样板文件的 TypeScript 功能。

您现在可以使用

访问传递的值
someMethod() {
  this.router...
}

而不是

class MyComponent {
  router:Router;

  constructor(
    router: Router, // <- router is private
    private heroService: HeroService) { }
    ...
  ) {
    this.router = router;
  }

  someMethod() {
    this.router...
  }
}

如果没有特定的理由,使之成为publicprotectedprivate是正确的选择。这就是他们所做的。

在这个具体的例子中,这对路由器来说并不是特别的……在一般的 OOP 中,问题总是 "is this supposed to be accessed by outside code as part of the public interface of this class?" 你有没有期待 router在这里可以从 ctrl.router 等其他任何地方公开和访问?如果不是,那么最好保留它 private。将公开的 public 接口限制在真正必要的部分,可以更容易地弄清楚什么使用什么,并在以后根据需要重构它,因为没有外部代码绑定到它。