Advice to put class inside a ruby module


#1

Hi,

I’m coding inside Sketchup seen 5 years now, but I learn by my self. I have still a big doubt about class and module in Sketchup ruby api. I use the Sketchup’s method of extension folder, rbz…

To isolate all my code, I create a module that I call “Adebeo_customerName_pluginName”.
After that all function are code in different file and a different module call “Adebeo_customerName_pluginName_featureName”.

After I extend the main module “…_pluginName” with all the “…_featureName”.
It’s works find but my doubt come when a create class. I create class with the name “Adebeo_customerName_className” without include,extend or anything … I don’t find this very clean because in my opinion this class should be include inside the main module “…_pluginName”.

Every time, I spend 10 minutes to test something to do it’s a fail because this things are not very clear to me.

If you have any advice, please give it to me.

Best regards.

Denis


#2

Salut Denis!
You use good namespacing with a hierarchy of author, customer, plugin name, feature. But by using underscore inbetween, it all turns into one long module name and the module is placed at top level. So for example when you list all top-level modules in Ruby, you would get something like Array, …, Sketchup and then maybe a ten modules of your plugin.

In order to nest modules inside each other you can write like this:

module Adebeo
  module CustomerName
    module PluginName
      class FeatureName
      end
    end
  end
end

Ruby uses double colon for accessing nested modules/classes/constants. So you can access a module like Adebeo::CustomerName::PluginName. That’s similar how you wrote it with underscores above, but with the difference that now modules are nested. Adebeo is the only top level module, and the others are included inside.

When the outer modules are already defined, you can define nested modules also like this:

module Adebeo::CustomerName::PluginName
  # module content
end

When you are “inside” a module, you don’t need to write the full nested module name:

module Adebeo::CustomerName
  def self.some_method
    PluginName.some_other_method()
    PluginName::FeatureName.new()
  end
end

#3

Thanks a lot for this clarification AERilius


#4

Also see this simple example template:
[Template] Ruby Plugin main file