是否可以将一个类的代码分发到多个文件?
是否可以将一个类的代码分发到多个文件?
回答
老实说,我认为最好的方法是将其分解为不同的角色,然后组成您的班级。
毕竟,你打算如何解散你的班级?
您是否要根据相似性对方法和属性进行分组?
那时你刚刚想出一个角色,所以你不妨把它变成一个角色。
如果您查看 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) {
…
}
}
回答
是的,总是有的。但是我们没有标准的支持方式(无论如何)。
-
您可以采用 Raku 在创建核心设置时采用的方法:将文件连接成一个文件,然后编译它。当您从头开始构建 Rakudo 时,当您看到以下行时会发生这种情况:
+++ Generating gen/moar/foo可以在
gen/moar目录中检查生成的文件。有一次,我在解决问题的问题中提出了这个问题,但从未有过任何进展。也许应该重新审视这一点。 -
您可以使用
augment class. 但这目前仅在单个文件中有意义,因为对于多个文件,它会在预编译中创建同一“模块”的多个版本。并且系统无法确定要解决什么问题。这是当您意识到 Raku 模块的预编译当前正在创建需要在运行时静态链接的库时。