Trans
1/5/2007 3:49:00 AM
ara.t.howard@noaa.gov wrote:
> On Thu, 4 Jan 2007, Trans wrote:
>
> > Hi--
> >
> > I'm having a little debate with myself. On my current project I have a
> > bunch of little reusable task scripts that a command line tool runs.
> > The scripts are written as the top-level (although I actually simulate
> > the top-level when running them). So for example a script would just be
> > something like:
> >
> > # example.rb
> >
> > def example
> > puts "This is an example!"
> > end
> >
> > Then on the command line I would do:
> >
> > % mytool example
> > This is an example!
> >
> > That's all well and good, but many of the scripts have generally useful
> > routines and I would like them to be accessible by other programs too,
> > not just my command line tool. So I thoght maybe it would be better if
> > a module were required to wrap the defs.
> >
> > # another.rb
> >
> > module MyToolAnother
> >
> > def another
> > puts "This is another!"
> > end
> >
> > end
> >
> > That works, of course, but it adds an additonal layer of essentially
> > redundant code, which IMHO is ugly.
> >
> > Then I got to thinking. Why don't we write resuable lib in this fashion
> > anyway and just create our own containers on the fly when loading them?
> >
> > MyToolExample = load_as_module "example.rb"
> >
> > What intersting about that is then we could determine in what capacity
> > it is to be used. For example:
> >
> > # adds module_function
> > MyToolExample = load_as_function_module "example.rb"
> >
> > # adds self extend
> > MyToolExample = load_as_self_extended_module "example.rb"
> >
> > Or even
> >
> > MyToolExample = load_as_class "example.rb"
> >
> > We could even have include and extend take a lib path.
> >
> > include "example.rb"
> >
> > Of course this effectively puts encapsulation, at least at the top
> > level, on a per-file basis. But in many respects that seems kind of
> > nice. It increases flexability and reduces configuration complexity.
> >
> > So what do your think? Is this technique worth promoting? Or am I being
> > silly and should just wrap all my scripts in modules?
> >
> > T.
>
> wrap up the functionality into a lib, require that from your scripts, and make
> accessing instance methods from the command-line easy.
in this particluar case it's not suitable to separate the functionality
into separate lib b/c it's important that these scripts be
self-contained.
> i've used this pattern
> many times. here is an example from our NRT (near-real-time) system which
> allows me to call any module function from the command line:
>
> [snip examples]
>
> the result is that any library/module routine is instantly availible from the
> command line - makes testing a breeze!
>
> obviously not all routines are easy to use this way but, by sticking to simple
> interfaces/function call signatures many of them can be.
>
> it's a useful pattern.
>
> food for thought.
very cool. yea, i wondn't mind adding a tool like that to my current
project. i wonder how extensive a tool like that could be. would it be
possible to run arbitrary methods --even if they were in classes or
non-function modules?
T.