Explanation on how "Tell, Don't Ask" is considered good OO
        Posted  
        
            by 
                Pubby
            
        on Programmers
        
        See other posts from Programmers
        
            or by Pubby
        
        
        
        Published on 2012-07-20T00:30:47Z
        Indexed on 
            2012/11/14
            23:17 UTC
        
        
        Read the original article
        Hit count: 440
        
This blogpost was posted on Hacker News with several upvotes. Coming from C++, most of these examples seem to go against what I've been taught.
Such as example #2:
Bad:
def check_for_overheating(system_monitor)
  if system_monitor.temperature > 100
    system_monitor.sound_alarms
  end
end
versus good:
system_monitor.check_for_overheating
class SystemMonitor
  def check_for_overheating
    if temperature > 100
      sound_alarms
    end
  end
end
The advice in C++ is that you should prefer free functions instead of member functions as they increase encapsulation. Both of these are identical semantically, so why prefer the choice that has access to more state?
Example 4:
Bad:
def street_name(user)
  if user.address
    user.address.street_name
  else
    'No street name on file'
  end
end
versus good:
def street_name(user)
  user.address.street_name
end
class User
  def address
    @address || NullAddress.new
  end
end
class NullAddress
  def street_name
    'No street name on file'
  end
end
Why is it the responsibility of User to format an unrelated error string? What if I want to do something besides print 'No street name on file' if it has no street? What if the street is named the same thing?
Could someone enlighten me on the "Tell, Don't Ask" advantages and rationale? I am not looking for which is better, but instead trying to understand the author's viewpoint.
© Programmers or respective owner