Google Dart方法和属性的可见性

时间:2017-01-20 09:37:52

标签: dart

为了避免一些误解,我知道Google Dart处理库级别的内容,并且可以使用下划线前缀标识私有属性和方法。

截至2017年,这仍然是最新的吗?是否有任何计划添加对象级可见性关键字,如:private,protected或public?

我不想随便做一些事情,但我对最佳实践很感兴趣。我看待它的方式是:如果我不希望第一类看到第二类有什么,那么两者必须在不同的库中,那些库然后是更大的包的一部分。

libraries =类之间的隐私 packages =文件之间的隐私

如何细致地控制隐私?我的意思是也许有一件事我想私下。使用继承时使用可见性怎么样?我的意思是受保护的关键字非常有价值。

这是一个文件中的一个小例子:

class one {
  int n = 1;

  one() {
    var test = new two(n);
    print(test.showNumber());
  }
}

class two {
  int n = 2;

  two(n) {
    this.n += n;
  }

  int showNumber() {
    return n;
  }
}

现在,两个班级都可以做他们想做的事。

1 个答案:

答案 0 :(得分:5)

Dart仍然只有图书馆级隐私。

标识符以下划线开头的库级隐私也在运行时强制执行。

分析器在静态分析期间提供了一些额外的功能,但在运行时会被忽略。

按照惯例,lib/src中的库也被视为私有,现在应该从其他包导入。 linter,分析器的插件会通知违规行为。似乎是分析仪本身的一部分。

meta包提供了分析器支持的一些注释。

    如果公共成员被不属于子类的其他库中的代码引用,则
  • @protected会发出警告。

  • @visibleForTesting会产生警告,如果公共成员是由不在test目录内的代码引用的(我假设的是同一个软件包)不确定分析器是否实际警告了违规行为,否则计划这样做。

据我记得,有一些问题需要更多规则,但尚未实施。

来自@ lrn的评论

  

当前设计的一个原因是Dart允许动态调用,即使在强模式下也是如此。这意味着o.foo()不能基于“类级别隐私”而被拒绝,而不会在运行时保留和检查额外信息。使用基于库/词汇的隐私,绝对清楚是否允许o.foo()o._foo()(它始终是,只是后者只能引用同一个库的_foo名称) 。如果Dart只有静态解析标识符,那么它可以使用静态信息(如private声明)在编译时拒绝,而不会产生运行时开销。