为什么在Dart中使用final(没有类型)被认为是良好的实践?ie`final foo=config.foo;`?

为什么在Dart中使用final(没有类型)被认为是良好的实践?ie`final foo=config.foo;`?,dart,Dart,我在dart中看到了这一建议,并复制了大量教程和颤振源代码。 final foo=config.foo 我不明白,在可读性如此差的情况下,这是如何被认为是最佳实践的?我不知道这里的foo是什么,如果我们真的想使用final,那么肯定final字符串foo=config.foo更可取 这似乎等同于使用var,很多人认为这是一个错误的做法,因为它阻止编译器发现错误,并且不可读。 我错在哪里?在很多情况下,is实际上与您使用的类型无关,只要特定类型可以由编译器静态确定。当您在Dart中使用var/fi

我在dart中看到了这一建议,并复制了大量教程和颤振源代码。
final foo=config.foo

我不明白,在可读性如此差的情况下,这是如何被认为是最佳实践的?我不知道这里的foo是什么,如果我们真的想使用final,那么肯定
final字符串foo=config.foo
更可取

这似乎等同于使用var,很多人认为这是一个错误的做法,因为它阻止编译器发现错误,并且不可读。


我错在哪里?

在很多情况下,is实际上与您使用的类型无关,只要特定类型可以由编译器静态确定。当您在Dart中使用var/final时,并不是因为Dart不知道类型,而是它会根据上下文自动计算出来。但是在编译程序时仍然必须定义类型,这样类型就永远不会是基于运行时行为的动态类型。如果你想要真正的动态类型,你可以使用
dynamic
关键字告诉Dart“相信我,我知道我在用这些类型做什么”

所以类型仍然应该在最重要的地方定义。例如,这适用于方法和类变量的返回和参数类型。这种类型的共同点是,它们用于定义使用方法或类的接口

但是,当您在方法中编写代码时,您通常对方法中使用的特定类型的变量不太感兴趣。相反,重点应该放在逻辑本身上,通过使用好的描述变量名,通常可以使其更加清晰。只要Dart分析器能够找出类型,您就可以从IDE中获得自动完成功能,甚至可以通过变量IntelliJ中的Ctrl+Q(如果您想知道类型)从IDE中查看特定类型

当我们讨论泛型的使用时尤其如此,在泛型中编写完整的特定类型可能会非常烦人。特别是如果您在彼此内部使用多个泛型,例如
Map

根据我的经验,Dart非常适合找出非常具体的类型,如果您的代码不能静态确定,它会大声抱怨。在未来,Dart将在默认情况下引入非null,这将使Dart编译器和分析器更加强大,因为它将确保变量不能为null,除非这是您特别想要的,并且将确保您在使用指定为不应为null的方法时要测试null

关于“我错在哪里?”。很多语言都有类似var/final的特性,比如Dart,它们的设计原则相同,类型仍然应该由编译器或运行时静态确定。甚至Java也引入了这个特性。作为一名经验丰富的Java和Dart程序员,我自己得出的结论是,在很多情况下,在方法内部键入并不是那么重要,只要在真正重要的时候,我仍然可以通过使用IDE轻松地找出特定的类型


但命名变量确实更为重要,这样它们就能清楚地定义用途。但我希望你已经在这么做了

您要查找的规则是:。在您的示例中,类型不明显。在《样式指南》中的示例中,类型是显而易见的——右侧要么是文字调用,要么是构造函数调用。啊,谢谢,这条规则也在起作用。是的,我熟悉dart中的推理,并且同意它真的很好!但我完全不同意在方法内部查看类型并不重要。尤其是在开发团队中,在尝试摸索一些代码时,看到清晰定义的类型非常有帮助。