martes, 14 de noviembre de 2006

Paradigma Orientado a Objetos

La programación orientada a objetos es un paradigma enfocado principalmente a la reutilización del código y a facilitar su mantenimiento. Esto se consigue mediante mecanismos de abstracción, como herencia y polimorfismo, y encapsulación.

Abstracción:
La abstracción es el método mediante el que se aproxima una entidad real enfatizando características y comportamientos relevantes para el sistema e ignorando otros triviales, facilitando la modificación, construcción y comprensión de las entidades participantes.

Encapsulación:
Incluye los conceptos de agrupación y ocultamiento.
La agrupacion reúne toda la información relativa al comportamiento y estructura de cada entidad. Esta independencia facilita la tarea de mantenimiento del sistema, permitiendo la modificación de cada módulo de forma independiente.
La ocultación esconde los detalles de implementación exponiendo únicamente un interfaz que especifica las posibles interacciones con las instancias de ese entidad. Proporciona capacidad de modificar la implementación de cada módulo, independientemente de las relaciones con otros, sin cambiar el comportamiento del sistema.
Estas propiedades restringen la posibilidad de efectos secundarios, la propagación de cambios, facilitando el mantenimiento y proporcionan un método seguro para la reutilización de los módulos en otros sitemas.

Herencia:
Un sistema orientado a objetos se compone de multitud de instancias de entidades colaborando entre sí. Esta colaboración se define mediante las relaciones como asociación, agregación o herencia.
La herencia es la relación entre entidades en que la entidad especializada se apropia de la estructura y comportamiento de la entidad base. El comportamiento heredado puede modificarse de modo que se adecúe a las características de la nueva entidad. Un posible uso de la herencia es la especialización, donde la entidad especializada añade comportamientos nuevos a los de la entidad base. Otro posible uso es la sustitución de comportamientos, que oculta el un aspecto del comportamiento de la clase base en favor del de la especializada.
La herencia es otra forma de abstracción que fomenta la reutilización de codigo.

Polimorfismo:
Cuando varias entidades representan su propio comportamiento con el mismo símbolo, un mismo mensaje puede aplicarse a cualquiera de esas entidades (habitualmente relacionadas mediante herencia), obteniendo así diferentes comportamientos.
El polimorfismo está estrechamente relacionado con la ligadura dinámica y está enfocado a la reutilización de código.

Paradigma Declarativo

Un Paradigma declarativo, es un paradigma de programación que está basado en el desarrollo de programas especificando o "declarando" un conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen el problema y detallan su solución. La solución es obtenida mediante mecanismos internos de control, sin especificar exactamente cómo encontrarla. No existen asignaciones destructivas, y las variables son utilizadas con Transparencia referencial.


CARACTERÍSTICAS:

Transparencia referencial: cada expresión denota un único valor que no puede ser cambiado evaluando la expresión o permitiendo que diferentes partes del programa compartan la expresión.

La evaluación de una expresión simplemente cambia la forma de la expresión pero nunca su valor. Todas las referencias a la expresión son por lo tanto equivalentes al valor mismo, y el hecho de que la expresión pueda ser referenciada desde otras partes del programa no se altera ese valor.

Por su transparencia referencial, una función matemática puede ser vista como una caja negra que computa valores de salida solamente en términos de sus valores de entrada. Esta propiedad es lo que distingue a las funciones matemáticas de las funciones que se pueden escribir en lenguajes de programación imperativa.


Evaluación perezosa: sólo se calcula una expresión si realmente se necesita su valor.

Lo opuesto a evaluación perezosa es la evaluación voraz, en la cual se calculan completamente los parámetros actuales para evaluar una función.

Una ventaja de la evaluación perezosa se observa en el siguiente ejemplo:

Divisible :: Int -> Int -> Bool

Divisible x y = x ‘rem’ y==0

Divisores :: Int -> [Int]

Divisores x = filter (divisible x) [1..x]

Primo :: Int -> Bool

Primo x = divisores x == [1,x]

Con la evaluación perezosa no se calculan todos los divisores de x y se compara el resultado con [1,x] a menos que esto sea en verdad necesario (cuando x es primo y en este caso , sólo habrán dos divisores).


Cláusulas de Horn: una cláusula de Horn es una disyunción de literales donde a los sumo uno de ellos es positivo.

Las cláusulas de Horn son conocidas en computación porque tienen buen comportamiento computacional. Por ejemplo, la satisfacibilidad proposicional es NP-completo pero la satisfacibilidad de una fórmula proposicional expresable como conjunción de cláusulas de Horn es P-completo. Las cláusulas de Horn y resolución lineal son la base de la programación lógica.


Funciones de Orden Mayor: son funciones que tienen como parámetros otras funciones.

Las funciones de orden mayor tienen similar papel en los lenguajes funcionales que las estructuras de control en los lenguajes imperativos. Pero mientras en los lenguajes imperativos las estructuras de control son primitivas, en los lenguajes funcionales uno puede definir estas funciones de orden mayor. Esto hace a los lenguajes funcionales más flexibles (hay pocas primitivas pero uno puede definir todas las demás que necesite: ortogonalidad).

Paradigma Imperativo

El paradigma imperativo se caracteriza por un modelo abstracto de ordenador consistente en un gran almacenamiento de memoria

Viene representado por la arquitectura Von Neumann, ya que utiliza este modelo para conceptualizar las soluciones. El programa en memoria se ejecuta secuencialmente y va utilizando la memoria para recoger datos con los que efectúa ciertos cálculos y finalmente actualiza la memoria.

En este paradigma se trata de determinar que datos son requeridos para el cálculo, esos datos se asocian a una dirección de memoria y secuencialmente se efectúan transformaciones sobre los datos almacenados, siendo el resultado correcto el estado final.

Se le llama paradigma imperativo porqué las sentencias imperativas desempeñan un papel dominante.

La esencia de este paradigma es el cálculo iterativo, paso a paso, de valores de nivel inferior y su asignación a posiciones de memoria.

Las características fundamentales de este paradigma son:

1. Sentencias simples y bifurcaciones.
Este paradigma en su forma pura, únicamente soporta sentencias simples que modifican la memoria y efectúan bifurcaciones condicionales e incondicionales.

2. Concepto de celda de memoria para almacenar valores.
La arquitectura se basa en la memoria, compuesta por un gran número de celdas donde se almacenan los datos. Las celdas son referenciadas por un nombre (concepto de variable) y sobre los que se producen efectos de lado y definiciones de alias.

3. Operaciones de asignación.
Cada valor debe ser almacenado, es decir, asignado a una celda. Por esto es tan importante la sentencia de asignación en este paradigma. Los conceptos de celda de memoria y asignación en bajo nivel, se extienden a todos los lenguajes de programación y hacen que los programadores tengan un estilo de pensamiento basado en la arquitectura Von Neumann.

4. Repetición.
Un programa imperativo suele realizar su tarea ejecutando repetidamente secuencias de pasos, ya que la repetición de instrucciones es la única forma de ejecutar algo complejo en este modelo.

lunes, 13 de noviembre de 2006

Blog de Lenguajes de Programación

Blog creado para la asignatura de Lenguajes de Programación.

Blog creado por el grupo 19.

Grupo formado por Anxo, Javi y Adrian.