我发现我可以通过从每个文件中调用class <sameclassname>; <code> ;end
将一个类拆分成多个文件。我决定以这种方式分成一个非常大的班级。我看到的优点:
这种方法有什么缺陷吗?我找不到有关人们这样做的任何信息。
答案 0 :(得分:3)
我经常在我的gem文件中执行此操作来管理文档并避免使用长文件。
我发现的唯一问题(可解决的)是:
应仔细管理类或模块数据的初始化。作为每个隔间&#39; (文件)更新,初始化数据可能需要更新,但该数据通常在不同的文件中,我们(毕竟)是错误的。
在我的GReactor项目中(编辑:不推荐),我为每个部分编写了一个不同的初始化方法,并在主初始化方法中调用了所有这些方法。
因为每个隔间都是&#39;如果类或模块位于不同的文件中,很容易忘记它们都共享相同的命名空间,因此在命名变量和方法时应该更加小心。
每个文件中的代码按照加载文件的顺序执行(就像你编写一个长文件时那样)......但是因为你关闭了#39;每个文件之间的类/模块,比您的方法声明顺序可能很重要。在需要文件时应小心,以便保留所需的代码执行顺序。
GReactor是一个很好的例子,可以通过在不同文件中划分模块的不同方面来管理具有大型API的Mega模块。
我没有遇到任何其他陷阱或问题。
答案 1 :(得分:2)
在许多不同的文件中定义/重新打开同一个类会使得查找任何给定方法的来源变得更加困难,因为没有一个明确的位置。
这也开启了令人讨厌的加载序列错误的可能性,例如。文件A正在尝试调用文件B中的方法,但文件B尚未加载。
拥有一个非常大的类是一个标志,该类试图做太多,并应分成更小的模块/子类。 Sandi Metz的POODR建议将班级限制在100行以下,以及其他指南。
答案 2 :(得分:1)
在Ruby类中永远不会关闭。你叫什么&#34;分裂&#34;实际上只是重新开课。您可以随时重新打开类并向其添加方法。如果您在文件A
中定义一个类并将其包含在文件B
中,即使您重新打开文件B
中的类,它仍然包含文件{{中的所有代码1}}。我个人更喜欢在必要时重新开课。听起来在你的情况下,我会在一个文件中定义我的类。我认为这种方法组织得更好,干扰先前定义的方法的风险更低。有关rubylearning的主题的更多信息。
答案 3 :(得分:0)
以下是Ruby设计模式的一个很好的集合,或实际上在Ruby中设计模式示例:https://github.com/nslocum/design-patterns-in-ruby
看看decorator
是实现模块化的好方法,而没有严格的父类&lt; - &gt;类子树。
答案 4 :(得分:0)
唯一的缺陷是你的班级被分成多个文件,你需要管理。你班级的用户只需要第二个档案,所以如果你的班级是宝石或某个包裹的一部分,他们可能甚至不会意识到它已经重新开放。