On  7 Jan, Holden Glova wrote:
> Hello all,

Hello you, :-)

(...)

> I have never had an exposure to anything like mixins throughout my
> degree and sadly am feeling quite lost, which I'm sure will pass with
> time and hopefully the patience of the list as I ask silly questions
> about this topic.

do not feel to sad! It is not such a big issue. What makes it a bit
difficult to explain, however, is that due to Ruby's flexibility and
power, the answer comes in three flavours, at least. You know, although
Ruby is a real and complete OOL, it let *you* decide to use which
paradigm to program in. It do not force you to use OOP at all.

The three paradigms, Ruby supports and I want to mention, are:

o Procedural programming
  In this paradigm you use classes as struct/record like datatype
  definition. Or you can use the class OpenStruct for this
  purpose instead.

  Modules, however, will be used to build ... ehrm ... just modules. ;-)
  Namespaces to group functions and data together. Much like in e.g.
  Modula 2, Oberon, Turbo Pascal's Units or even C++ namespaces. But
  modules, of course, can do much more ...

o OOP (Class based)
  Here modules have additional sense. You can use them like in the
  procedural programming, explained above, but you can use them also to
  group functionalities together. These functionalities have not
  necessarily anything to do with any certain class.

  A good example is e.g. the module Enumerable. This module contains
  many functionalities (coded using methods) that describe tasks that
  could be applied to any container/stream or whatever like instance
  that can iterate thru its contained objects via method 'each'.

  You could see a module as the brother at the other end of the spectrum
  of class based OOP. Classes describes objects and the methods that
  could be applied on them. Modules describe functionalities that could
  be applied to *any* object, iff certain preconditions (e.g. existence
  of certain method(s)) are met. Or using another POV: A class group
  data, making the internal state of an object and some code that could
  be applied on *that* set of data, whereas a module group tasks
  (code) together that seeming to belong into same family but not
  necessarily depending on an object's internal state.

  In languages like C++ or even Python, there is no such concept like
  Ruby's modules. Here you have to mis-use (IMHO, of course) classes to
  group only functionalities and use them via multiple inheritance. Not
  worth the trouble IMO, as *true* multiple inheritance (A is_a B and A
  is_a C) is really seldom necessary!

o Classless OO
  That paradigm is also called prototype based programming. Here you
  really didn't need classes to do anything in your program. While in
  'classic' OO, you need to create a class to describe the objects
  (means instances) you want to create, in classless OO you simply build
  concrete, ready-to-use objects with desired structure and behavior. If
  you need more then one instantiation of such an object, you simply
  clone an already existing one and have two of them then.

  In Ruby you can also use modules here to build the concrete objects of
  prototype based system. By doing this, modules will therefore not only
  contain similar functionalities, unlike in the class based OO, but
  also data to reflect internal state of that special object. A further
  usage of modules in Ruby ...

Of course, nobody will prevent you from mixing these all in your program
;-)

> What I really don't understand is when do I use a module? How do I
> know that I should have a class in this module that is to be
> "extended" from in it's useage. What heuristics do you folks use?
> What patterns do you follow that spark these design decisions?

Reading my sermon above, you possibly may get some hints for what
modules can be good for. Of course Ruby will not enforce you to chose
one way over another one for your programming. All is anytime available.
Use whatever you want to use. Ruby "(...)stays out of your way(...)" and
features all your ideas!

A further hint: please do not restrict yourself by using a classical
approach! Try to find out what meets your needs and decide *then*. I
have tried to show you only the beginning of the way, the rest you will
have to find out for yourself on your journey; and all the fun is on
that journey, indeed :-)))

Perhaps tell us later, what you have found then, yes? :-)

> Thanks in advance for any contributions to this topic.

(...)

> Signed,
> Holden Glova


HTH,
\cle