Class Variables vs. Class Methods
Just finessed refactoring a class where I had used class variables. The code was very simple:
class Demand def self.load(division, data) @@division = division @@data = data end def self.reset @@division = nil @@data = nil end def self.has_division(division) defined?(@@division) && !@@division.nil? && (@@division == division) end end
there's more to the class, but this points out that I'm using the class variables, and the API is really pretty simple. When I posted this as a pull request on GitHub, a guy on the team pointed out that others are going to want to modify the class variables to class methods as they are less dangerous.
I don't see the danger, when the API is the same, but I can understand the advantage of the class method approach - it makes it possible to stub() out the method in an spec test - which is nice as it simplifies the testing.
So I went back in and modified the code to look like:
class Demand def self.load(division, data) @division = division @data = data end def self.reset @division = nil @data = nil end def self.has_division(division) !self.division.nil? && (self.division == division) end private def self.division @division ||= nil end def self.data @data ||= nil end end
The code is slightly simpler because I don't have to worry about the possibility of an undefined reference in the has_division method, but that's about it. The real advantage has to be in the stub-factor for tests.
OK… I'm easy… I can do it that way.