为什么在参数声明之前定义了构造函数?

时间:2019-08-27 07:12:29

标签: flutter dart

在dart和flutter代码中,通常在类的参数/实例变量之前声明构造函数,例如:

class Example {
    // Constructor BEFORE parameters
    Examples(this.name, this.profession);

    final String name;
    final String profession;
}

来自php,我习惯了不同的顺序,即:参数优先:

class Example {    
    final String name;
    final String profession;

    Examples(this.name, this.profession);
}

(据我所知,这也是用其他语言完成的,例如Java,Ruby,C#...)

https://dart.dev/guides/language/effective-dart/style的Dart编码风格指南中,没有解决此“现象”,而且到目前为止,我没有找到其他有关此现象的消息。

以下是“ Cloud Next '19”演示文稿中的示例,该文件由flutter核心开发人员提供: https://youtu.be/RpQLFAFqMlw?t=1070

甚至通过flutter create创建新的flutter项目时,您获得的现成计数器应用程序也使用以下顺序:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

有人知道,为什么Dart选择不同的方式?

2 个答案:

答案 0 :(得分:5)

这只是flutter团队使用的一种样式约定,并记录在他们的style guide中。

做出此决定的主要原因是:

  

这有助于读者一目了然地确定类是否具有默认的隐式构造函数。

进一步

  

如果构造函数可能在类中的任何位置,那么读者将不得不检查类的每一行,以确定是否存在隐式构造函数。

对于其他元素,即成员,方法,静态字段等,在Flutter样式指南中没有明确的顺序:

  

类的方法,属性和其他成员应按顺序排列,以帮助读者理解类的工作原理。

但是,如果没有明显的顺序,则样式指南会建议以下内容:

  
      
  1. 构造函数,默认构造函数优先。
  2.   
  3. 与类相同类型的常量。

  4.   
  5. 返回与类相同类型的静态方法。

  6.   
  7. 从构造函数设置的最终字段。

  8.   
  9. 其他静态方法。

  10.   
  11. 静态属性和常量。

  12.   
  13. 可变属性,每个属性依次为:getter,私有字段,setter,   没有换行符分隔它们。

  14.   
  15. 只读属性(hashCode除外)。

  16.   
  17. 运算符(==除外)。

  18.   
  19. 方法(除了toString和build)。

  20.   
  21. 用于Widget和State类的构建方法。

  22.   
  23. operator ==,hashCode,toString和与诊断相关的方法,位于   那个顺序。

  24.   

所有引号直接来自style guide

答案 1 :(得分:2)

关于构造函数,Flutter样式指南不同于Dart style guide这两个指南,否则它们有很多共同之处。因此,尽管Dart的样式指南的确没有提及“构造函数优先”之类的内容,也没有任何代码示例给人这种建议的印象,但Flutter提出了自己的样式指南,正如DaGardner之前提到并链接到的一样。这样做的原因是,有些小部件的参数非常庞大,似乎有些杂乱无章。

进一步的讨论可以在下面找到: https://github.com/flutter/flutter/issues/1220 https://github.com/dart-lang/linter/issues/186