为了避免一些误解,我知道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;
}
}
现在,两个班级都可以做他们想做的事。
答案 0 :(得分:5)
Dart仍然只有图书馆级隐私。
标识符以下划线开头的库级隐私也在运行时强制执行。
分析器在静态分析期间提供了一些额外的功能,但在运行时会被忽略。
按照惯例,lib/src
中的库也被视为私有,现在应该从其他包导入。 linter,分析器的插件会通知违规行为。似乎是分析仪本身的一部分。
meta包提供了分析器支持的一些注释。
@protected
会发出警告。
@visibleForTesting
会产生警告,如果公共成员是由不在test
目录内的代码引用的(我假设的是同一个软件包)不确定分析器是否实际警告了违规行为,否则计划这样做。
据我记得,有一些问题需要更多规则,但尚未实施。
来自@ lrn的评论
当前设计的一个原因是Dart允许动态调用,即使在强模式下也是如此。这意味着
o.foo()
不能基于“类级别隐私”而被拒绝,而不会在运行时保留和检查额外信息。使用基于库/词汇的隐私,绝对清楚是否允许o.foo()
或o._foo()
(它始终是,只是后者只能引用同一个库的_foo
名称) 。如果Dart只有静态解析标识符,那么它可以使用静态信息(如private
声明)在编译时拒绝,而不会产生运行时开销。