I find myself often wondering about some design choices that result from
code which looks similar to the contrived example below.
class Places
attr_reader :addresses
def initialize(some_source)
@addresses = []
@raw_addresses = []
load_addresses(some_source)
end
def load_addresses(some_source)
some_source.each do |this_source|
@raw_addresses << this_source.address
end
clean_addresses
end
private
def clean_addresses
@raw_addresses.each do |this_address|
@addresses << GisTools.normalize_address(this_address)
end
end
end
Testing for the final results of @addresses is easy as the instance var
is exposed through the attr_reader, but there’s two problems:
A) Testing clean_addresses is dependent on running load_addresses first
in order to acquire data.
B) Seeing the intermediate results of @raw_addresses is not possible for
testing load_addresses independently because @raw_addresses is not
exposed.
To fix (A), we could insist on passing parameters. So, we would have:
def load_addresses(some_source)
some_source.each do |this_source|
@raw_addresses << this_source.address
end
clean_addresses(@raw_addresses) # <----- passed explicitly
end
private
def clean_addresses(raw_addresses) # <----- passed explicitly
raw_addresses.each do |this_address|
@addresses << GisTools.normalize_address(this_address)
end
end
That would allow clean_addresses to be tested independently and be fed
data directly by the test which could be a good thing. Regardless of
that advantage, I’ve often wondered if requiring the passing of instance
vars as parameters really is a ‘higher standard’ or not. I see a lot of
code both ways. I tend to believe it’s better to be explicit, but admit
it feels simpler in many cases to just use the hard-coded instance var.
I find myself flip flopping (always a bad thing).
Either way, I still can’t see the results of @raw_addresses. I find
myself having to expose :raw_addresses so that tests can see the
results, but there really is no need for :raw_addresses to be exposed,
and it shouldn’t be a part of the interface.
Questions:
- Any consensus on the parameters issue (always pass params, or
usually)? - What’s the ‘best practice’ approach to seeing the results of
@raw_addresses?
Many thanks for the discussion.
– gw