Lenguajes+Orientada+a+Objeto


 * GRUPO Nº 2 LENGUAJES ORIENTADA A OBJETOS **




 * = **Nombre y Apellido** ||= **Cédula de Identidad** ||
 * = == HECTOR IVAN RAMIREZ PEREZ == ||= **19.518.605** ||
 * = == DUILIO EFREN SEPULVEDA TORRES == ||= **18.558.344** ||
 * = == JOHNNY ALBERTO GODOY GARCIA == ||= **13.061.040** ||
 * = == DAIRA PAOLA FERREIRA VILLAMIL == || **83.114.215** ||

**Lenguajes de programación orientada a objetos **

Los lenguajes de programación orientados a objetos tratan a los programas como conjuntos de objetos que se ayudan entre ellos para realizar acciones. Entendiendo como objeto a las entidades que contienen datos. Permitiendo que los programas sean más fáciles de escribir, mantener y reutilizar. Los objetos tienen toda la información (atributos) que los diferencia de otros pertenecientes a otra clase. Este lenguaje tiene su origen en un lenguaje que fue diseñado por los profesores Ole-Johan Dahl y Kristen Nygaard en Noruega. Este lenguaje de programación orientado a objetos fue el “Simula 67” que fue un lenguaje creado para hacer simulaciones de naves. Son lenguajes dinámicos en los que estos objetos se pueden crear y modificar sobre la marcha. Esta programación orientada a objetos (POO) tomo auge a mediados de los años ochenta debido a la propagación de las interfaces gráficas de usuarios, para lo que los lenguajes de programación orientados a objetos están especialmente dotados.


 * **Video tutorial de Programación **** Orientada a Objetos en Java ** || **FUNDAMENTACIONES **
 * DEL LENGUAJE VISUAL ****ORIENTADO A OBJETOS ** ||
 * media type="youtube" key="mPBm19gf2Lc" width="318" height="270" || media type="youtube" key="qlPrkrWTx0c" width="326" height="273" ||

Ahora si, comenzamos con la POO o OOP (Objects Oriented Programming)



__internet__ hay muchas definiciones concretas y teoricas, ya sabes un par de parrafos que te dicen cosas que no entiendes hasta que comienzas a usarlo. Y en la busqueda de la optimizacion, limpieza, organizacion y abstraccion se implementa la POO para que los procedimientos actuen de acuerdo a una estructura que tu mismo defines de acuerdo a lo que convenga, es decir, diseñas el comportamiento de una clase para despues instanciarla.Algo asi: dijo: Clase multiplica_basico Atributos: Valor1, Valor2 Metodos: multiplica_basico(a,b) <-este metodo es el constructor, es el que se lleva acabo cuando creas un objeto de la clase (se que suena raro pero mas adelante lo entenderas) [/quote] Ahora, dentro del constructor codificamos el procedimiento que nos interesa, algo asi: dijo: multiplica_basico(a,b) { Imprimir (a*b) } [/quote] Y una vez creada la clase podemos instanciarla (darle un llamado) para que venga y nos de un objeto con sus caracteristicas, podemos llamarle un hijo, al cual podemos identificar. algo asi: dijo: Variable hijo = New multiplica_basico(1,2); <Se utiliza la palabra "new" en la mayoria de los __lenguajes__ para instanciar (mandar llamar) una clase, y se asigna una variable que podremos seguir usando y que conserva los atributos y metodos propios de la clase.[/quote]

En otras palabras, una clase es como algun tipo de variable que no es un tipo de da to, sino un conjunto de atributos (variables) y metodos (procedimientos,codigo) que se pueden ejecutar a partir de un objeto que nace de la clase misma .Por lo tanto, asi como en el ejemplo anterior podemos crear clases a nuestra conveniencia, para representarlas usamos el siguiente formato definido por el lenguaje UML

Importante, lo que acabo de mencionar no es en si la base teorica de la POO, sino la mejor manera de entrar al mundo de este paradigma cuando ya conoces un poco o tienes los principios en la programacion.

