For newer developers (i.e. me), conditionals are our first opportunity to see real programming logic in action. We get to make a computer do the thinking for us. If this happens, do this, if not, do this instead.

Unfortunately, once a newer programmer has a good understanding of if and else statements, some bad habits can start to occur.

In previous posts, I've referenced our Character class, seen here:

# character.rb class Character def initialize ( name , health = 100 ) @name = name . capitalize @health = health end def health health = @health end def power_up @health += 10 end def power_down @health -= 10 end def character_info " #{ @name } has a health of #{ @health } " end end

If we wanted to determine whether or not a Character is healthy, we may think about writing some code like this:

# character_health.rb character1 = Character . new ( "Joe" , 80 ) if character1 . health >= 85 puts "Healthy" else puts "Unhealthy" end

If we ran this piece of code, we would see an output of "Unhealthy" (poor Joe). But really, this little bit of code is violating the "Tell, Don't Ask" principle. We're getting the health of a character and then making a determination based on that information whether or not this character is healthy. We're asking, rather than telling.

A Character should be telling us whether or not its healthy. We shouldn't be asking it. Which means our if/else statement (or something equivalent to it) should live in the character.rb file. Also, since we're dealing with a true or false situation (either the character is "healthy" or "unhealthy"), we can be using a boolean.

Going back to our character.rb file, we can add this code to our Character class.

# character.rb class Character . . . def healthy? @health >= 85 end

Now we're telling any instances of the Character class, "you are healthy if your health is greater than or equal to 85."

If we still wanted to output a string saying whether or not a character is "healthy" or "unhealthy", we could simply add a new status method.

# character.rb class Character . . . def healthy? @health >= 85 end def status healthy? ? "Healthy" : "Unhealthy" end

There, nice and clean one-line methods! Hope this help some other new Rubyist out there.