stuartrexking
stuartrexking

Reputation: 657

Any reason I should not be using send like this?

I am trying to keep my classes encapsulated as much as possible. Any reason that I should not use the send method like this?

class MyClass

  def self.join_two_strings(first, second)
    new.send(:join_two_strings, first, second)
  end

  def join_two_strings(first, second)
    first + second
  end

  private :join_two_strings
end

Upvotes: 0

Views: 56

Answers (3)

Boris Stitnicky
Boris Stitnicky

Reputation: 12578

To call the problem with your use of #send even more precisely, it is not verbosity, but obscuring of the design intent. Sometimes verbosity (such as using full words, rather than abbreviations) serves to reveal the design intent and shorten the time reader needs to understand your code. With your code example, the reader does not believe that what you want to achieve is mere joining of 2 strings, they keep searching for deeper meaning, before conceding that it is just a complicated method to do a simple thing (and possibly refactoring your code as Chris did). As for #send itself, do not fear it, do not fear to use it. Though #send should not be used as a tool to arbitrarily disrespect privacy of methods, on the other hand, Ruby methods are messages and you don't have to worry to be explicit about it, where there is a reason for it.

Upvotes: 0

sawa
sawa

Reputation: 168081

Yes, there is reason not to do that. It is because it is verbose. To achieve what you want, you should code like in Chris Heald's answer. (Chris Heald suggests what you should do, but does not answer your question).

Upvotes: 0

Chris Heald
Chris Heald

Reputation: 62638

Since #join_two_strings doesn't actually need any instance state, it should just be a class method.

class MyClass
  def self.join_two_strings(first, second)
    first + second
  end
end

Upvotes: 5

Related Questions