【问题标题】:When to use part/part of versus import/export in Dart?何时在 Dart 中使用 part/part of 与 import/export?
【发布时间】:2015-03-02 00:53:56
【问题描述】:

在 Dart 中使用库时,我不完全理解 part/part ofimport/export 之间的区别。例如:

one.dart:
library one;
part "two.dart";
Class One {
};

two.dart:
part of one;
import 'somefile.dart';
Class Two {
}

library one;
import 'two.dart';
Class One {
}

library two;
import 'somefile.dart';
export 'somefile.dart';
Class Two {
}

这两种情况似乎都做同样的事情。什么时候使用partpart of 而不是import 更有利?是否存在import 不起作用但partpart of 会起作用的情况?

【问题讨论】:

    标签: dart


    【解决方案1】:

    2018/03 更新

    partpart of 最近越来越多地用于代码生成场景(而不是弃用的转换器),并且不太可能很快消失。

    built_valuejson_serializable 等许多软件包都依赖于它。

    不鼓励只是一种模式,其中一个包的所有文件都通过一个库文件和所有其他文件成为该库的一部分而绑定到一个库。

    原创

    在 Dart 中,私有成员可以在同一个库中访问。使用import,您可以导入一个库并且只能访问其公共成员。使用part/part of,您可以将一个库拆分为多个文件,并且这些文件中的所有代码都可以访问私有成员。

    请参阅上述更新中对以下段落的说明

    不鼓励使用part / part of,Dart 团队正在考虑取消它。我假设他们会引入类似“朋友”(https://github.com/dart-lang/sdk/issues/22841)的东西,其中两个库可以在停止part/part of(可能在未来的 Dart 版本中)之前访问彼此的私有成员作为替代。

    【讨论】:

    • 现在是 2020 年,他们保留了部分/部分。你对未来有什么看法?
    • 有一个关于支持部分类的问题,我的印象是 Dart 团队计划在可预见的将来实施。这可能取决于part。否则,它对于如何使用代码生成仍然有用。此外,私有在 Dart 中的工作方式在某些情况下可能很有用,即文件变得太大,但不能以其他方式拆分,因为一个文件中的代码无法访问其他文件中的私有内容。使用part 无论如何都很容易拆分。据我所知,这不是一个很常见的情况。
    • 2021 和部分/部分仍然存在,比以往任何时候都更强大。如果团队不及时引发更改,我不明白团队告诉我们避免使用它的意义。如果他们想进行彻底的改变,那肯定会破坏很多 Flutter 应用程序和软件包。
    • @AntoninGAVREL Dart 团队(就像在许多其他此类项目中一样)有时在告诉他们为什么应该避免某些事情时做得很差。 part part of 非常常用来将整个项目视为一个单独的库,其中的所有内容都是lib/my_package.dart 的一部分。我认为这就是他们不鼓励使用part/part of 时所指的内容。他们自己的代码生成器包需要partpart of,因此可以安全地假设您在这种情况下使用它时没有做错任何事情。
    【解决方案2】:

    假设我们有一个名为mylib 的Dart ,其文件为lib/mylib.dart

    library mylib;
    
    // Definitions
    

    该库可以包含在main.dart 文件中

    import 'package:mypackage/mylib.dart';
    

    当您创建一个新库并使用您希望在使用您的包时自动提供的其他库时,您可以使用export

    library mylib;
    
    export 'otherlib.dart';
    
    // Definitions
    

    您可以使用show 关键字仅导入/导出库的某些部分(如类或其他东西)。


    您在这里使用了错误的part of 指令。不能同时使用librarypart of,后者用于指定属于某个库的内容。例如,您可以将库文件拆分为多个文件(部分):

    假设我们在文件中有mylib.dart:

    library mylib;
    
    part 'src/class1.part';
    // More parts
    

    然后我们在另一个文件src/class1.part 中有mylib.dart 中指定的部分

    part of mylib;
    
    class Class1 { 
      /* ... */
    }
    

    【讨论】:

    • 谢谢。使用 part of 和 library 只是一个错字,因此我将其编辑为问题的未来可读性。
    • @Robert 我在导入您自己的文件(比如带有类定义、服务等的文件)与将它们成为之间存在两难选择> 你的图书馆。我发现使用import 可以很清楚每个文件的依赖关系是什么,但是每次你使用新的东西时你都会不断添加导入,而part/part of 只是给你一切但是你不知道依赖关系.此外,您的主库文件将具有所有依赖项。然后我欣赏的一件事是在主库文件上创建顶级函数。你怎么看?
    • 你可以随心所欲:)
    • @Robert 但有一点不同:图书馆的所有部分都可以访问私人成员,同时保护他们不受图书馆外任何东西的影响。从这个意义上说,它们或多或少像 Go 包或(这是一个延伸)像 C# 中的拆分类。如果您有一个包含私人和公共成员的文件,并且只想导出公共成员,那么part of 可能会很有用。或者,如果您真的需要保护一些私人成员免受外部世界的影响。但大多数情况下,“不要碰src”约定可以解决这个问题,而且已经足够好了。
    【解决方案3】:

    dartlang.org 网站上的 Creating Library Packages 文章建议避免使用 part / part of

    注意:您可能听说过 part 指令,它允许您 将一个库拆分为多个 Dart 文件。我们建议您避免 使用零件并创建迷你库。

    所指的“迷你库”是src 中的小型库 dart 文件,可从主库导入和导出。

    【讨论】:

      【解决方案4】:

      使用part/part of 会使许多文件被视为一个文件

      import/export 没有,因此当需要从其他文件(在其他文件上创建的类)访问私有字段时,这可能很有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多