views:

272

answers:

2

I'm considering writing a (large) desktop application in Ruby (actually a game, think something like Angband or Nethack using Gtk+ for the GUI). I'm coming from a C#/.NET background, so I'm a little at a lost for how to structure things.

In C#, I'd create many namespaces, like Application.Core, Application.Gui, etc). Parts of the application that didn't need the Gui wouldn't reference it with a using statement. From what I understand, in Ruby, the require statement basically does a textual insert that avoids duplicated code. What I'm concerned about, through the use of require statements, every file/class will have access everything else, because the ordering of the require statements.

I've read some ruby code that uses modules as namespaces. How does that work and how does it help?

Not sure what I'm getting at here... Does anyone have any good pointers on how to structure a large Ruby application? How about some non-trivial (and non-Rails) apps that use Ruby?

A: 

Some of your problem isn't particular to Ruby, it's just about circular dependencies. Does Core depend on Gui or does Gui depend on Core? Or both?

A good way around some of this problem is with a very small "runner" component that depends on the core, the data access components, the gui, and so on, and ties these all together.

Kevin Peterson
No, it doesn't. I've already got a runner, but it basically does a bunch of requires and creates the GUI and runs it.
Mark A. Nicolosi
+3  A: 

Ruby is no different from any other language when it comes to structuring your code. Do what feels right and it will probably work. I'm not entirely sure what problem you are anticipating. Are you worried about name clashes?

Modules are a good way to get pseudo namespaces, eg.

module Core
  class Blah
    self.def method
    end
  end
end

Core::Blah.method
Henry
Of course, that would not work semantically because 'blah' needs to be constant and you would access it like this - Core::Blah.method - if "method" was a class method. Still, +1
Ed Swangren