《Dart 成员》由会员分享,可在线阅读,更多相关《Dart 成员(5页珍藏版)》请在金锄头文库上搜索。
1、Dart 成员成员在创建实例的时候最好是使构造函数不是静态法。构造函数通常由 new 或者 const 调,其主要的就是返回该类的个实例(或者少实现了其接)。在 Dart 中你将不再需要静态法来创建个实例。已命名的构造函数使你能够说明对象是如何构建的,并且场构造函数允许你在合适的情况下构建类以及接的实例。尽管如此,些采取定技巧创建新对象的法看起来“并不像构造函数”。如,尽管 Uri.parse() 是个静态法,它却通过给定的参数创建了个 Uri 对象。相应地,实现了 Builder pattern 的类看起来可能使静态法的类要好些。不过,在多数情况下,即使会显得程序冗长你也应该使构造函数不是静
2、态法。当其他使你的类来创建对象时,他们更希望能够使构造函数按照常规式来创建实例。class Point / goodnum x, y;Point(this.x, this.y);Point.polar(num theta, num radius): x = radius * math.cos(theta),y = radius * math.sin(theta);class Point / badnum x, y;Point(this.x, this.y);static Point polar(num theta, num radius) return new Point(radius * m
3、ath.cos(theta),radius * math.sin(theta);对于空的构造函数体, ; 来代替 。在 Dart 中,个函数体为空的构造函数可以由分号来结尾。这对于 const 类型的构造函数来说是必要的。考虑到致性以及简洁性,其他构造函数也应该做到这点。class Point / good int x, y;Point(this.x, this.y);class Point / badint x, y;Point(this.x, this.y) 请务必将 super() 的调放在构造函数初始化列表的最后。字段的初始化将会按照它们在构造函数初始化列表中出现的顺序来进。如果你把对
4、super() 的调放在初始化列表的中间,那么类中的初始化将会在类初始化列表中剩余内容之前被初始化。这并不是说类构造函数体中的内容将会被执。这往往是在所有的初始化都完成之后才执,与 super() 的位置关。初始化列表的影响正在逐渐降低,所以super() 在列表中的位置乎没有什么影响。最好养成将类构造函数放在类构造函数最后的习惯,这有利于提升代码的连贯性。并且当类构造函数体运的时候,其可读性也会增加,甚对运的效果也会有提升。View(Style style, List children) / good:_children = children,super(style)View(Style s
5、tyle, List children) / bad:super(style),-children = children 对于更改属性值的操作,请调 setter 来执。如果函数的名称是以 set 开头的,这通常意味着该函数可能是 setter 函数。更准确的说,对于下这些情况使 setter 来代替函数是较好的选择:采单个参数。改变了对象中的某个状态。有个相应的 getter。对于使者来说,有些可以修改但是却法看见的状态是有些奇怪的。(该准则反过来则是不对的,设置了 getter 不为它定义setter 也是可以的)是幂等的。使同个值来调两次 setter 时,第次调应当不含有其他操作。为了
6、快速运。使者们期待像 foo.bar = value 这样的表达式,因为它们执很快。rect.width = 3; / goodbutton.visible = false;你应当避免为了“安全”将字段封装在 getter 和 setter 中。在 Java 以及 C# 中,即便我们所需要的操作是直接对应字段的,通常情况下我们还是会将所有的字段都封装在 getter 和 setter 中(或者是 C# 的属性中)。事实上,如果你需要在成员上做更多操作,你可以不触及调点。这是因为,在 Java 中调个setter 函数和直接操作字段是不同的。在 C# 中使属性和直接操作字段是互不兼容的。Dart
7、 中并没有这种限制。字段以及 getter/setter 是完全相同的。你可以先使类中的字段,然后在不改动任何使了该字段的代码的情况下将其封装在 getter 以及 setter内。class Box / goodvar contents;class Box / badvar _contents;get contents = _contents;set contents(value) _contents = value;最好使 public final 字段来不是定义个 private 字段然后为之设置个 publicsetter。如果你有个代码之外可见的字段并且不会为它赋值(并且在构造函数之
8、外你不会更改它),多数情况下最简单的法就是直接让它作为 fianl 变量。class Box / goodfinal contents = ;class Box / badvar _contents;get contents = _contents;当某个成员的函数体返回的是单个表达式的时候,请考虑下使 = 来定义这些成员。除了函数表达式之外,Dart 也允许你使 = 来定义类的成员。这对于定义些计算并返回单值的简单成员来说是个好习惯。get width = right - left; / goodbool ready(num time) = minTime = null | minTime
9、getValues().contains(value);即便函数体并不是单的也可以使 =,但是不过你觉得将当表达式拆开成多代码较好,那么将整个函数体放在花括号中并显声明 return 看起来会更好。你应该避免为了使常规接从函数中返回 this。对于连续的函数调,使函数级联是种好习惯。var buffer = new StringBuffer() / good.write(one).write(two).write(three);var buffer = new StringBuffer(); / badbuffer.write(one).write(two).write(three);你应该避
10、免使布尔类型的参数,除它们的含义是常明显的。和其他类型不同,布尔值通常直接使字值不是布尔变量。像数字我们通常会将其封装在命名的常量中,但是在使的时候我们通常直接使true 和 false。这样其他就很难明你的调语句中布尔值究竟意味着什么:new Task(true); / badnew Task(false);new ListBox(false, true, true);相反,在调的时候,如果你使命名的参数,命名的构造函数或者是命名后的常量看起来就很舒服。new Task.oneShot(); / badnew Task.repeating();new ListBox(scroll: true, showScrollbars: true);W3Cschool()最的技术知识分享与学习平台此篇内容来于站户上传并发布。