【问题标题】:Is it possible to distribute the code of a class to several files?是否可以将一个类的代码分发到多个文件?
【发布时间】:2021-08-06 09:40:17
【问题描述】:

是否可以将一个类的代码分布到多个文件中?

【问题讨论】:

  • 它的用例是什么?
  • @jjmerelo 一个文件中没有太多代码。
  • 但如果这是一个设计问题,那么 Brad Gilbert 提到的就是要走的路;但是,这意味着您已经设计了它,使该解决方案有意义。只要设计正确,我认为在一个地方有太多代码没有什么大问题。

标签: class package raku


【解决方案1】:

是的,总是有的。但是我们没有标准支持的方式(无论如何)。

  1. 您可以采用 Raku 在创建核心设置时采用的方法:将文件连接成一个文件,然后对其进行编译。当您从头开始构建 Rakudo 时,当您看到这条线时就会发生这种情况:

    +++ Generating gen/moar/foo
    

    可以在gen/moar 目录中检查生成的文件。有一次,我在problem solving issue 中提出了这个问题,但那从未发生过。也许应该重新审视一下。

  2. 您可以使用augment class。但目前这仅在单个文件中有意义,因为对于多个文件,它会在预编译中创建同一“模块”的多个版本。并且系统无法确定要解决什么问题。这时你会意识到 Raku 模块的预编译当前正在创建需要在运行时静态链接的库。

【讨论】:

    【解决方案2】:

    老实说,我认为最好的方法是把它分解成不同的角色,让你组成你的班级。

    毕竟,你打算如何解散你的班级?
    是否要根据相似性对方法和属性进行分组?

    此时你刚刚想出了一个角色,所以你不妨让它成为一个角色。

    如果您查看 Rakudo 的源代码,您会看到如下内容:

    class Perl6::Metamodel::ClassHOW
        does Perl6::Metamodel::Naming
        does Perl6::Metamodel::Documenting
        does Perl6::Metamodel::LanguageRevision
        does Perl6::Metamodel::Stashing
        does Perl6::Metamodel::AttributeContainer
        does Perl6::Metamodel::MethodContainer
        does Perl6::Metamodel::PrivateMethodContainer
        does Perl6::Metamodel::MultiMethodContainer
        does Perl6::Metamodel::MetaMethodContainer
        does Perl6::Metamodel::RoleContainer
        does Perl6::Metamodel::MultipleInheritance
        does Perl6::Metamodel::DefaultParent
        does Perl6::Metamodel::C3MRO
        does Perl6::Metamodel::MROBasedMethodDispatch
        does Perl6::Metamodel::MROBasedTypeChecking
        does Perl6::Metamodel::Trusting
        does Perl6::Metamodel::BUILDPLAN
        does Perl6::Metamodel::Mixins
        does Perl6::Metamodel::ArrayType
        does Perl6::Metamodel::BoolificationProtocol
        does Perl6::Metamodel::REPRComposeProtocol
        does Perl6::Metamodel::InvocationProtocol
        does Perl6::Metamodel::ContainerSpecProtocol
        does Perl6::Metamodel::Finalization
        does Perl6::Metamodel::Concretization
        does Perl6::Metamodel::ConcretizationCache
    {
        … # only 300 lines of code
    }
    

    如果你很好地划分了你的角色,你应该能够在许多类中使用它们。
    您认为Perl6::Metamodel::Naming 角色中有多少 Rakudo 代码库中的类?

    这个角色只提供了一些东西,只有 45 行长。

    这是一个缩略版。 (为简洁起见,此处删除了方法中的所有代码。)

    role Perl6::Metamodel::Naming {
        has $!name;
        has $!shortname;
    
        method name($obj) {
            …
        }
        method set_name($obj, $name) {
            …
        }
        method shortname($obj) {
            …
        }
        method set_shortname($obj, $shortname) {
            …
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2022-01-07
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多