将所有实例变量继承到另一个类

时间:2015-09-12 01:15:15

标签: ruby inheritance

我在特定类中有很多不同的方法,它们都计算唯一的实例变量。我一直在使用attr_reader来访问这些没有任何问题,但现在我已经收到了其中的几十个,并想知道是否有一种首选/有说服力的方式来访问所有这些实例变量 - 不仅仅是一个解决方案,而是一种普遍接受的首选方法/风格。

我已经看过类似级别变量的类似问题,但这是我想避免的。也许我可以用模块做到这一点,但我认为那些是用于存储成堆的常量?但也许这是我常规Class继承所遗漏的东西?继承self

如果你想象这些实例变量的堆是数学常数(pi,eulers等),它们都会添加一个数字(取决于用户输入)。我知道类和方法做了一件事,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. 

谢谢!

1 个答案:

答案 0 :(得分:2)

您是否听说过单一责任原则?它说,1级应该只做一件事,但做得好。有一个(man,甚至其中五个应该让你怀疑代码是否合适)的实例变量,意味着你有一个对象:上帝对象,它可以做任何事情。由于方法调用和实例变量之间存在大量隐藏的依赖关系,因此很难更改此代码。

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