Bueno ahora si vamos a ponernos un poquito serios y adentrarnos a los conceptos que conforman la POO. Como vemos en la imagen de arriba, se presentan 4 pilares del paradigma de la POO (algunos autores manejan 5, otros 3, es cuestion de criterio)

Ahora que ya regresaste a ver la imagen sabes que hablo del encapsulamiento, la herencia el polimorfismo y la abstraccion Abstracción

Hay una frase muy conocida: "Divide y venceras". Y es verdad, cuando se nos presenta algun proyecto importante, notamos que visto desde arriba o como una idea general, puede ser bastante complicado e incluso nos asustamos. Sin embargo si subdividimos ese gran proyecto o ese gran problema es diferentes etapas o subdivisiones, las cuales a su vez se dividen en tareas, las cuales siguen un algoritmo definido, podemos notar que son un monton de tareas sencillas que agrupadas dan como resultado una operacion compleja. Esa es la idea de la abstraccion, pero su concepto se basa en, formar clases abstractas que son la base de muchas otras clases, permitiendo asi que los atributos y metodos compartidos pertenezcan a una clase abstracta.

En otras palabras, digamos que yo soy una clase, yo tengo ojos cafes, cabello castaña oscuro y cejas delgadas, luego yo tengo 3 hijos, los 3 tienen ojos cafes y cejas delgadas, pero uno es rubio, el otro es pelirrojo y el otro nacio calvo. Lo que quiero decir es que podemos definir una clase abstracta que les de a sus hijos ciertas caracteristicas pero que a su vez los hijos puedan tener cosas diferentes que la clase abstracta (clase padre) no tiene.

<span style="background-color: #ffffff; color: olive; font-family: Helvetica; font-size: 18pt; vertical-align: baseline;">HERENCIA

Esta caracteristica es mas sencilla y esta relacionada con la abstraccion. Cuando dije ( en el parrafo anterior) dijo:Lo que quiero decir es que podemos definir una clase abstracta que les de a sus hijos ciertas caracteristicas[/quote] Me referia precisamente a la herencia, que es tal y como dicha palabra lo dice. Una clase hija hereda los atributos y metodos de la clase madre, sencillo.

<span style="background-color: #ffffff; color: olive; font-family: Helvetica; font-size: 18pt; vertical-align: baseline;">ENCAPSULAMIENTO

Bueno, significa que los metodos de una clase se encuentran "escondidos" y no es necesario saber como funcionan, es decir, tu llamas a una clase y ejecutas uno de sus metodos, no importa cual sea el procedimiento que ejecuta, no necesitas conocerlo, sino llamarlo. En otras palabras, cuando ves la tele y subes el volumen, no sabes que hace la tv para conseguirlo, solo lo ordenas y listo. La tv encapsula sus operaciones y el usuario solo necesita mandar llamar esas operaciones

<span style="background-color: #ffffff; color: olive; font-family: Helvetica; font-size: 18pt; vertical-align: baseline;">POLIMORFISMO

Significa que un atributo o un metodo es compartido por varias clases, sin embargo cada clase lo implementa de manera distinta, es decir llevan acabo procedimientos distintos. Como vemos en la imagen, las dos clases heredan el mismo metodo, pero cada una lo implementa segun sus necesidades, a pesar de que se presume que son iguales, los metodos implementan un algoritmo diferente

<span style="background-color: #ffffff; color: #222222; font-family: Helvetica; font-size: 18pt; vertical-align: baseline;">**Características principales del** __Diseño__
 * y Programación Orientación a Objetos**

El diseño y modelado Orientado a Objetos es una manera fundamental que provee un medio uniforme para moldear un sistema desde la captura de requerimientos en la etapa inicial del análisis hasta la implementación, atravesando todo el ciclo de desarrollo del sistema. En la actualidad, se define el __software__ orientado a objetos como una “técnica” para la construcción de un software marcado por ciertas características, que lo llevan a cumplir los siguientes objetivos:

