Programación Orientada a Objetos

CLASE (concepto) → instanciación → OBJETO (tangible)

Ejemplo, la Clase es el molde de un soldadito de plomo, y el muñeco sería el objeto.

  • Abstracción.

  • Herencia (paso de características y descripción de uno a otro, tendremos clase principal y derivada). Esas ideas abstractas que describimos mantienen una relación entre ellas. Esas relaciones lo que nos permiten es generar, al igual que la realidad, clases que basan su comportamiento, forma, etc. en otras clases que están definidas previamente. Nos va a permitir crear objetos altamente complejos sin necesidad de tener que crearlos desde cero. Esto es fundamental, hay lenguajes que les falla la herencia, así que no podemos decir que sea orientado a objetos (como visual basic al principio). Funcionará de forma muy parecida a como funciona la genética. Una clase que hereda será mucho más concreta que otra, según bajemos en el árbol de herencia las clases serán más concretas. ¿qué ventajas ofrece la herencia? aparte de definir rápido las características... la variabilidad muy alta de nuestro código, porque de una sola clase que creemos de forma adecuada con el suficiente nivel de abstracción, podremos obtener una multitud de clases que nos servirán para muy distintos cometidos con cambios minúsculos. Por ejemplo, si tenemos una clase A y derivo una clase B, esto es una herencia directa de primer orden, A sería de primer orden, clase madre, superclase... B sería derivada, hija. B puede a su vez tener una clase derivada C, porque C tendrá una herencia indirecta de A, la recibe de lo que ha heredado B de A, también lo que hereda de A recibe todo lo que tiene B. C será herencia directa de B e indirecta de A, C será derivada de segundo orden de A. Estas líneas de unión forman la línea de herencia y nos permiten ir viendo lo que hay. Esto visto es una herencia simple (sólo tengo un padre), sin embargo, existe la posibilidad de recibir una herencia múltiple, normalmente de dos. La herencia múltiple es maravillosa, c++ nos dan herencia múltiple, permite heredar directamente las características de dos clases que pueden ser entre sí muy distintas. Ej, clase hombre-lobo que deriva de la clase hombre y lobo, a hombre-lobo le añadiríamos la capacidad de transformación, la luna llena, etc. Nosotros en los lenguajes con los que trabajaremos no lo veremos porque sólo trabajaremos con la herencia simple, veremos trucos para poder hacer cosas similares.
¿Heredamos todo? NO, solo lo que el creador haya decidido que se herede. Las variables globales serán prohibidas, las variables las llamaremos privadas, que son aquellas que se conocen exclusivamente dentro de la clase, ni siquiera las clases que se hereden tendrán conocimiento de ellas. Esta característica no se la enseño al exterior, pero sin embargo, mis descendientes sí. No transmitimos todo, solo lo que queramos y solo daremos acceso a lo que nos permita dar acceso.

  • Encapsulación/ocultación (encapsulamiento/ocultación): ligado a ocultación. Una clase debe ser autónoma, autosuficiente, debe funcionar como una “caja negra”, algo que su interior permanece opaco, oculto e inaccesible. Son principios bien diferenciados, trabajaremos con ellos por igual pero son distintos.
Lo que me dice es que todo lo que una clase necesite debe ir introducido dentro de la clase, empaquetada, aislada del exterior, de tal manera que no voy a dejar que cualquiera acceda a mi paquetito, dejaremos unos canales para ello (extrae información...)
¿para que encapsulamos las cosas? Para poder incrementar la cohesión, la estabilidad, ya que al tenerlo todo en un mismo sitio, empaquetado y ordenado, evitamos que se nos queden trozos de código descolgadas de lo que sería nuestra clase, ¿en que se traduce? que trabajaremos con la modularidad dentro de los programas orientados a objetos, las clases tendrán sus propios fichero y espacios de trabajo, delimitadas de dónde hasta dónde llegarán.(ver wikipedia, posiblemente lo define de manera similar a esta) La ocultación se basa en la teoría de la caja negra, lo que no sabes, no te hace daño, todo lo que es el interior de la clase, todo lo que no esta destinado a establecer una comunicación con el exterior, NADIE tiene porque verlo, ni saber ni siquiera de su existencia, “ves lo que hago, lo que pido y doy, pero no vas a saber como lo hago, y no vas a saber qué lo hace”. Ejemplo de porque cuando nacemos tenemos los órganos ocultos como seres humanos.

  • Polimorfismo: que al ser de una clase puede ser al mismo tiempo varias cosas. Ej, el profe es un hombre, y puede meterse en la piel de un ser humano, puede meterse en la piel de un mamífero, ¿puedo ser humano y mamífero? sí. Luego, podemos ser cualquier cosa de la línea de herencia.
