I have a two part question
Best-Practice
- I have an algorithm that performs some operation on a data structure using the public interface
- It is currently a module with numerous static methods, all private except for the one public interface method.
- There is one instance variable that needs to be shared among all the methods.
These are the options I can see, which is the best?:
- Module with static ('module' in ruby) methods
- Class with static methods
- Mixin module for inclusion into the data structure
- Refactor out the part of the algorithm that modifies that data structure (very small) and make that a mixin that calls the static methods of the algorithm module
Technical part
Is there any way to make a private Module method?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
The private
in there doesn't seem to have any effect, I can still call Thing.priv
without issue.
There's also
Module.private_class_method
, which arguably expresses more intent.For the code in the question:
Ruby 2.1 or newer:
The best pattern that I've found by doing this in Rails is to give up on modules that want to have private methods and use a Singleton class instead. It doesn't feel right but it does work and seems cleaner that then other examples I've seen in this question.
Would love to hear other opinions on this.
Example:
You can use the "included" method to do fancy things when a module is mixed in. This does about what you want I think: