2015-09-12 3 views
0

У меня есть множество различных методов в определенном классе, которые вычисляют уникальные переменные экземпляра. Я использую attr_reader для доступа к ним без каких-либо проблем, но теперь у меня есть десятки из них и интересно, есть ли предпочтительный/красноречивый способ доступа ко всем этим переменным экземпляра, а не только к решению, но общепринятым предпочтительным метод/стиль.Наследовать все переменные экземпляра в другой класс

Я видел похожие вопросы относительно переменных уровня класса, но этого я бы хотел избежать. Может быть, я могу сделать это с помощью модуля, но я думал, что они предназначены для хранения груды констант? Но, может быть, это то, что мне не хватает с обычным наследованием класса? Inheriting 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. 

Спасибо!

ответ

2

Вы слышали о принципе единой ответственности? В нем говорится, что 1 класс должен делать только 1 вещь, но делать это хорошо. Имея сто (человек, даже пять из них должны усомниться в том, что ваш код хорош) переменных экземпляра, означает, что у вас есть антипод: объект Бога, который делает все. Этот код очень трудно изменить из-за множества скрытых зависимостей между вызовами методов и переменными экземпляра.

Решение: вывести новые классы и заставить их разговаривать друг с другом. Прочитайте некоторую книгу по объектно-ориентированному программированию, их много, и вы сразу начнете чувствовать себя лучше о своем коде.

+0

Я согласен со всем, что вы сказали. Я попытался использовать 'pi' в качестве переменной экземпляра в своем примере, чтобы показать что-то, что вы могли бы вообразить для многих классов, которые все хотят использовать. Почему бы просто не использовать их как переменные класса? Потому что эти константы имеют короткий и уникальный расчет, сделанный для них. Поэтому почти каждый класс и метод, который я использую, используют этот набор переменных производного экземпляра. Вот почему я пытаюсь разрешить всем своим классам доступ к ним. Возможно, вы близко подошли к ответу с вашим заявлением, «сделайте их [классы] разговаривать друг с другом». - здесь будет полезен код показа. –

+0

@TonyDiNitto Я хотел бы помочь вам, но, не глядя на ваш код, я не знаю, как его улучшить. Пожалуйста, разместите часть (не слишком длинную) своего кода, чтобы я мог получить то, что вы на самом деле пытаетесь решить. –

+0

Thx для последующего наблюдения. Я редактировал вопрос/код, чтобы, надеюсь, выяснить, что я прошу. –

Смежные вопросы