【问题标题】:Google Dart visibility of methods and propertiesGoogle Dart 对方法和属性的可见性
【发布时间】:2017-06-05 05:54:15
【问题描述】:

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

截至 2017 年,这仍然是最新的吗?是否有计划添加对象级别的可见性关键字,例如:私有、受保护或公共?

我不只是想做一些随机的事情,而且我对最佳实践很感兴趣。我的看法是:如果我不想让第一类看到第二类有什么,那么两者都必须在不同的库中,那么这些库就是更大包的一部分。

库 = 类之间的隐私 包 = 文件之间的隐私

如何对隐私进行细粒度控制?我的意思是也许有一件我想要私人的东西。使用继承时如何使用可见性?我的意思是受保护的关键字真的很有价值。

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

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;
  }
}

就目前而言,两个类都可以为所欲为。

【问题讨论】:

    标签: dart


    【解决方案1】:

    Dart 仍然只有库级别的隐私。

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

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

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

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

    • 如果公共成员被不在子类中的其他库的代码引用,@protected 会产生警告。

    • @visibleForTesting 如果公共成员被不在test 目录(我假设的同一包)中的代码引用,则生成警告这样做。

    据我所知,还有一些关于更多规则的问题,但尚未实施。

    来自@lrn 下面的评论

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

    【讨论】:

    • 您认为他们避免使用这些关键字的决定是好是坏?我以为他们会用强模式添加这些。
    • 我不知道这是不是一个深思熟虑的决定。这可能是由 Dart 加载库的方式(例如从 HTTP URL)引起的。实际上,我错过了 protected 和 package private,但我完全可以使用仅分析器支持来获得 IDE 的违规通知,但在运行时没有强制执行。我相信当迁移到强模式和 Dart 2.0 完成后,它们会在这里得到改进。
    • 我以为他们已经发布了强模式。从未听说过 dart 2.0 的计划。据我所知,飞镖在 1.19 news.dartlang.org
    • 当前设计的一个原因是 Dart 允许 动态调用,即使在强模式下也是如此。这意味着o.foo() 不能基于“类级别隐私”而被拒绝,而不在运行时保留和检查额外信息。使用基于库/词法的隐私,o.foo()o._foo() 是否被允许是绝对清楚的(总是如此,只是后者只能引用同一库的 _foo 名称)。如果 Dart 只对标识符进行静态解析,那么它可以使用静态信息(如 private 声明)在编译时拒绝,而不会产生运行时开销。
    • @lrn 非常感谢。不记得看到过这个。我会将其添加到我的问题中以使其更加突出。我只是假设你没问题;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多