martes, 8 de marzo de 2011

POO: “ Programación orientada a objetos ”

La P.O.O. (también conocida como O.O.P., por sus siglas en inglés) es lo que se conoce como un paradigma o modelo de programación. Esto significa que no es un lenguaje específico, o una tecnología, sino una forma de programar, una manera de plantearse la programación. No es la única (o necesariamente mejor o peor que otras), pero se ha constituido en una de las formas de programar más populares e incluso muchos de los lenguajes que usamos hoy día lo soportan o están diseñados bajo ese modelo (PHP, AS2, AS3,…)
Es importante recalcar nuevamente que la POO
 no es un lenguaje de programación, es una forma de enfrentarse a ella.
Características de la POO

Abstracción:
La abstracción nos permite dividir nuestro programa en distintos objetos que se agrupan para formar cosas más complejas Básicamente es la capacidad de separar los elementos (al menos mentalmente) para poder verlos de forma singular. Ej/ Como cuando describimos el cuerpo humano y decimos cabeza, brazo(s), pierna(s), etc.
Encapsulación:La encapsulación se encarga de mantener ocultos los procesos internos que necesita para hacer lo que sea que haga, dándole al programador acceso sólo a lo que necesita. Esto da dos ventajas iniciales: Lo que hace el usuario puede ser controlado internamente (incluso sus errores), evitando que todo colapse por una intervención indeseada.
Herencia:
La herencia nos permite, entre otras cosas, evitar tener que escribir el mismo código una y otra vez, puesto que al definir que una categoría (que en programación llamaremos clase) pertenece a otra, automáticamente estamos atribuyéndoles las características generales de la primera, sin tener que definirlas de nuevo.

CLASE
 Una clase es algo así como el concepto de lo que queremos hacer, es como la idea (concebida al detalle) de la cosa, del objeto; pero igual que con las ideas, no puedo hacer nada directamente con una clase (puedes sentarte en una silla, pero no en tu idea de una silla). Sin embargo, esta idea será la que dé forma al objeto que crearemos (que tendrá las características, mecanismos y comportamientos que habíamos pensado en nuestra idea).  
Ejemplo:
// Programa OPP01.CPP
#include <iostream>

using std::cout;
using std::endl;


// Esto define la clase CRender
class CRender {
public:
    char buffer[256];
    void m_Renderear(const char *cadena);
};


/* implementar m_Renderear() para la c;*/
void CRender::m_Renderear(const char *cadena)
{
    strcpy(buffer, cadena);//copia la cadena
    return;
}


