C
Chris Roos
I have a Person with title, forename and surname (all of which are
optional). I want to return a 'pretty' name for this person in the format..
title + <space> + forename + <space> + surname
..where any extraneous spaces are removed.
My name method currently looks like this
def name
(
(title.to_s.strip.empty? ? "" : title.to_s.strip << " ") <<
(forename.to_s.strip.empty? ? "" : forename.to_s.strip << " ") <<
(surname.to_s.strip.empty? ? "" : surname.to_s.strip)
).strip
end
I created seven tests for this method for each combination of the three
parameters. All seven tests pass with this implementation.
Note. I was half way through writing about how I should probably test
for nil and maybe return an empty string from the three (title,
forename, surname) methods when I realised that all I was really doing
was testing for nil in a roundabout way; i.e. convert possible nil's to
string then strip spaces then check for empty...
I started thinking about this some more and realised that a test for nil
would return false which would allow me to re-write the above method
like so..
def name
(
(title ? title.strip << " " : "") <<
(forename ? forename.strip << " " : "") <<
(surname ? surname.strip : "")
).strip
end
This gets rid of the nasty duplication and double question marks in the
first method.
I also realised that I needed another test - for all nil's. They all
still passed.
What I was originally going to ask was how to improve on the first
implementation above. Even though (in my opinion) the second
implementation is a lot cleaner I'm still interested in whether it can
be made even more succinct as in 'the ruby way'?
It may be a very small method and have taken me about an hour to go
through this process but I'm quite pleased as to how it's turned out.
Chris
optional). I want to return a 'pretty' name for this person in the format..
title + <space> + forename + <space> + surname
..where any extraneous spaces are removed.
My name method currently looks like this
def name
(
(title.to_s.strip.empty? ? "" : title.to_s.strip << " ") <<
(forename.to_s.strip.empty? ? "" : forename.to_s.strip << " ") <<
(surname.to_s.strip.empty? ? "" : surname.to_s.strip)
).strip
end
I created seven tests for this method for each combination of the three
parameters. All seven tests pass with this implementation.
Note. I was half way through writing about how I should probably test
for nil and maybe return an empty string from the three (title,
forename, surname) methods when I realised that all I was really doing
was testing for nil in a roundabout way; i.e. convert possible nil's to
string then strip spaces then check for empty...
I started thinking about this some more and realised that a test for nil
would return false which would allow me to re-write the above method
like so..
def name
(
(title ? title.strip << " " : "") <<
(forename ? forename.strip << " " : "") <<
(surname ? surname.strip : "")
).strip
end
This gets rid of the nasty duplication and double question marks in the
first method.
I also realised that I needed another test - for all nil's. They all
still passed.
What I was originally going to ask was how to improve on the first
implementation above. Even though (in my opinion) the second
implementation is a lot cleaner I'm still interested in whether it can
be made even more succinct as in 'the ruby way'?
It may be a very small method and have taken me about an hour to go
through this process but I'm quite pleased as to how it's turned out.
Chris