【问题标题】:Inherit all instance variables into another class将所有实例变量继承到另一个类
【发布时间】:2015-09-12 01:15:15
【问题描述】:

我在一个特定的类中有大量不同的方法,它们都计算唯一的实例变量。我一直在使用attr_reader 毫无问题地访问这些,但现在我有几十个,想知道是否有一种首选/雄辩的方式来访问所有这些实例变量——不仅仅是一个解决方案,而是一个普遍的接受的首选方法/风格。

我看到过关于类级别变量的类似问题,但这是我想避免的。也许我可以用一个模块来做到这一点,但我认为那些是为了存储成堆的常量?但也许这是我在常规类继承中缺少的东西?继承self?

如果您将这些实例变量想象成数学常数(pi、欧拉等),它们都会添加一个数字(取决于用户输入)。我知道类和方法做一件事,而 Stack 类和方法肯定做一件事 - 它们只是存储许多其他类和方法所需的数据片段。

我正在使用的代码示例:

    class Stack
    attr_reader :pi, :euler  # ... and dozens more of these

    def initialize
        @pi = 3.14 + 8
        @euler = 0.577 + 8
        # dozens more assignements here
    end
end

class Overflow
    def show
        a = Stack.new
        p a.pi  # attr_reader works fine here
    end
end

class AnotherClass
    def some_method_that_needs_all_variables_in_Stack
        # Do I need to create another instance of the 
        # Stack class like I did in Overflow?
        # or should AnotherClass somehow inherit all the instance variables?
    end
end

Overflow.new.show   # => 11.14. 

谢谢!

【问题讨论】:

    标签: ruby inheritance


    【解决方案1】:

    您听说过单一职责原则吗?它说,1 个班级应该只做一件事,但要做好。拥有数百(伙计,即使其中五个也会让您怀疑您的代码是否良好)的实例变量,意味着您有一个对立面:上帝对象,它可以做任何事情。由于方法调用和实例变量之间存在无数隐藏的依赖关系,这段代码很难更改。

    解决方案:搬出新班级,让他们互相交谈。阅读一些有关面向对象编程的书,其中有很多,您会立即开始对您的代码感觉更好。

    【讨论】:

    • 我同意你所说的一切。我尝试在我的示例中使用pi 作为实例变量来展示您可以想象的许多类都想要使用的东西。为什么不直接将它们用作类变量?因为这些常数对它们进行了简短而独特的计算。因此,几乎我拥有的每个类和方法都使用这组派生实例变量。这就是为什么我试图让我的所有班级都可以访问它们。也许你的陈述已经接近答案了,“让他们[班级]互相交谈。” - 在这里显示代码会很有帮助。
    • @TonyDiNitto 我很乐意为您提供帮助,但没有查看您的代码,我不知道如何改进它。请发布一些(不要太长)你的代码,这样我就可以得到你真正想要解决的问题。
    • 感谢您的跟进。我编辑了问题/代码,希望能弄清楚我在问什么。
    • @TonyDiNitto,对不起,但您更新的示例并没有告诉我一个故事。你想用你的代码完成什么任务?它的目的是什么?尽管你的类名,我不认为你正在编写 StackOverflow 克隆。
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2012-12-03
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多