gpt4 book ai didi

flutter - 我是否应该将所有方法参数标记为最终并指定类型

转载 作者:行者123 更新时间:2023-12-05 01:08:13 25 4
gpt4 key购买 nike

Effective dart 指定顶级变量在适用时应为 final: https://dart-lang.github.io/linter/lints/prefer_final_fields.html

但是,我找不到任何有关方法参数的信息。

Flutter repo 的代码函数大多是带有未标记 final 参数的函数,其中包括我见过的所有重写的 build 方法。

以下哪项在性能和应用重量方面更好:

@override build(context)

@override build(BuildContext 上下文)

@override build(最终 BuildContext 上下文)

也许重写的函数应该和 super 函数一样定义?像上面的 build 这样可以推断类型的重写函数和其他命名/未命名函数(除了不设置类型使变量动态之外)之间是否有任何区别,Flutter repo 也是这样写的:

static double _flingDistancePenetration(double t) { // t is not final, although treated as immutable
return (1.2 * t * t * t) - (3.27 * t * t) + (_initialVelocityPenetration * t);
}

我看过这个关于 Java 的问题:Why would one mark local variables and method parameters as "final" in Java? ,并且,虽然我同意最佳答案,但我完全不知道为什么 Flutter repo 不这样做。

最佳答案

关于参数类型:是的,总是包含它们。否则你的参数很可能是dynamic1,这会产生运行时开销并且没有类型安全。您还希望您的 API 明确指定它期望的参数类型。

关于 final:这是一个基于意见的问题,我的观点是,虽然我同意 prefer_final_fields lint,但我不同意 prefer_final_locals Lint 。我认为为局部变量(包括函数/方法参数)添加 final 是没有意义的。

  • top-voted answer 的内容相反对相关的Java问题说,任何半体面的编译器都应该能够轻松确定是否重新分配了局部变量。如果那里有任何优化机会,编译器应该能够为您完成。

  • 在 Dart 等语言中,实现通常与接口(interface)内联(与 C 或 C++ 等语言相反,它们具有单独的头文件来声明接口(interface)),将 final 添加到参数是视觉噪声。它没有为调用者提供有用的信息。

  • 无论如何,您不应该单方面将所有函数/方法参数标记为 final。有时重新分配参数是合适的。例如,如果您的函数需要对其参数执行某种规范化:

    void foo(File file) {
    file = file.absolute;
    ...
    }

    在这种情况下,使用 final File file 意味着您需要一个单独的局部变量来用于规范化版本,现在代码很容易出错,因为它可能会意外使用原始变量。

  • 字段的
  • final 是 API 的重要组成部分。它告诉调用者该字段不会被重新分配;该字段引用的对象将始终是同一个对象。局部变量和函数/方法参数的 final 只影响实现函数的人。如果实现者不想重新分配变量,他们可以选择不重新分配它。

  • 有些人会声称拥有 final 局部变量有助于代码的可读性,因为他们知道该变量不会被重新分配。但是,我认为 final 可能会产生误导,因为它只说不能重新分配变量,not 表示它不会发生突变,并且知道后者很多更重要。


1 对于被覆盖的方法,参数类型受基类声明的相应参数类型的约束。因此,在被覆盖的方法中省略参数类型将使用基类中的参数类型。

关于flutter - 我是否应该将所有方法参数标记为最终并指定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66302108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com