On Behalf Of 7stud --:
# 1) When the Test module isn't included in order to avoid 
# potential name 
# clashes of Test's methods with other methods having the same 
# name, being 
# able to call all the methods using the syntax: Test.name.
# 
# 2) When the Test module is included in order to avoid having 
# to to type 
# the module name in front of the method names and name clashes 
# aren't a 
# concern, being able to call all the methods using the syntax: name.

do not forget third use of module_function since it's one of the nifty features..

3) being able to change the module methods (or module "functions" so to speak) independently of the original methods. Remember, module functions are copies of the original, 

ergo you can just modify the copies...

irb(main):050:0> module Test
irb(main):051:1>   def show
irb(main):052:2>      puts "This is a new show"
irb(main):053:2>   end
irb(main):054:1>   def f
irb(main):055:2>      puts "This is a new goodbye"
irb(main):056:2>   end
irb(main):057:1> end
=> nil

let's test the original first...

irb(main):058:0> Test.show
testing
=> nil
irb(main):059:0> Test.f
goodbye
=> nil

ok, no change in original
now, see the change of the copy...

irb(main):060:0> show
This is a new show
=> nil
irb(main):061:0> f
This is a new goodbye
=> nil

kind regards -botp