Curso Ruby en el MUG

Encendemos los motores


Git

Lenguajes estructurados VS lenguajes orientados a objecto

Los programas son diseñados con el concepto de objetos, donde cada objecto contiene sus propias variables para guardar sus datos acerca o relevante para el objecto, y funciones para ejecutar acciones, ejecutar calculos, agregar datos a variables dentro del objeto, etc. Esto contrastado con Lenguaje de Programación Estructurados,en donde los programas son diseñados con colecciones de funciones que son llamadas en diferentes partes del programa, mas parecido a un script o lista de tareas.

Objectos

Un objeto es una combinación de datos y métodos. Los objectos se comunican entre si a través de métodos. Cada objecto puede recibir mensajes, enviar mensajes y procesar datos.
Hay dos pasos en la creación de objectos. Primero, definir una clase. Una clase es un template de un objecto. Es un modelo que describe el estado y comportamiento que todos los objectos de la clase comparten. Una clase puede ser utilizada para crear muchos objectos. Los objectos creados de una clase son llamados instancias.

El constructor (initialize)

Constructors cannot be inherited. The constructor of a parent object is called with a super method. They are called in the order of inheritance. Ruby has no constructor overloading that we know from other programming languages. This behaviour can be simulated to some extent with default parameter values in Ruby.

Attributes

The object attributes are called instance variables or member fields. An instance variable is a variable defined in a class, for which each object in the class has a separate copy.

Métodos

Methods are functions defined inside the body of a class. They are used to perform operations with the attributes of our objects. Methods are essential in encapsulation concept of the OOP paradigm.

Variable de instancia

@var

Variable de clase

@@var
    class Circle

    @@PI = 3.141592

    def initialize
        @radius = 0
    end

    def set_radius radius
        @radius = radius
    end

    def area
        @radius * @radius * @@PI
    end

    end  

Modificadores de acceso

Ruby has three access modifiers: public, protected and private

Herencia

The inheritance is a way to form new classes using classes that have already been defined. The newly formed classes are called derived classes, the classes that we derive from are called base classes. Important benefits of inheritance are code reuse and reduction of complexity of a program. The derived classes (descendants) override or extend the functionality of base classes (ancestors).

p Human.ancestors

Attribute accessors

attr_reader, attr_writer and attr_accessor.

Sobrecarga de operadores

  class Circle 
    attr_accessor :radius

    def initialize r
        @radius = r
    end

    def +(other)
        Circle.new @radius + other.radius
    end

    def to_s
        "Circle with radius: #{@radius}"
    end
  end


  c1 = Circle.new 5
  c2 = Circle.new 6
  c3 = c1 + c2

  p c3

Métodos de clase

3 modos:

self.info

class << self

Class.info

Método de instancia

Polimorfismo

El polimorfismo es el proceso de usar un operador o función de diferentes modos para diferentes datos.

  class Animal
      
      def make_noise 
          "Some noise"
      end

      def sleep 
          puts "#{self.class.name} is sleeping." 
      end
    
  end

  class Dog < Animal
      
      def make_noise 
          'Woof!'         
      end 
      
  end

Modules

Los módulos en ruby son una coleccion de métodos, clases y constantes. No pueden instanciarse, no soportan herencia.
Tienen 2 propósitos:

  • Organizar el código
  • Mixin -> similar a herencia múltiple

  #!/usr/bin/ruby

  module Device
      def switch_on ; puts "on" end    
      def switch_off ; puts "off" end
  end

  module Volume
      def volume_up ; puts "volume up" end    
      def volume_down ; puts "volume down" end
  end

  module Pluggable
      def plug_in ; puts "plug in" end    
      def plug_out ; puts "plug out" end
  end

  class CellPhone
      include Device, Volume, Pluggable
     
      def ring
          puts "ringing"
      end    
  end

  cph = CellPhone.new
  cph.switch_on
  cph.volume_up
  cph.ring
  • Include -> metodos en instancia
  • Extend -> metodos de clase

Excepciones

special conditions that change the normal flow of program execution. Exceptions are raised, thrown or initiated.
  x = 35
  y = 0

  begin
      z = x / y
      puts z
  rescue => e
      puts e
      p e
  end

  age = 17

  begin
      if age < 18
          raise "Person is minor"
      end
      
      puts "Entry allowed"
  rescue => e
      puts e
      p e
      exit 1
  end

ensure

  class BigValueError < StandardError ; end

  LIMIT = 333
  x = 3_432_453
      
  begin
      
      if x > LIMIT
          raise BigValueError, "Exceeded the maximum value"
      end
          
      puts "Script continues"
      
  rescue => e
      puts e
      p e
      exit 1
  end
Ver en GitHub