Podemos adoptar múltiples formas. Un objeto puede adoptar un aspecto, una interfaz de aquellas clases que están en su línea ascendente. Ej, asiento → silla, la silla tiene sus características, el asiento no (por eso esta en orden superior), pero la silla se puede comportar como un asiento, luego en un momento determinado la silla puede funcionar como un asiento, obviando el respaldo, esto quiere decir que adopta la piel del asiento, cuando la silla funciona como asiento, no podemos hablar del respaldo (pero no lo pierde, y no lo podemos utilizar). Imagina que asiento y silla, son hombre → astronauta, y nos vamos a marte. el astronauta es un hombre, pero sabe de determinadas características, lleva un traje que le da estabilidad térmica y además le proporciona un analizador químico de la atmósfera, respirar en ambientes que un ser humano no puede hacerlo, y puede visualizar datos que un ser humano no puede ver, cuando un astronauta se comporta como un ser humano no tiene el traje. si lo metemos en la piel de hombre, deja de tener las características del astronauta. En eso consiste el polimorfismo. Imaginad que tenemos botones, 3, el azul, negro, y rojo, cada uno con características distintas, ¿como puedo saber que me pulsan un botón? Como los tres son botones, se comportan como botones, sólo con las características de botón.


    Aparte de cumplir con estos principios, todo lo que haya dentro de ese lenguaje han de ser clases. Tenemos que crear objetos a partir de las clases. Todo estará definido como CLASES. Cesar cumple como todo esto y cumple con las clases. Es un lenguaje bastante moderno y coge, por una parte lo mejor de c++, c y lo mejor de java. Java, por ejemplo se cumplen los 4 principios, pero no todos los elementos son clases, tenemos acceso a las primitivas, datos de variables que no son clases, así que ya no es orientado a objetos 100%. C++, es la extensión orientada a objetos de C. Otro lenguaje que es muy de moda es O-C |objective c| desarrollo de iphone, ha pasado a ser conocido por la cantidad de desarrollo de aplicaciones que hay para él, es una mezcla de java y c++. PHP tiene orientación a objetos a partir de la versión 6, javascript tiene tb cierta orientación a objetos.

¿qué elementos definen una CLASE?

Si definimos una variable y exponemos al exterior esa variable estamos dando acceso al exterior y podrá meter lo que él quiera. Tendremos estado y estado interno. Estado son los elementos que ponemos al exterior, aquellos elementos visible desde fuera, el estado interno son aquellos elementos a los que tenemos acceso, son única y exclusivamente nuestros, nadie podrá acceder a ellos, ese estado interno será “nuestro depósito de aire”, lo ocultaremos y nadie tendrá acceso nunca. Ej, el corazón es un estado interno, los pulmones tendrían un estado externo que permite la entrada y salida de aire.
Los estados estarán compuestos por características, si estoy creando una clase alumno, sus características serán nombre, nota fin de curso, nora de practicas... si hago una ficha policial, serán color de ojos, estatura, color del pelo...
De qué dependen las características, de qué queramos hacer con ella, no será igual para recurso humanos que para una ficha policial, si podremos hacer una común para ambas, la longitud es una característica que será de lectura y escritura, porque podremos modificar esa característica, la estatura no se puede modificar, solo veremos el dato, desde fuera no, al igual que el color de ojos, longitud de uñas, no podremos incrementar la longitud, pero sí recortarla. Dentro de los estados tendremos los métodos. Los métodos son las accione,s las funcionalidades que pueden realizar esa clase, ej, un ser humano, puede correr? sí, esto sería un método. Con este método le damos la posibilidad de correr, puede volar?, no, el ser humano no lo tendría, pero un murciélago sí. Tendríamos adjetivos y verbos, el adjetivo, las características, los verbos serían las acciones los métodos. Con los métodos hay que tener cuidado, porque no son propios de la clase. Ej, el alumno ¿tendría el método aprobar? No, alguien le aprueba.
¿Cómo influye una clase externa sobre nosotros? Con mensajes, comunicaciones que existen entre las clases y el sistema  y viceversa. Las clases serán origen y destino de mensajes, pueden empezar una comunicación o el destinatario de esa comunicación. Estos mensajes los definimos con las relaciones que tienen entre las clases, serán unos de los gráficos UML que nos harán falta para definir estos conceptos que estamos viendo.
¿Cómo se recibe un mensaje? porque nos han alterado una propiedad o a través de algo que denominamos “evento”. Cuando definimos un evento de una clase, a esa funcionalidad que tenemos para capturar esos mensajes son eventos, programaremos eventos, es el suceso en sí mismo, no, es una porción de código que genera un suceso o de capturar un suceso. Puede ser que capturemos un evento o estemos lanzando un evento.

Todos los programas comenzarán con una CLASE que se encargará que toda la aplicación esté funcionando. En el caso de windows se cerrará la aplicación pulsando el aspa de la esquina. Simplemente para decirle que tiene que hacer aquí dentro (la afamada bomba de mensajes) le diremos con qué interactuamos (objetos). Ya tendremos un objeto instanciado que está interactuando con el sistema el que mantendrá la aplicación viva. Esta estructura de mensajes nos la proporciona un Framework, así nuestra estructura se podrá efectuar en cualquier sistema, por ejemplo en java, se puede ejecutar en cualquier plataforma (móviles, televisión, una lavadora...), porque su entorno de trabajo le proporciona la funcionalidad. .NET proporciona esa funcionalidad, pero no se han molestado que ese framework no se ejecute en otros sistemas operativos (Mac, iphone...) el proyecto MONO esta cerrado, pero permite hacer aplicaciones para windows mobile, android, iphone.