int main (int argc, char **argv)
{
    // crear 2 objetos CRender
    CRender render1, render2;

    render1.m_Renderear("Inicializando el objeto render1");
    render2.m_Renderear("Inicializando el objeto render2");     

    cout << "buffer en render1: ";
    cout << render1.buffer << endl;   // tenemos acceso a buffer ya que es publico.

    cout << "buffer en render2: ";
    cout << render2.buffer << endl;

return (0);

La clase, propiamente dicha, se declara con la palabra clave class.
Hay un par de cosas que debemos tener en cuenta cuando creamos una clase:
§  No es obligatorio, pero por regla general -los entendidos lo llaman convención y es cuando todos se ponen de acuerdo en hacer algo de la misma forma. Los nombres de las clases siempre comienzan con mayúsculas.
§  Esto si es obligatorio: El archivo donde se encuentra la clase debe tener el mismo nombre que ésta, respetando mayúsculas y minúsculas. Esto es importante porque los import usan el nombre del paquete (si lo hubiere) y la clase para ubicarlos en el disco, así que si usas diferentes nombres, nunca los hallará y dará error.
§  Si el lenguaje no tiene una palabra reservada para definir el paquete (AS2, por ejemplo), la definición de la clase sería así:


INSTANCIA
La necesidad de convertir una clase (idea)  en un objeto real; a ese objeto lo llamamos instancia.
En un mismo proyecto puedo tener una o más instancias de una misma clase sin problemas.
Cada vez que creamos una nueva instancia, ésta adquiere las propiedades, métodos y eventos de la clase a la que pertenece (es lo que permite la relación es un), sin embargo, cada instancia es independiente de las otras; esto nos da dos ventajas:
1.    Si hago algún cambio en la clase, todas las instancias de esta clase se actualizarán automáticamente; esto nos permite hacer cambios sin tener que ir a cada una de las instancias (se aplica el mismo principio de herencia, aunque a un nivel diferente).
2.    Al ser independientes de las otras instancias, puedo darles valores diferentes sin que afecten a las demás (como tener una silla negra, una roja, una más alta, etc.). Aunque comparten la misma estructura, pueden programarse individualmente, dando versatilidad y flexibilidad al código.

OBJETO
Un objeto se define como la unidad que en tiempo de ejecución realiza las tareas de un programa. También a un nivel más básico se define como la instancia de una clase.
Estos objetos interactúan unos con otros, en contraposición a la visión tradicional en la cual un programa es una colección de subrutinas (funciones o procedimientos), o simplemente una lista de instrucciones para el computador. Cada objeto es capaz de recibir mensajes, procesar datos y enviar mensajes a otros objetos de manera similar a un servicio.
Un objeto es el resultado de la instanciación de una clase. Una clase es el anteproyecto que ofrece la funcionalidad en ella definida, pero ésta queda implementada sólo al crearuna instancia de la clase, en la forma de un objeto.

 Ejemplo:
dado un plano para construir sillas (una clase de nombre clase_silla), entonces una silla concreta, en la que podemos sentarnos, construida a partir de este plano, sería un objeto de clase_silla. Es posible crear (construir) múltiples objetos (sillas) utilizando la definición de la clase (plano) anterior. Los conceptos de clase y objetos son análogos a los de tipo de datos y variable, es decir, definida una clase podemos crear objetos de esa clase, igual que disponiendo de un determinado tipo de dato (por ejemplo el tipo entero), podemos definir variables de dicho tipo:

HERENCIA

La herencia nos permite, entre otras cosas, evitar tener que escribir el mismo código una y otra vez, puesto que al definir que una categoría (que en programación llamaremos clase) pertenece a otra, automáticamente estamos atribuyéndoles las características generales de la primera, sin tener que definirlas de nuevo
Es la relación entre una clase general y otra clase más especifica. Por ejemplo: Si declaramos una clase párrafo derivada de una clase texto, todos los métodos y variables asociadas con la clase texto, son automáticamente heredados por la subclase párrafo
.


POLIMORFISMO
En programación orientada a objetos, se refiere a la posibilidad de acceder a un variado rango de funciones distintas a través del mismo interfaz. O sea, un mismo identificador puede tener distintas formas (distintos cuerpos de función, distintos comportamientos) dependiendo del contexto en el que se halle. El polimorfismo se puede establecer mediante sobrecarga, sobre-escritura y enlace dinámico.
ATRIBUTO
Un atributo es una especificación que define una propiedad de un Objeto, elemento o archivo. También puede referirse o establecer el valor específico para una instancia determinada de los mismos.
Sin embargo, actualmente, el término atributo puede y con frecuencia se considera como si fuera una propiedad dependiendo de la tecnología que se use.
Para mayor claridad, los atributos deben ser considerados más correctamente como metadatos. Un atributo es con frecuencia y en general una característica de una propiedad.

METODO
Un método es una subrutina asociada exclusivamente a una clase (llamados métodos de clase o métodos estáticos) o a un objeto (llamados métodos de instancia). Análogamente a los procedimientos en los lenguajes imperativos, un método consiste generalmente de una serie de sentencias para llevar a cabo una acción, un juego de parámetros de entrada que regularán dicha acción y, posiblemente, un valor de salida (o valor de retorno) de algún tipo.
Algunos lenguajes de programación asumen que un método debe de mantener el invariante del objeto al que está asociado asumiendo también que éste es válido cuando el método es invocado. En lenguajes compilados dinámicamente, los métodos pueden ser objetos de primera clase, y en este caso se puede compilar un método sin asociarse a ninguna clase en particular, y luego asociar el vínculo o contrato entre el objeto y el método en tiempo de ejecución. En cambio en lenguajes no compilados dinámicamente o tipados estáticamente, se acude a precondiciones para regular los parámetros del método y postcondiciones para regular su salida (en caso de tenerla). Si alguna de las precondiciones o postcondiciones es falsa el método genera una excepción. Si el estado del objeto no satisface la invariante de su clase al comenzar o finalizar un método, se considera que el programa tiene un error de programación.

ACCESORES
Los métodos utilizados para obtener información de un objeto son conocidos como métodos accesores
Además de length() y charAt(), String soporta otros métodos accesores que proporcionan acceso a subcadenas y que indican la posición de caracteres específicos en la cadena. StringBuffer tiene sus propios métodos accesores similares
Ejemplo:
class ReverseString {
    public static String reverseIt(String source) {
        int i, len = source.length();
        StringBuffer dest = new StringBuffer(len);

        For (i = (len - 1); i >= 0; i--) {
            dest.append(source.charAt(i));
        }
        return dest.toString();
    }
}

PARAMETROS
Un parámetro es un tipo de variable que es recibida por una función, procedimiento o subrutina.

Un parámetro influye en el comportamiento o el resultado de la ejecución de la función, procedimiento o subrutina (de ahora en más sólo procedimiento) que lo recibe. Son muy utilizados en la programación.

En general, en la definición de un procedimiento, es incluida una lista ordenada de parámetros; de esta manera, cada vez que el procedimiento es llamado, los argumentos de esa llamada pueden ser asignados a los correspondientes parámetros. Aquí se expone sutilmente la diferencia técnica entre parámetro y argumento, aunque muchas veces son tratados como sinónimos.
Ejemplo:
function escribirBienvenida(nombre,colorTexto){
    document.write("<FONT color='" + colorTexto + "'>")
    document.write("<H1>Hola " + nombre + "</H1>")
    document.write("</FONT>")
} 


ENCAPSULACION

En programación modular, y más específicamente en programación orientada a objetos, se denomina encapsulamiento al ocultamiento del estado, es decir, de los datos miembro, de un objeto de manera que sólo se puede cambiar mediante las operaciones definidas para ese objeto.
Cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados a un objeto contra su modificación por quien no tenga derecho a acceder a ellos, eliminando efectos secundarios e interacciones.
De esta forma el usuario de la clase puede obviar la implementación de los métodos y propiedades para concentrarse sólo en cómo usarlos. Por otro lado se evita que el usuario pueda cambiar su estado de maneras imprevistas e incontroladas.
Ejemplo:
class Fecha 
{ 
   public: 
      int anho; // El anho con cuatro cifras, ej. 2004 
      int mes;  // El mes, de 1 a 12 
      int dia;    // El dia, de 1 a 31 
      void metodoMaravilloso1(); 
      void metodoMaravilloso2(); 
};



No hay comentarios:

Publicar un comentario