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