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

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

回答

老实说,我认为最好的方法是将其分解为不同的角色,然后组成您的班级。

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

那时你刚刚想出一个角色,所以你不妨把它变成一个角色。

如果您查看 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
}

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

这个角色只提供了一些东西,而且只有 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) {
        …
    }
}


回答

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

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

    +++ Generating gen/moar/foo
    

    可以在gen/moar目录中检查生成的文件。有一次,我在解决问题的问题中提出了这个问题,但从未有过任何进展。也许应该重新审视这一点。

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


以上是是否可以将一个类的代码分发到多个文件?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>