__Claro__ que esta parte tiene muchas cuestiones, por ejemplo, ¿reacción apropiada? Ampliaremos este aspecto en las próximas líneas. __conjunto__ de módulos y no provocará una reacción en cadena.
 * Robustez: ** Siendo esta la capacidad del software para reaccionar ante condiciones excepcionales.
 * Extensibilidad: ** La capacidad de adaptar el software a los cambios en las especificaciones. Se suelen definir dos principios para mejorar la simplicidad de diseño y la descentralización, indicando que los mismos deben ser para mejorar la adaptación sobre la estructura compleja sobre la que seguramente se asocian. Se habla de descentralización si el software se construye bajo el concepto de módulos o servicios, por lo que un cambio afectará a un
 * Reutilización: ** Requerimiento base de OOP la cual es la capacidad que tienen los distintos elementos software para construir aplicaciones diferentes.
 * Eficiencia: ** Se define como la capacidad de un sistema software para exigir el mínimo de recursos (hardware, software) en la utilización de sus tareas. Se aplica como sinónimo de rendimiento.
 * Portabilidad: ** Capacidad de utilizar el software en diferentes entornos hardware y software.
 * Funcionalidad: ** Es el conjunto de posibilidades que proporciona un sistema. Se suele hablar aquí de “featurism”, como la pérdida de facilidad de uso que implica la aplicación de propiedades vs cualidades.

El desarrollo de un diseño orientado a objetos es un proceso aditivo, diferenciándose esto del enfoque transformacional característico de otros métodos como el estructurado, donde los DFD del análisis son transformados en diagramas de estructura durante el diseño, con los consiguientes problemas que esto acarrea.


 * Durante el ciclo de desarrollo se aportan los siguientes elementos al modelo: **

__detalles__
 * Análisis del Negocio: ** se reconocen objetos claves del negocio y generan las abstracciones en las clases apropiadas (objetos entidad).
 * Análisis de Requerimientos: ** se identifican asociaciones estructurales entre objetos y nuevas clases (entidad).
 * Diseño lógico: ** Se incorporan todas las clases necesarias para la aplicación incluyendo los objetos de interfaz y de control.
 * Diseño Físico: ** se incorporan todos los

remanentes para la implementación física de cada clase de objetos. Componentes del modelo de estructura de objetos, separándose en 3 distintas clases: Objetos Entidad, Objetos de Interfaz, Objetos de Control. Para cada clase identificada se describen: Operaciones, Atributos,

__Restricciones__

. Adicional mente un diseño describe las asociaciones entre objetos o clases de objetos. Se distinguen los siguientes tipos de asociaciones: Relaciones Estáticas, Herencia, Agregación, Comunicación por mensajes.


 * Entorno y lenguaje orientado a objetos **

Básicamente la OOP permite a los programadores escribir software, de forma que esté organizado en la misma manera que el problema que trata de modelizar. Los lenguajes de programación convencionales son poco más que una lista de acciones a realizar sobre un conjunto de datos en una determinada secuencia. Si en algún punto del programa modificamos la estructura de los datos o la acción realizada sobre ellos, el programa cambia.

La OOP aporta un enfoque nuevo, convirtiendo la estructura de datos en el centro sobre el que pivotan las operaciones. De esta forma, cualquier modificación de la estructura de datos tiene efecto inmediato sobre las acciones a realizar sobre ella, siendo esta una de la diferencias radicales respecto a la programación estructurada. Ausencia de discontinuidades: Esto es, que en todo el ciclo de desarrollo software se aplican métodos de diseño, herramientas orientadas a objetos, etc, de modo que las discontinuidades entre las distintas actividades debe ser mínima.


 * Clases: ** La programación orientada a objetos se basa en la noción de clase. Sin entrar con detalle, una clase es un elemento software que describe un tipo abstracto, siendo su implementación total o parcial. Definamos “tipo abstracto de datos” como un conjunto de operaciones, características y propiedades. Así, en Java la noción central del lenguaje es la clase.
 * Aserciones: ** Las propiedades de un tipo abstracto se describen mediante aserciones. Éstas deben de ser independientes de la implementación que se les asigne. Se describen como pre-condiciones, post-condiciones e invariantes. Aquí los distintos elementos demuestran la relación corrección y robustez.

