From: Josh Cheek Date: 2011-05-06T04:47:36+09:00 Subject: Re: Cross access between instance variables --0016e64b906c0214cf04a28ca550 Content-Type: text/plain; charset=ISO-8859-1 On Thu, May 5, 2011 at 2:06 PM, Stefan Salewski wrote: > I am working on a larger Ruby program, where instance variables of one > class need access to content of another class -- I wonder how I should > solve this problem best. > > Assume we have multiple fish tanks, each with multiple fishes. The > fishes should tell us if they like the temperature of the water. We can > solve this task when we gave each fish a reference to its tank: > > stefan@AMD64X2 ~/pet $ cat fish_tank.rb > class Fish > def initialize(name, favorite_temperature, tank) > @tank = tank > @n = name > @t = favorite_temperature > end > def tell_state > if @tank.temperature < @t > puts 'I feel cold' > elsif @tank.temperature = @t > puts 'I feel well' > else > puts 'I feel hot' > end > end > end > > class Tank > attr_accessor :fish > attr_reader :temperature > def initialize(temperature) > @temperature = temperature > @fish = Array.new > end > end > > t1 = Tank.new(18) > f1 = Fish.new('Ruby', 21, t1) > t1.fish << f1 > t1.fish.each{|f| f.tell_state} > > I am more familiar with a situation, where the tank is a module, so the > fish can access module variables. But now we really need many tanks, > each with very many fishes. Currently it seems to be a bit strange > giving each of thousands fishes a reference to its tank. Another > solution may be to give the .tell_state() function a tank parameter each > time when we call it. (A tank-temperature parameter is not a good idea, > because we may need more, light, food...) > > (For my real application the tanks are windows, and fishes are graphical > elements in each window, see > http://www.ssalewski.de/PetEd-Demo.html.en) > > Do I miss something? > > Best regards, > > Stefan Salewski > > > > Great question! It's especially important when the fish / tank start affecting each other, ie cold tank takes away 10 life units from the fish, should the tank do this to the fish, or should the fish look at the tank and do it to itself? If it should be the fish, then what if it only happens during certain tank conditions such as proximity to other fish? So maybe it should be the tank doing this task, but what if the fish is feeling friendly that day, and can tolerate proximity to other fish? They are so dependent on each other, who is responsible for what, and how should that relationship be established? I'm eager to see responses to this, I've run into the same issue in the past, and was never satisfied with my solutions. --0016e64b906c0214cf04a28ca550--