Ahora a la hora de compilar, necesitaremos algo que nos lo permita. En el caso de java se produce una precompilación, para que la máquina virtual de java lo ejecute, la máquina virtual es un intérprete. Si queremos ejecutarlo en linux necesitaremos una máquina virtual para linux y ejecutar java. La máquina virtual es un intérprete.

Empezaremos definiendo clases. AMIGO/A, qué características tiene?
sinceridad
colaborador
nombre
edad
género
peso
altura
color ojos
color pelo
complexión

Primero definiremos el contexto, ¿qué necesidad de información o de datos voy a tener? Según los tipos de agenda tendremos distintas necesidades (chorvagenda, trabajo, normal y corriente). Tendremos en la agenda normal: Nombre (L/E), apellidos (L/E), género (L/E), fecha de nacimiento (L/E), edad (es un dato indirecto) (L). Acciones de “amigo”, pagar cerveza, consolar (amigo) con quien establece esta acción, ayudar A (ser vivo) como ser vivo no esta definido habrá que hacerlo y amigo vendrá heredado de ésta,

Hacemos clase ALUMNO, características para una asignatura o curso completo:
nombre, apellidos, edad*, fecha_nacimiento, nivel_academico, calificacion, genero, domicilio. Tendremos también un identificador de objeto que será transparente a nosotros. Normalmente cogeremos algo que nos permita definir ese conjunto de datos en concreto. ¿Qué acciones haría ALUMNO? grabar, [suspender no, ya que el profesor es el que suspende], borrar, …

Hacer lo mismo para el profesor:

  • características: nombre, apellidos, fecha_nacimiento, edad*, genero, domicilio, num_dni, experiencia_docente, nivel_academico, vehiculo_propio, num_seg_social, salario.
  • acciones: grabar, borrar (alumno), enseñar (alumno), reprender (alumno), calificar (alumno).

Que elementos hay comunes entre profesor y alumno:
nombre, apellidos, edad*, fecha_nacimiento, nivel_academico, genero, domicilio,
si todo esto es lo mismo, exactamente lo mismo... ¿podríamos generar una superclase que definiera esto? Sí. Generamos clase PERSONA con nombre, apellidos, edad*, fecha_nacimiento, nivel_academico, genero, domicilio. ALUMNO y PROFESOR heredan de PERSONA. Las características de Alumno y Profesor contienen las de Persona.
Intentar representar un colegio, alumnos, bedeles, administradores, profesores, jefes de estudios, director, con 8 perfiles basta. Una vez hechos esos perfiles con sus acciones. Haremos 3 de elementos del colegio: aula... con lo que haya en un colegio.

  • Alumno: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, num_matricula, enfermedades, nivel, asignaturas, calificacion, asistencia ⇒ grabar, borrar, estudiar,
  • Profesor: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, asistencia_trabajo, experiencia_docente ⇒ enseñar (alumno), evaluar (alumno), calificar (alumno), compartir (), educar (alumno)
  • Jefe Seminario: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, personal_a_cargo, asistencia_trabajo, ⇒ enseñar (alumno), evaluar (alumno), educar (alumno), calificar (alumno), compartir (), guiar (profesor)
  • Jefe de estudios: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, personal_a_cargo, asistencia_trabajo,⇒ enseñar (alumno), evaluar (alumno), educar (alumno), calificar (alumno), compartir (), guiar (profesor),
  • Director: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, personal_a_cargo, asistencia_trabajo, ⇒ enseñar (alumno), evaluar (alumno), educar (alumno), calificar (alumno), compartir (), dirigir (jefe_estudios), dirigir (jefe_seminario), dirigir (profesor), gestionar (), informar(administrador)
  • Secretario: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, nivel_academico,  asistencia_trabajo, ⇒ imprimir, editar, mecanografiar, comunicar,
  • Administrador: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, salario, asistencia_trabajo, ⇒ administrar, publicitar, contratar (personal)
  • Bedel: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, asistencia_trabajo, ⇒ gestion_accesos, distribuir(documentacion),
  • Padres: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, telefono_contacto, nivel_academico, profesión ⇒ llevar_colegio (alumno), educar (alumno), colaborar (profesor), pagar (administrador),
  • ATS:  nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, asistencia_trabajo, nivel_academico ⇒ prevenir, sanar, educar,
  • Vigilante_patio: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, asistencia_trabajo, ⇒ prevenir, vigilar, educar(alumno)
  • Telefonista: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, asistencia_trabajo, ⇒ atender(telefono), atender(personas),

  • Patio: largo, ancho, pergola, mobiliario
  • Comedor: largo, ancho, altura, capacidad, mobiliario
  • Gimnasio: largo, ancho, altura, capacidad, mobiliario
  • Despacho: largo, ancho, altura, mobiliario
  • Aula: largo, ancho, altura, capacidad, mobiliario