Partiendo del elemento básico, clase, se pueden declarar las siguientes propiedades deseadas para obtener un lenguaje orientado a objetos: Ejecución, Ocultación y Encapsulamiento, Excepciones, Comprobación estática de tipos, Generalización, Herencia (Simple/Multiple/Repetida), Redefinición, Polimorfismo, Sobrecarga, Identificación de tipos en tiempo de ejecución (RTTI), Clases y características diferidas, Recolección de memoria.

Identidad, clasificación, polimorfismo y herencia caracterizan a los lenguajes orientados a objetos. Cada uno de estos conceptos puede utilizarse aisladamente, incluso aparecen en otras metodologías de programación, pero juntos se complementan en una relación sinérgica. Los beneficios de la programación orientada a objetos son más que los que pueden verse a simple vista. El énfasis en las propiedades esenciales de un objeto, fuerza al desarrollador a pensar cuidadosamente que es un objeto y que es lo que hace con el resultado de que el sistema es normalmente más preciso, general y robusto que si pusiéramos el énfasis en los procedimientos y los datos por separado.

En resumen, la orientación a objetos es básicamente una técnica de arquitectura porque afecta a la estructura modular del software, por lo que se define una clase como unidad modular básica. Dicho de otra manera, la construcción de software orientado a objetos es un método de desarrollo software que se basa en el uso de módulos deducidos de los tipos de objetos que se manipulan, en lugar de basarse en las funciones. Se deduce un lema importantísimo que tira a la papelera un gran porcentaje de diseños: “No preguntes qué hace el sistema, pregunta a qué se lo hace.” Objetos, claro.

<span style="color: #800080; display: block; font-family: arial,helvetica,sans-serif; font-size: 10pt; text-align: justify;">**La programación Orientada a objetos (POO)** <span style="display: block; font-family: arial,sans-serif; font-size: 10pt; text-align: justify;">es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real que otros tipos de programación. <span style="display: block; font-family: arial,sans-serif; font-size: 10pt; text-align: justify;">Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en términos de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar conceptos y dar una pequeña base que permita soltarnos un poco con este tipo de programación. <span style="font-family: Arial,sans-serif; font-size: 10pt;">En la programación orientada a objetos se define la herencia como una jerarquía de extracciones, y la relación entre clases, donde se comparte la estructura y el comportamiento de una o más clase considerada como clases superiores o una superclase, con lo cual se resume que la herencia es una unidad independiente por si misma heredada de una abstracción o superclase. Un ejemplo cotidiano lo encontramos en las aplicaciones que existen actualmente en el mercado, donde un formulario cualquiera hereda las características de una ventana del sistema operativo Windows (Maximizar, Minimizar, Cerrar <span style="font-family: Arial,sans-serif;">) <span style="color: #800080; display: block; font-family: arial,sans-serif; font-size: 10pt; text-align: justify;">__Programación orientada a objeto__ <span style="font-family: Arial,sans-serif; font-size: 10pt;">La programación orientada a objetos es una nueva forma de programar que trata de encontrar solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: <span style="font-family: Arial,sans-serif; font-size: 10pt;">En comparación con un lenguaje procedural, una "variable" no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto. <span style="font-family: Arial,sans-serif; font-size: 10pt;">Entre los lenguajes orientados a objetos destacan los siguientes:
 * 1) <span style="font-family: Arial,sans-serif; font-size: 10pt;"> [|**Objeto*] [|*]: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad ("métodos"). Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa).
 * 2) <span style="font-family: Arial,sans-serif; font-size: 10pt;">[|**Clase**]: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.
 * 3) **<span style="font-family: Arial,sans-serif; font-size: 10pt;">Método **<span style="font-family: Arial,sans-serif; font-size: 10pt;">: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, y/o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.
 * 4) **<span style="font-family: Arial,sans-serif; font-size: 10pt;">Evento **<span style="font-family: Arial,sans-serif; font-size: 10pt;">: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente.
 * 5) **<span style="font-family: Arial,sans-serif; font-size: 10pt;">Mensaje **<span style="font-family: Arial,sans-serif; font-size: 10pt;">: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.
 * 6) **<span style="font-family: Arial,sans-serif; font-size: 10pt;">Propiedad o atributo **<span style="font-family: Arial,sans-serif; font-size: 10pt;">: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto, y cuyo valor puede ser alterado por la ejecución de algún método.
 * 7) **<span style="font-family: Arial,sans-serif; font-size: 10pt;">Estado interno **<span style="font-family: Arial,sans-serif; font-size: 10pt;">: es una propiedad invisible de los objetos, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos).
 * <span style="font-family: Arial,sans-serif; font-size: 10pt;">Lenguajes orientados a objetos **
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|ActionScript]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Ada] 95
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|C++]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|C#]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Delphi]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Eiffel]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Java]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Lexico] (en castellano)
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Python]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Ruby]
 * <span style="font-family: Arial,Helvetica,sans-serif; font-size: 10pt;">[|Visual Basic]

