From: Robert Klemme Date: 2007-06-03T02:00:20+09:00 Subject: Re: Module/Class Organization On 02.06.2007 18:02, Trans wrote: > I wonder what's the general consensus on modular organization. Overall > there seems to be four general approaches. > > 1) BASE CLASS > > ActiveRecord, uses this design: > > module Foo > > class Base > end > > class Bar < Base > end > > end I'd rather call this "namespace" because that's what the module is all about here. IMHO this is the best approach for custom libs because it helps keep namespaces clean. Also, if someone is using classes from this module only, it's easy to place an include Foo at the top of the script to pull all classes defined in Foo into the current namespace. > 2) BASE CONTAINER > > An alternative is to call the base class Foo and use it as a > container: > > class Foo > ... > > class Bar < self > end > > end IMHO that's the worst of all presented approaches because it combines two mechanisms that create dependencies between classes (inheritance and nesting) that support different aims. I'd use nesting for classes that are closely related to the outer class and make most sens in this connection. Inheritance (besides delegation) is the usual way to extend classes, probably even from another module / lib. > 3) EXTERNAL BASE > > In this case the organizing module contains a plurality of > subclasses. The base class is external to this module. > > class Foo > end > > module Foos > > class Bar < Foo > end > > end I haven't seen this one and would not do it because it does not ensure proper use of namespaces. > 4) BY NAME > > No container modules, just use naming: > > class Foo > end > > class BarFoo < Foo > end I would not use this one in a custom lib because namespaces are really a better grouping mechanism than name suffixes. Even if you use BarFoo as subclass name I'd rather do it in a module. > Which is better? Are there serious advantages/disadvantages to any of > these? There are probably more pros and cons but when I would be writing a lib I'd certainly use the first approach. Kind regards robert