I am just starting Ruby and learning the concept of modules. I understand that one use of modules is to better organize your code and avoid name clashes. Let’s say I have bunch of modules like this (I haven’t included the implementation as that’s not important)
:
module Dropbox
class Base
def initialize(a_user)
end
end
class Event < Base
def newFile?
end
def newImage?
end
end
class Action < Base
def saveFile(params)
end
end
end
and another module:
module CustomURL
class Base
def initialize(a_user, a_url, a_method, some_args, a_regex)
end
end
class Event < Base
def initialize(a_user, a_url, a_method, some_args, a_regex)
end
def change?
end
end
class Action < Base
def send_request(params)
end
end
end
I am going to have a bunch of these modules (10+, for gmail, hotmail, etc…). What I am trying to figure out is, is this the right way to organize my code?
Basically, I am using module to represent a “service” and all services will have a common interface class (base for initializing, action for list of actions and event for monitoring).
You are defining families of related or dependent classes here. Your usage of modules as namespaces for these families is correct.
Also with this approach it would be easy to build abstract factory for your classes if they had compatible interface. But as far as I see this is not the case for current classes design: for example
Dropbox::EventandCustomURL::Eventhave completely different public methods.You can reevaluate design of your classes and see if it is possible for them to have uniform interface so that you can use polymorphism and extract something like
BaseEventandBaseActionso that all Events and Actions will derive from these base classes.Update: As far as you define services, it might be useful to define top-level module like
Serviceand put all your classes inside this module. It will improve modularity of your system. If in the future you would refactor out some base classes for your modules services, you can put them in the top-level namespace. Then your objects will have readable names like these: