为了避免一些误解,我知道Google Dart处理库级别的事情,并且可以使用下划线前缀标识私有属性和方法.
这仍然是2017年的最新版本吗?是否有任何计划添加对象级可见性关键字,如:private,protected或public?
我不想随便做一些事情,但我对最佳实践很感兴趣.我的方式是:如果我不希望第一类看到第二类有什么,那么两者必须在不同的库中,那些库然后是更大的包的一部分.
libraries =类之间的隐私包=文件之间的隐私
隐私的细粒度控制怎么样?我的意思是也许有一件事我想私下.使用继承时使用可见性怎么样?我的意思是受保护的关键字非常有价值.
这是一个文件中的一个小例子:
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仍然只有图书馆级别的隐私.
标识符以下划线开头的库级隐私也在运行时强制执行.
分析器在静态分析期间提供了一些额外的功能,但在运行时会被忽略.
按照惯例,内部库也lib/src
被视为私有库,现在应该从其他包中导入.该棉短绒,对于分析插件通知有关侵犯.似乎是分析仪本身的一部分.
该元包提供了由分析器支持的一些注解.
@protected
如果公共成员被来自不在子类中的其他库的代码引用,则会生成警告.
@visibleForTesting
如果公共成员是由不在test
目录中的代码(我假设的同一个包)引用,则会发出警告.不确定分析器是否实际警告了违规行为,否则计划这样做.
据我记得,有一些问题需要更多规则,但尚未实施.
来自@ lrn的评论如下
当前设计的一个原因是Dart允许动态调用,即使在强模式下也是如此.这意味着
o.foo()
在运行时不保留和检查额外信息的情况下,不能基于"类级隐私"拒绝.随着库/词法基于隐私,这是绝对清楚是否o.foo()
还是o._foo()
被允许的(它始终是,它只是后者只能参照_foo
相同的库的名称).如果Dart只有标识符的静态解析,那么它可以使用静态信息(如private
声明)在编译时拒绝而不会产生运行时开销.