Forum: Ruby code organization

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
73700e119917433681f2e8f3e4369f74?d=identicon&s=25 Li CN (alex-osu3)
on 2009-06-06 18:07
Hi all,

What are the differences bewteen the following code organization?
What situations are preferred by each one?

Thanks,

Li

#######code 1#############
module A
   class B end
   class C end
end



#######code 2#############
class B
   include module A
end

class C
  include module A
end
753dcb78b3a3651127665da4bed3c782?d=identicon&s=25 Brian Candler (candlerb)
on 2009-06-06 18:54
Li Chen wrote:
> What are the differences bewteen the following code organization?
> What situations are preferred by each one?

In code 1, module A is just acting as a namespace, so that you have two
classes, A::B and A::C. This is useful to ensure that your class names
don't stomp on anyone else's use of the same names. All you have to do
is ensure name A is unique.

Code 2 doesn't run as it stands, so you need to rewrite as:

module A; end

class B
   include module A
end

class C
  include module A
end

In this case, instance methods defined in module A are available in both
class B and class C. This is almost the same as subclassing B and C from
class A. B and C also get access to any constants defined in the A
namespace, without needing the A:: prefix.

So in summary: they achieve two completely different ends (namespace
separation, and method sharing, respectively)
73700e119917433681f2e8f3e4369f74?d=identicon&s=25 Li CN (alex-osu3)
on 2009-06-06 20:00
Brian Candler wrote:
> So in summary: they achieve two completely different ends (namespace
> separation, and method sharing, respectively)

Hi Brian,

Thank you so much.

As I recall correctly module has two major funtions/purposes:
1) namespace separation 2) mixin. So you mean in the second code it
works as a mixin or method sharing?


Li
Fbb4d027695dfdf76bf448b15d7e306a?d=identicon&s=25 matt neuburg (Guest)
on 2009-06-06 21:31
(Received via mailing list)
Li Chen <chen_li3@yahoo.com> wrote:

> module A
>
> class C
>   include module A
> end

They are totally different, and they illustrate the two main purposes of
a module. Neither is legal as you have it so I will change the code to
make it legal.

##### 1 ######

module A
   class B
   end
end
A::B.new

A is a namespace, so you must say A::B from outside module A to refer to
B.

##### 2 #####

module A
   def hello
     p "howdy"
   end
end
class B
  include A
end
B.new.hello

Module A's instance methods are copied into class B as instance methods
("mixin").

m.
753dcb78b3a3651127665da4bed3c782?d=identicon&s=25 Brian Candler (candlerb)
on 2009-06-07 19:36
Li Chen wrote:
> As I recall correctly module has two major funtions/purposes:
> 1) namespace separation 2) mixin. So you mean in the second code it
> works as a mixin or method sharing?

Yes, mixin or method sharing (two terms to describe the same thing)

Re-reading, there's another error I didn't fix in that example: it
should say "include A" not "include module A"
This topic is locked and can not be replied to.