<span style="font-family: Arial,sans-serif; font-size: 10pt;">No todos estos lenguajes de programación son igualmente puros (avanzados) en orientación a objetos. <span style="font-family: Arial,sans-serif; font-size: 10pt;">Al igual que C++ otros lenguajes, como [|OOCOBOL], [|OOLISP],[|OOPROLOG] y [|Object REXX], han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico. <span style="font-family: Arial,sans-serif; font-size: 10pt;">Un nuevo paso en la abstracción de paradigmas de programación es la Programación ([|POA]). Aunque es todavía una metodología en estado de maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo el mundo.

media type="youtube" key="Y9CTKakXsOE" height="315" width="420" align="center"

**<span style="font-family: 'Cambria','serif'; font-size: 16px;">La programación orientada a objetos o POO (OOP según sus siglas en inglés) ** <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">es un [|paradigma de programación] que usa [|objetos] y sus interacciones, para diseñar aplicaciones y programas [|informáticos]. Está basado en varias técnicas, incluyendo [|herencia], [|abstracción] , [|polimorfismo] y [|encapsulamiento]. <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">Los lenguajes de programación orientados a objetos tratan a los programas como conjuntos de objetos que se ayudan entre ellos para realizar acciones. Entendiendo como objeto a las entidades que contienen datos. Permitiendo que los programas sean más fáciles de escribir, mantener y reutilizar. <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">La programación orientada a objetos es un paradigma que utiliza objetos como elementos fundamentales en la construcción de la solución. <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">Un objeto es una abstracción de algún hecho o ente del mundo real que tiene atributos que representan sus características o propiedades y métodos que representan su comportamiento o acciones que realizan. Todas las propiedades y métodos comunes a los objetos se encapsulan o se agrupan en clases. Una clase es una plantilla o un prototipo para crear objetos, por eso se dice que los objetos son instancias de clases <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados [|métodos], que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento. **<span style="font-family: 'Cambria','serif'; font-size: 16px;">Características de la POO ** <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">Existe un acuerdo acerca de qué características contempla la "orientación a objetos", las características siguientes son las más importantes:
 * <span style="font-family: 'Cambria','serif'; font-size: 16px;">Los objetos son entidades que tienen un determinado estado, comportamiento (método) e identidad: **
 * <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">El estado está compuesto de datos o informaciones, será uno o varios atributos a los que se habrán asignado unos valores concretos (datos).
 * <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">El comportamiento está definido por los [|métodos] o mensajes a los que sabe responder dicho objeto, es decir, qué operaciones se pueden realizar con él.
 * <span style="display: block; font-family: cambria,serif; font-size: 16px; text-align: justify;">La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto análogo al de identificador de una [|variable] o una [|constante] ).
 * **<span style="color: windowtext; font-family: Cambria,serif; font-size: 16px; text-decoration: none;">[|Abstracción] **<span style="font-family: 'Cambria','serif'; font-size: 16px;">: denota las características esenciales de un objeto, donde se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.El proceso de abstracción permite seleccionar las características relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstracción es clave en el proceso de análisis y diseño orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar.
 * **<span style="color: windowtext; font-family: Cambria,serif; font-size: 16px; text-decoration: none;">[|Encapsulamiento] **<span style="font-family: 'Cambria','serif'; font-size: 16px;">: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la [|cohesión] de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.
 * **<span style="color: windowtext; font-family: Cambria,serif; font-size: 16px; text-decoration: none;">[|Modularidad] **<span style="font-family: 'Cambria','serif'; font-size: 16px;">: Se denomina Modularidad a la propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. Estos módulos se pueden compilar por separado, pero tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la Modularidad de diversas formas.
 * **<span style="color: windowtext; font-family: Cambria,serif; font-size: 16px; text-decoration: none;">[|Principio de ocultación] **<span style="font-family: 'Cambria','serif'; font-size: 16px;">: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o [|rompecabezas] de objetos.
 * **<span style="color: windowtext; font-family: Cambria,serif; font-size: 16px; text-decoration: none;">[|Polimorfismo] **<span style="font-family: 'Cambria','serif'; font-size: 16px;">: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la [|sobrecarga de operadores] de C++.
 * **<span style="color: windowtext; font-family: Cambria,serif; font-size: 16px; text-decoration: none;">[|Herencia] **<span style="font-family: 'Cambria','serif'; font-size: 16px;">: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple.
 * **<span style="color: windowtext; font-family: Cambria,serif; font-size: 16px; text-decoration: none;">[|Recolección de basura] **<span style="font-family: 'Cambria','serif'; font-size: 16px;">: la recolección de basura o garbage collector es la técnica por la cual el entorno de objetos se encarga de destruir automáticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignación o liberación de memoria, ya que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie lo esté usando. En la mayoría de los lenguajes híbridos que se extendieron para soportar el Paradigma de Programación Orientada a Objetos como C++ u [|Object Pascal], esta característica no existe y la memoria debe desasignarse manualmente.

