:: Topo :: doCoding :: Linguagens de Programação :: Ruby :: FORPC101 ::

Week-06

Aprendizagem

  1. O método load() inclui o source file de cada vez que é executado.
  2. O método require(), mais comum, apenas inclui o source file da primeira vez que é executado.
  3. As classes não são fechadas, são abertas, pelo que podem ser estendidas com novos métodos.
  4. Uma classe apenas pode herdar (descender) de uma e de uma só outra classe. Não é possível ter classes com herança múltipla.
  5. O método super():
    • sem argumentos evoca o método da classe base com o mesmo nome do método da classe derivada que evoca super, passando-lhe os mesmos argumentos passados ao método overrided.
    • sem argumentos e evocado como super() em vez só de super evoca o método da classe base mas sem lhe passar os argumentos.
    • com argumentos evoca o método da classe base apenas com esses argumentos, explicitamente.
  6. Uma classe derivada (sub-classe) pode fazer o override a métodos da classe base (super-classe).
  7. Uma classe pode redefinir um método, mas apenas a última definição prevalece. Isto evita que seja possível fazer overloading a métodos.

Exercícios

Exercício 1

exercise-01.rb

=begin
Write a class UnpredictableString which is a sub-class of String.
This sub-class should have a method called scramble() and which works on any string as follows:
 
>ruby unpredictablestring.rb
daano.r n sdt a htIsw taikmgy r
>Exit code: 0
# the original string was: "It was a dark and stormy night."
=end
 
class UnpredictableString < String
 
  def scramble
    self.split('').sort_by { rand }.join
  end
 
end
 
unpredictable_string = UnpredictableString.new('It was a dark and stormy night.')
puts unpredictable_string.scramble

Exercício 2

exercise-02.rb

=begin
This exercise thanks to Kathy Sierra.
Once upon a time in a software shop,
two programmers were given the same spec and told to "build it".
 
The Really Annoying Project Manager forced the two coders to compete,
by promising that whoever delivers first gets one of those cool Aeron chairs
all the Silicon Valley guys have.
 
The spec:
There will be shapes on a GUI, a square, a circle and a traingle.
When the user clicks on a shape, the shape will rotate clockwise 360 degrees (ie. all the way around)
and play an AIF sound file specific to that particular shape.
 
Go for it guys and show me your code.
=end
 
class Shape
 
  @aif_sound_file_name
 
  def initialize(file_name)
    @aif_sound_file_name = file_name
  end
 
  def rotate_clockwise(angle = 360)
    puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.'
  end
 
  def play_sound
    puts 'Playing AIF SoundFile: ' + @aif_sound_file_name
  end
 
  def click_event
    rotate_clockwise(360)
    play_sound
  end
 
end
 
class Circle < Shape
 
  def initialize
    super('circle.aif')
  end
 
  def rotate_clockwise(angle = 360)
    puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.'
  end
 
end
 
class Triangle < Shape
 
  def initialize
    super('triangle.aif')
  end
 
  def rotate_clockwise(angle = 360)
    puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.'
  end
 
end
 
class Square < Shape
 
  def initialize
    super('square.aif')
  end
 
  def rotate_clockwise(angle = 360)
    puts self.class.to_s + ' rotation of ' + angle.to_s + 'º clockwise.'
  end
 
end
 
shape = Shape.new('shape.aif')
shape.click_event
 
circle = Circle.new
circle.click_event
 
triangle = Triangle.new
triangle.click_event
 
square = Square.new
square.click_event

Questionário

Referências

Considerações

Pontos Altos

Esta secção regista o que considero serem os pontos altos da linguagem Ruby quando comparada com outras linguagens que conheço.

  1. É realmente uma linguagem object-oriented, de raíz.

Pontos Baixos

Esta secção regista o que considero serem os pontos baixos da linguagem Ruby quando comparada com outras linguagens que conheço.

  1. Será que a impossibilidade de poder realizar method overloading é um problema? Em principio não. Pela minha experiência os construtores de uma classe normalmente partilham código, que por (mau) hábito é “clonado” entre cada um. Visto o Ruby permitir a passagem de um número variável de argumentos parece-me, à primeira vista, que a solução Ruby é mais prática e concisa.
 
docoding/languages/ruby/forpc101/week-06.txt · Modificado em: 2008/09/25 10:08 por straider     Voltar ao topo