media type="youtube" key="YwwQlgmAFdk" height="315" width="420" align="center"




 * = **Nombre y Apellido** ||= **Cédula de Identidad** ||
 * = == HECTOR IVAN RAMIREZ PEREZ == ||= **19.518.605** ||
 * = == DUILIO EFREN SEPULVEDA TORRES == ||= **18.558.344** ||
 * = == JOHNNY ALBERTO GODOY GARCIA == ||= **13.061.040** ||
 * = == DAIRA PAOLA FERREIRA VILLAMIL == || **83.114.215** ||

EL MODELO DE CONSTRUCCIÓN DE PROTOTIPOS <span style="background-color: #ffffff; color: #666666; font-family: Arial,arial,sans-serif; font-size: 14px;">**.** <span style="background-color: #ffffff; color: #666666; display: block; font-family: arial,arial,sans-serif; font-size: 14px; text-align: center;">**Este modelo no secuencial, basado en la construcción de simulaciones o modelos ejecutables de aplicaciones más extensos, persigue un objetivo principal: la participación directa del cliente en la construcción del software requerido. Las fases son similares a las del modelo en cascada: es necesario un análisis previo de los requisitos tanto del sistema como del cliente, se concibe la arquitectura del sistema y se realiza el diseño del software. Sin embargo, se incluye un elemento hasta ahora no utilizado, que consiste en el diseño rápido de un prototipo que se mostrará al cliente para que evalúe el trabajo realizado.** <span style="background-color: #ffffff; color: #666666; display: block; font-family: arial,arial,sans-serif; font-size: 14px; text-align: center;">**El prototipo es una versión reducida del programa completo; es una “fachada virtual” que mostramos al cliente (que carece de la posibilidad de ser utilizada de la forma en que lo haríamos con el software final. Tras recoger los requisitos tanto del cliente como del sistema, se comienza con el diseño rápido del prototipo; el diseño completo obedece al previo diseño de pequeños prototipos específicos para funciones individuales. Más tarde, estos diseños serán unidos en uno sólo.** <span style="background-color: #ffffff; color: #666666; display: block; font-family: arial,arial,sans-serif; font-size: 14px; text-align: center;">**Después, se procede a la construcción del mismo. Éste prototipo es el que mostraremos al cliente para que lo evalúe y considere cambios en él, aunque no se trate de una versión definitiva.**

Por lo general los clientes y usuarios finales del software encuentran muy difícil expresar sus requerimientos

reales.

Es casi imposible predecir la manera en que un sistema afectará el trabajo diario, como interactuará con otros sistemas y qué operaciones del usuario se deberían automatizar.

Un prototipo es una versión inicial de un sistema de software que se utiliza para demostrar los conceptos, probar las opciones de diseño y entender mejor el “problema” y su solución.





==

media type="youtube" key="Jcj1GBGOwVg" width="425" height="350" align="center"

MODELOS EN ESPIRALES []

[]

MODELO DE PROTOTIPOS

<span style="color: #231f20; display: block; font-family: 'times new roman'; font-size: medium; text-align: justify;">Este modelo consiste en un procedimiento que permite al equipo de desarrollo diseñar y analizar una aplicación que representa el sistema que sería implementado (McCracken y Jackson, 1982). Dicha aplicación, llamada prototipo, está compuesta por los componentes que se desean evaluar (i.e. las funciones principales). Las etapas del modelo son: <span style="color: #231f20; display: block; font-family: 'times new roman'; font-size: medium; text-align: center;">- Investigación preliminar. <span style="color: #231f20; display: block; font-family: 'times new roman'; font-size: medium; text-align: center;">- Colecta y refinamiento de los requerimientos y proyecto rápido:

<span style="color: #231f20; display: block; font-family: 'times new roman'; font-size: medium; text-align: center;">Análisis y especificación del prototipo. - Diseño y construcción del prototipo. - Evaluación del prototipo por el cliente. - Renacimiento del prototipo.

- Diseño técnico. <span style="color: #231f20; display: block; font-family: 'times new roman'; font-size: medium; text-align: center;">- Programación y test. - - Operación y mantenimiento.



=<span style="background-color: #ffffff; font-family: Arial,sans-serif; font-size: 1.54em;">Herramientas para Prototipos Digitales =


 * || [[image:http://images.autodesk.com/adsk/images/digital_prototyping_tools_420x240.jpg width="420" height="240"]] ||  ||

<span style="background-color: #ffffff; color: #333333; font-family: Arial,sans-serif; font-size: 1.36em;">Evolucione la manera como usted piensa acerca de su Proceso de Diseño
<span style="background-color: #ffffff; color: #333333; display: block; font-family: arial,sans-serif; font-size: 1.18em;">Desarrolle un solo modelo digital con [|Autodesk® Inventor®] y utilícelo en cada etapa de producción, desde el diseño conceptual hasta la manufactura. Diseñe, visualice, y simule su producto digitalmente, reduciendo la necesidad de crear prototipos físicos y promoviendo la colaboración y la innovación. La solución Autodesk para Prototipos Digitales le ayuda a ahorrar tiempo y dinero, construir mejores productos, y ganarle a la competencia en llegar al mercado. <span style="background-color: #ffffff; color: #333333; display: block; font-family: arial,sans-serif; font-size: 1.18em;">Autodesk ha hecho que los Prototipos Digitale <span style="background-color: #ffffff; color: #333333; display: block; font-family: arial,sans-serif; font-size: 1.18em;"> <span style="background-color: #ffffff; color: #333333; display: block; font-family: arial,sans-serif; font-size: 1.18em;">
 * sean escalables, alcanzables, y rentables para los grupos de trabajo de diseño y manufactura, colocándolos al alcance de todas las compañías de manufactura. Desde el diseño conceptual y la ingeniería hasta el software de visualización y gestión de datos, Autodesk proporciona las herramientas líderes en la industria para respaldar a todo su flujo de trabajo de Prototipos Digitales basado en Inventor. ||   ||   || [[image:http://images.autodesk.com/adsk/images/digital_prototyping_tools2_204x150.jpg width="204" height="150"]] ||   ||

<span style="background-color: #bebebe; color: #005682; font-family: 'Times New Roman',Times,FreeSerif,serif; font-size: 20px;">Arquitectura de Software
<span style="background-color: #bebebe; display: block; font-family: Georgia,Utopia,'Palatino Linotype',Palatino,serif; font-size: 14px;">La Arquitectura de Software es el diseño de mas alto nivel de la estrctura del sistema .Es el resultado de ensamblar un cierto número de elementos arquitectónicos de forma adecuada para satisfacer la mayor funcionalidad y requerimientos de desempeño de un sistema, así como requerimientos no funcionales, como la confiabilidad, escalabilidad, portabilidad, y disponibilidad. En la Arquitectura de Software se dan los Estilos Arquitectura el cual maneja :
 * Datos
 * Red
 * Componentes



**Arquitectura en Capas** Esta arquitectura define un estilo o paradigma de programación basado en capas, donde el objetivo principal es la separación de la lógica del negocio, del diseño; Su usi mas popular es el de "tres capas". El uso de esta arquitectura permite que el desarrollo se realice en varios niveles y en caso de algún cambio sólo se ataca al nivel requerido. Además permite distribuir el trabajo de una aplicación por capas, así cada grupo de trabajo por cada capa está totalmente exento del resto de capas, simplemente es necesario conocer el API de cada capa.



El diseño de sistemas de información actuales, es frecuente el uso de las arquitecturas multi-capas, cada capa se le delega una responsabilidad, lo que permite el diseño de arquitecturas escalables, que pueden ampliarse con facilidad en caso de que los sistemas de información lo requieran. Esta es conocida comunmente con las siglas SOA en inglés (Service Oriented Architecture), es un concepto de arquitectura de software que define la utilización de servicios para dar soporte a los requisitos del negocio. <span style="font-family: 'Times New Roman','serif';">Una Arquitectura de [|Software], también denominada Arquitectura [|lógica] , consiste en un conjunto de patrones y abstracciones coherentes que proporcionan el marco <span style="font-family: 'Times New Roman','serif';">Una arquitectura de software se selecciona y diseña con base en objetivos y restricciones. Los objetivos son aquellos prefijados para el sistema de información, pero no solamente los de tipo funcional, también otros objetivos como la mantenibilidad, auditabilidad, flexibilidad e interacción con otros sistemas de información. Las restricciones son aquellas limitaciones derivadas de las tecnologías disponibles para implementar sistemas de información. Unas arquitecturas son más recomendables de implementar con ciertas tecnologías mientras que otras tecnologías no son aptas para determinadas arquitecturas. Por ejemplo, no es viable emplear una arquitectura de software de tres capas para implementar sistemas en tiempo real. <span style="font-family: 'Times New Roman','serif';">La arquitectura de software define, de manera abstracta, los componentes que llevan a cabo alguna tarea de computación, sus interfaces y la comunicación entre ellos. Toda arquitectura debe ser implementable en una [|arquitectura] física, que consiste simplemente en determinar qué [|computadora] tendrá asignada cada tarea. <span style="font-family: 'Times New Roman','serif';">La arquitectura de software, tiene que ver con el diseño y la implementación de estructuras de software de alto nivel. Es el resultado de ensamblar un cierto número de elementos arquitectónicos de forma adecuada para satisfacer la mayor funcionalidad y requerimientos de desempeño de un sistema, así como requerimientos no funcionales, como la [|confiabilidad], [|escalabilidad] , [|portabilidad] , y disponibilidad.
 * Arquitectura de Servicios**