Bienvenido al mundo paradigmático..!!

PARADIGMA: El joven conoce las reglas de los paradigmas, el viejo las excepciones..!!
wilocarpio
Paradigmas
de Vida
Sistémico
Lingüísticos
Matemático

A los padres de los paradigmas
Bernstein, Kunh, Mac Carthy, Minsky, Moore, Newell,
Rochester, Samuel, Selfrige, Solomonoff, Simon, Von Neumann, ...

ASI NACE UN PARADIGMA . . .
Un científico cerró cinco monos en una jaula grande, en cuyo centro ubicó una escalera y en la cima de esta puso un montón de bananas.

Te preguntaste por qué; hacemos las cosas de una manera,
si quizás podemos hacerlas de otra.?
Pues bién . . .
cada, una de nuestras actividades diarias,..
está guiada por un paradigma . . ! !


Paradigma: Es mas facil desintegrar un atomo
que un preconcepto..!!
(Albert Einstein)

TEORIA DE LOS PARADIGMAS

Un paradigma puede ser :

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental
El término paradigma de la historia anterior seria un modelo de comportamiento a imitar, se remonta a la época de los griegos, quienes le denominaban "Parâdeima", actualmente, según el diccionario al que consultes encontarás entre otros muchos, que el paradigma es . . .
  • Ejemplo o modelo a seguir.
  • Entidad ejemplar entre un conjunto.
  • Modelo básico de diseño y desarrollo de programas.
  • Forma rectora de pensar, formular e interpretar las soluciones de un problema.
  • Modelo conceptual que guía un proceso de diseño y determina la forma final de un programa.

Cuando cursaba una maestría, aprendí que estos conceptos comenzaron a madurar, cuando Thomas Kuhn alumbraba su obra que revolucionó el restringido ámbito de los historiadores y filósofos de la ciencia "La Estructura de las Revoluciones Científicas", del cual te destaco los siguientes aspectos:

  1. REINADO DEL PARADIGMA DE LA SIMPLICIDAD , dotado de:
    - Explicaciones simplistas.

    - Desarrollos expresadas en leyes deterministas.

    - Fundamentos basadas en modelos ideales.

    Reinó desde el nacimiento de la ciencia moderna hasta casi nuestro siglo, siendo su gran referente la dinámica de Newton, caracterizada por...
    - Usar el método analítico.

    - Su inflexible búsqueda de unidades fundamentales.

    - El estudio de su comportamiento.

    - Explicar el comportamiento del conjunto, por ensamble de sus partes.

    A partir de estos aspectos se pergenian los grandes problemas conceptuales del siglo XX. Así, con:

    - Darwin En Francia, nace el desarrollo de la Teoría de la Evolución.

    - Fourier Nace el concepto de "Entropia" en su obra "Nueva Ciencia del Calor" que generará el concepto de la flecha del tiempo.

    Como el marco conceptual newtoniano era incapaz de abordar las problemáticas generadas por los avances de la biología, las ciencias sociales y la física; y por otra, los paradigmas para los científicos son como los expedientes para los jueces: "lo que no figura allí no existe..!!"; se impone la necesidad de plantear estos cambios, sus transformaciones y la complejidad alcanzadas, para ello, nacen las siguientes teorías que explican con metodologías no reduccionistaslos nuevos temas complejos:

    • Ludwig Von Bertalanffy: Biologo que crea en 1945 la "Teoría General de Sistemas" para explicar el comportamiento del organismo como un todo. Plantea el "Problema de la Complejidad", cuestionando la teoría del conocimiento del positivismo lógico, manifestando al respecto:

      - Sin importar su status metafísico, la percepción no es un simple reflejo de las cosas reales.

      - El conocimiento no es solo una aproximación a la "verdad" o "realidad", sino una interacción entre cognoscente y cognoscendo, relacionados una gran variedad de factores biológicos, psicológicos, culturales, lingüísticos.

      Bertalanffy adopta los "Sistemas Abiertos" que intercambian materia, energía e información con el medio, como modelo general y la investigación posterior, propone "Sistemas Abiertos" como centro de gravedad de la investigación para explicar los modelos de interacción, irreductibles, complejos, multicausales y no lineales.

      Para el, la Teoría de Sistemas Abiertos, posee un alto grado de conexiones, pues relaciona los aspectos teóricos y tecnológicos de la "Cinética Química", con la "Termodinámica de Procesos Irreversibles" de Ilya Prigogine, con la fisiología y hasta con las ciencias sociales.

    • Ilya Prigogine: Refuta al paradigma de la simplicidad siguiendo la lógica interna de sus investigaciones, con sistemas lejos del equilibrio que lo obligaron a desarrollar nuevas categorías conceptuales, para abordar los problemas de la complejidad, la transformación y la evolución de los sistemas que estudiaba.

      Enfocaba la problemática global de la complejidad y su interés en la reflexión epistemológica, produciendo así su acercamiento a los sistémicos, manifestado como un fructífero intercambio que madurará en el siguiente período evolutivo de la teoría de sistemas.

    • Dora Freíd Schnitman: Adoptando un modelo sistémico alumbra su libro "Aspectos culturales de la terapia familiar".

    • Wiener: En 1948 propone su trabajo sobre "Cibernética".

    • Shanon y Weave: En 1949, expone sus trabajos sobre "Teoría de la comunicación".

    • Von Neumann y Morgenstern: En 1949, plantean sus argumentos sobre la "Teoría del Juego".

    Así, la investigación enfatizó los aspectos de la "Teoría General de Sistemas" aceptando el añejo postulado aristotélico: "El todo es más que las partes", aplicado al organismo de seres vivos, al comportamiento individual, familiar o social, a los sistemas de comunicación, incluidos los lenguajes y en general a todo sistema complejo. Esta rompe con el paradigma newtoniano de simplicidad y analiticidad para plantearse problemas relacionados con la complejidad e interacción, además de su naturaleza "Interdisciplinaria", es "Transdisciplinaria", porque abarca características muy generales que comparten sistemas muy diversos, tales como la:

    - Cibernética,
    - Teoría de autómatas,
    - Teoría de la información,
    - Teoría de control,
    - Teoría de conjuntos,
    - Teoría de grafos y redes,
    - Teoría de juegos y decisiones,
    - Teoría de las matemáticas relacionales,
    - Teoría de la computación y
    - .. muchas otras.

  2. LLEGA LA CIBERNETICA..!!
    En un primer período de evolución, la investigación busca comprender el equilibrio dinámico debido, al gran enigma biológico respecto del mantenimiento de la estructura corporal, donde sabemos que nuestras células se recambian permanentemente, pese a ello nos concebimos como un organismo más o menos estable, arruga más, arruga menos.

    Al respecto dice Schnitman:
    - "El desarrollo temprano de la cibernética y la teoría general de sistemas se caracterizaron por un énfasis en la estructura, en la adaptación, en el equilibrio dinámico, con el propósito de comprender cómo una organización dada podía ser estabilizada y mantenida por medio del cambio continuo"

    - "Sin embargo las estructuras vivientes y sociales no pueden ser estabilizadas permanentemente, también requieren una comprensión las transformaciones espontáneas; la sistémica integró progresivamente el estudio del cambio estructural y de la capacidad de transformaciones espontáneas del sistema como dominio necesario".

    En este enfoque los aportes de Prigogine fueron relevantes, ya que su modelo de estructuras disipativas, sujetas a fluctuaciones internas y externas, que a partir de cierto valor crítico, o umbral, se amplifican y llevan a la formación de nuevas estructuras que permiten desarrollar nuevas categorías conceptuales y modelos que integren la dinámica del cambio, el azar y la necesidad, el mantenimiento y la transformación.

    Edgar Morin, desde sus investigaciones sociológicas y antropológicas, y también desde la reflexión epistemológica realizó valiosísimos aportes en este sentido, que se reflejan en su trilogía "El método". Este, desde una perspectiva centrada en la complejidad, se orienta hacia una concepción bio-antro-cosmológica, en donde los niveles físico, viviente y social no sean compartimentos estancos sino que se articulen e integren.

  3. TAMBIEN LA RECURSIVIDAD..Y LOS BUCLES..!!
    La epistemología positivista se corresponde claramente con el paradigma de la simplicidad. El sujeto (científico) es un observador (neutral, objetivo) de una naturaleza que independiente (ajena a sus deseos y sufrimientos).

    El conocimiento es reflejo (en el sujeto) de la realidad que está allí afuera; el conocer no modifica esa realidad ya que el observador no interfiere en absoluto con su objeto de estudio.

    Esta concepción objetivista del conocimiento no fue cuestionada exclusivamente por Khun.

    Así, Ian Piaget realizó una crítica demoledora en sus investigaciones en psicología experimental y epistemología genética, desarrollando una postura constructivista del conocimiento donde el sujeto y objeto ya no son polos opuestos de una dicotomía, sino que ambos se construyen en el proceso de conocimiento.

    Ya en las primeras décadas del siglo, la propia física, a través de los principios de indeterminación de Heisemberg, introduce al observador dentro de la teoría científica.

    Aunque mucho más tarde, también la biología, especialmente la neurofisiología, con los aportes de McCulloch, Maturana, etc., confirman que no podemos prescindir del observador como parte del sistema de observación, desde la investigación de fenómenos fisiológicos.

    La cibernética da cuenta de este proceso de reflexión del conocimiento del conocimiento, donde para:

    - Para conocer el cerebro usamos...: el cerebro

    - Para conocer el lenguaje usamos...: el lenguaje

    O sea que la recursividad es la norma, donde no hay linealidad posible, sólo bucles.

  4. INTERDISCIPLINARIEDAD y la TRANSDISCIPLINARIEDAD
    La "Teoría General de Sistemas" que nació como una perspectiva transdisciplinaria, que permite abordar sistemas complejos de cualquier clase. No constituye una disciplina en sí, sino una metadisciplina; pues más que una teoría sobre el mundo, es una teoría para desarrollar teorías.

    El quiebre del paradigma newtoniano, el surgimiento de distintas perspectivas y alternativas nos llevan a la necesidad de pensar sobre estos cambios, evoluciones y crisis que se expresan en la historia de las ideas (paradigmas), en la historia de las sociedad (culturas) y de los individuos que las co-forman (sujetos)

  5. EL REINO DE LOS PARADIGMAS DE PROGRAMACION
    En estos links, solo me refiero a conceptos aplicables a paradigmas generadores de la actividad informática, tomados como modelos algorítmicos de heurísticas destinadas a automatizar los procesos de digitalización de datos, de acuerdo al criterio del siguiente mapa conceptual:
    
                        El PARADIGMA es  
                               |      
                        MODELO CONCEPTUAL
                               |
                          que guía un
                               |
                        PROCESO DE DISEÑO
                               | 
                         y determina un
                               |
                       FORMATO DE PROGRAMA         
    

    En tal ámbito, notarás que el paradigma de programación es la fuerza sinérgica que dinamiza la fascinante y atrapante sociedad digitalizada, a la que gustoso te doy la bienvenida...!!

    Antes de seguir con esto, te propongo conceptualizar como:

    - ALGORITMO: A la secuencia operativa diseñada para lograr un resultado predefinido, capáz de resolver una situación problemática en particular.

    - HEURÍSTICA: A la acción intelectual desarrollada para la generación de nuevas creaciones lógicas.

    Los sistémicos podríamos plantear un enfoque socio-global, afirmando que un paradigma es un modelo de comportamiento computacional para resolver problemas operacionales de los usuarios, dando lugar al desarrollo de dos grandes modelos paradigmáticos:

    - PARADIGMA DEL PODER O HEURISTICO: Generado en el sueño de Von Newmann, quién anhelaba aplicar las leyes mentales humanas, a la capacidad de la computadora, para resolver dinámicamente cualquier problema, aplicando sistemas eficientes de búsqueda dotadas de buenas heurísticas..!!

    - PARADIGMA DEL CONOCIMIENTO O EPISTEMOLOGICO: Plantea que cualquier problema solo será solucionable si se conoce y comprende integralmente su estructura operativa, proponiendo textualmente: "Un problema se resuelve según el conocimiento que se tenga de el..!!"

    Estos paradigmas promovieron el desarrollo de la Inteligencia Artificial, planteada como:

    - CIENCIA: Cuando analiza el estado del comportamiento inteligente, destinado a comprobar una teoría de inteligencia que explique el comportamiento natural de los seres inteligentes.

    - TECNOLOGIA: Cuando permite construir máquinas automáticas, denominados AUTÓMATAS capaces de resolver problemas, operando de manera similar al de los humanos.

Volver al principio


PARADIGMA: Cualquier paradigma que dependa de la fiabilidad humana..
.. no es fiable..!! ( Wilucha )

CLASIFICACION DE LOS PARADIGMAS

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA: Las computadoras no son fiables
.. pero los hombres menos aún..!! ( Wilucha )

Los Paradigmas de Programación tomados como guías básicas de diseño y desarrollo de sistemas, se agrupan de acuerdo a la subjetividad de criterios que cada autor quiere destacar, por ejemplo, según la naturaleza de cada problema, cuya solución puede requerir más de un tipo de paradigmas, que te describo a continuación:

Volver al principio


Paradigma: Lo que se hace por amor
está más allá del bién y del mal.!
Nietzsche

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA DECLARATIVO: Describe la solución
Destaca las características que debe tener la solución, pero no describe como procesarla.

Los paradigmas resultantes y los lenguajes que los soportan no son verdaderamente declarativos, sino pseudodeclarativos. En este grupo se encuentran: el funcional, el lógico y el de transferencia.

En principio, estos no son soluciones inherentes de tipos serie o paralelo, ya que no dirigen la secuencia de control y no pueden alterar el natural no paralelismo del algoritmo.

No obstante, los paradigmas pseudodeclarativos requieren al menos un limitado grado de secuencia, y por lo tanto admiten versiones en serie y paralelo.

SOLUCIÓN DECLARATIVA:
Bajo este entorno paradigmático, un programa se diseña marcando hechos, reglas, restricciones, ecuaciones, transformaciones y demás propiedades derivadas del conjunto de parámetros o valores que configuran la solución.

PROGRAMACION DECLARATIVA
El objetivo a largo plazo que se pretende alcanzar, es la creación de una herramienta que pueda adaptarse a varios paradigmas de programación.

Aunque fundamentada en teorías matemáticas de principios del siglo XX, la programación declarativa tiene sus inicios en los ordenadores con el lenguaje de programación LISP, el cual aparece en 1959, habiendo sido desarrollado por John McCarthy, con la idea de facilitar el manejo de listas algebraicas, usadas en las investigaciones del campo de la inteligencia artificial.

Este lenguaje, aunque contemporáneo del FORTRAN, ya incorpora la recursividad, la recolección de basura y una definición formal del lenguaje (escrita en LISP), y además podemos decir, que al surgir sus nuevas versiones, ha sido pionero en cuanto a la creación de entornos globales de programación que agrupan en una misma herramienta al editor, el interprete y el depurador.

Sus caracteristicas son:

PARADIGMA: La Inteligencia Artificial
.. es incompatible con la Estupidez Natural..!! ( Wilucha )

CLASES DE LENGUAJES DECLARATIVOS
Fuertemente basada en el establecimiento de relaciones, la programación declarativa hace uso de funciones o bien de la lógica de predicados para establecer dichas relaciones, y por esto aparecen las dos principales ramas que agrupan a los lenguajes clasificados bajo esta filosofía, denominadas:

Paradigma: Cuando veas un gigante, examina la posición del Sol
..no vaya ser la sombra de un pigmeo..!!
(Von Hardenberg)

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA DEMOSTRATIVO: Describe soluciones de problemas similares
Permite al sistema que generalice una solución procedimental a partir de esas demostraciones, por ello también es llamada programación por ejemplos. El mayor problema que se presenta con estos sistemas, es conocer cuándo un programa es correcto. En el caso de los sistemas procedimentales, se consigue estudiando el algoritmo y el resultado de juegos de ensayo apropiados.

En el caso de los sistemas demostrativos el algoritmo se mantiene en una representación interna, por lo que la veracidad de la decisión se debe hacer exclusivamente sobre la base de eficiencia del algoritmo sobre los casos específicos de prueba.

Ejemplo: Una maquina generadora de números pares, puede usar la siguiente regla de recursividad:

  • Se establece que el numero 2 es par ;por lo tanto 2 pertenece al conjunto de los pares

  • Si él numero x pertenece al conjunto de los pares, entonces x + 2 es par
    Demostremos esto:
    	
    						2 + 2 = 4
    						2 + 4 = 6
    						2 + 6 = 8
    		

    Así, la maquina tomara el resultado de las sumas y lo incrementara en dos, de este modo genera los números pares, y así establecemos los pasos para llegar a la solución del problema.

LA PROGRAMACION DEMOSTRATIVA O POR EJEMPLOS:
Es del tipo "bottom-up", resulta compatible con nuestra capacidad de pensar, aunque en la mayor parte de los paradigmas, la solución del problema se logra aplicando métodos abstractos "top-down".

Este tipo capta aspectos similares de los objetos y a partir de ellos generaliza similitudes para resolver los nuevos casos. Apesar que esta es una versión de la solución procedimental, pero por producir resultados diferentes, merece ser tratada como una categoría distinta.

Especifica la solución describiendo ejemplos, y permite que el sistema generalice la solución de esos ejemplos para otros casos, aunque tal criterio pueda generar distintos resultados

Propone soluciones de problemas similares y promueve que el sistema, a partir de sus demostraciones, generalice una solución procedimental. Las opciones para lograr este objetivo son:

  • SIMULAR: La acción operativa que produce una secuencia procedimental

  • INFERIR: Tanto las intenciones o inferencias de conocimiento.

    • LOS SISTEMAS QUE INFIEREN: Generalizan a partir del razonamiento basado en el conocimiento, mientras que una solución basada en la inferencia determinará las similitudes del grupo de datos u objetos, que servirá para generalizar sus singularidades.

    • MEJORES RESULTADOS: Del procedimiento de inferencia están en áreas limitadas, donde el sistema tiene un profundo conocimiento semántico de la aplicación.

    • MAYOR DESVENTAJA: Es la necesidad de conocer cuándo el programa funciona correctamente, como en el caso de los sistemas procedimentales, donde tal detalle se logra con un eficiente diseño del algoritmo, de manera de generar el resultado apropiado.

    • PROGRAMACION ASISTIDA: Donde el sistema observa acciones que el programador ejecuta, y si son similares o acciones pasadas, intentará inferir cuál es la próxima acción que del programador.

    • OBJECIONES:Sus detractores critican al sistema de inferencia por que:

      - Si la comprobación no es exhaustiva pueden producirse programas erróneos que trabajan correctamente con ejemplos de prueba, pero que con otros casos fallan.

      - Destacan que la capacidad de inferencia es limitada, tanto que el usuario debe guiar casi siempre el proceso.

PARADIGMA: : Errar es humano, pero para enrredar las cosas en grande
..hace falta una computadora..!! ( Wilucha )

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA FUNCIONAL: Funciones + Estructura de datos = Programa

Antecedentes:
- M. Schönfinkel: Desarrolla en Alemania y Rusia los Fundamentos de la lógica combinatoria.

- Haskell Curry: En Inglaterra crea la lógica combinatoria y el lambda cálculo tipado

- Alonzo Church: En 1934 en EEUU propone un nuevo modelo de estudio de la computabilidad mediante el cálculo lambda.

- John McCarthy: En 1950 diseña el lenguaje LISP (List Processing) usando las listas como tipo básico que admitía funciones de orden superior, de aplicación en el campo de la Inteligencia Artificial.

Para detener el crecimiento de los lenguajes propios desarrollados por cada investigador, un grupo de investigadores notables propone como estándar a Haskell que es un lenguaje no estricto y puramente funcional. El paradigma funcional está cimentado en el modelo matemático de composición funcional, y abarca:

ASPECTOS del PARADIGMA FUNCIONAL

CARACTERISTICAS del PARADIGMA FUNCIONAL: El paradigma funcional basado en el concepto matemático de función:

PARADIGMA FUNCIONAL Vs IMPERATIVO
Un ejemplo que destaca la diferencia entre la programación funcional y la imperativa es el siguiente:

PARADIGMA FUNCIONAL: PROGRAMACION LISP
Funciones primitivas predefinidas:


    Tratamiento de listas
	CAR Devuelve la cabeza de la lista

 	CDR  Devuelve la cola de la lista

	CONS Construye una lista CONS a partir de otras dos

	LIST Construye una lista a partir de varias sublistas
	
	Asignación, relaciones booleanas y predicados
	SET y SETQ Evalúan sus argumentos

	EQ Comprueba si dos argumentos son iguales

	GREATERP y LESSP Compara si el arg 1 es mayor/ menor que el 2

	NULL Comprueba si la lista es nula

	ATOM; LISTP NUMBERP Averiguan el tipo de un objeto

	OR, AND y NOT Predicados de suma, multiplicación y negación
	
	Aritméticas
	PLUS, DIFERENCE, TIMES, QUOTIENT, REMAINDER Suma, resta, multiplicación, cociente, resto
	
	Condicionales e iterativas
	COND Condicional con varios predicados

	LOOP Función iterativa no declarativa

    Formas funcionales para crear y combinar funciones
	DEFUN Función que permite crear otras funciones

    Objetos de datos
	LISP dispone de esta estructura como fundamental
 

Veamos el siguiente ejemplo en LISP, donde se comprueba si un número es primo:


    (DEFUN PRIMO(N)
	COND((EQ N 2) T) ((EQ N 3) T)
	(T (PRIMO1 N (QUOTIENT N 2)))))
	(DEFUN PRIMO1 (N Y)
	COND((EQ (REMAINDER N Y) 0) NIL)
	((EQ Y 2) T)

	(T (PRIMO1 N (DIFERENCE Y 1))))

Al ejecutarlo, genera:


   (PRIMO 3) T 

   (PRIMO 8) NUL 

Volver al principio

PARADIGMA: El joven conoce las reglas pero el viejo las excepciones..!! (Wilucha)

PARADIGMA FUNCIONAL: LENGUAJE HASKELL
Los primeros ordenadores se construyeron en los años cuarenta. Estos modelos fueron ‘programados’ con grandes reels. Luego se almacenaron los programas en la memoria del ordenador, haciendo que los primeros lenguajes de programación hicieran su entrada.

En aquel tiempo el uso de un ordenador era muy costoso y era lógico que el lenguaje de programación guardara mucha relación con la arquitectura del ordenador.

Un ordenador consta de una unidad de control y una memoria. Por eso un programa consistía en instrucciones para cambiar el contenido de la memoria. La unidad de control se encargaba de ejecutarlas. De esta manera se creó el estilo de programación imperativa.

En la matemática de los últimos cuatrocientos años son muy importantes las funciones. Estas establecen la relación entre los parámetros (la ‘entrada’) y el resultado (la ‘salida’) de procesos definidos.

Con cada computación, el resultado depende de una u otra forma de los parámetros. Por esa razón, una función es una buena manera de especificar una computación. Esta es la base del estilo de programación funcional.

Un ‘programa’ consiste en la definición de una o más funciones. Para la ejecución de un programa, se dan parámetros a una función y el ordenador tiene que calcular el resultado. Con este tipo de computación existe libertad en la manera de ejecución.

ANTECEDENTES del LENGUAJE HASKELL
La base teórica de la programación imperativa fue dada (en Inglaterra) por Alan Turing en los años treinta. También la teoría de funciones como modelo de computación proviene de los años veinte y treinta.

Los fundadores son, entre otros, M. Schönfinkel en Alemania y Rusia(fundamentos de la lógica combinatoria), Haskell Curry en Inglaterra (Lógico matemático creador de la lógica combinatoria y el lambda cálculo tipado y Alonzo Church en EEUU (propuso un nuevo modelo de estudio de la computabilidad mediante el cálculo lambda).

Hacia 1950, John McCarthy diseñó el lenguaje LISP (List Processing) usando las listas como tipo básico ya que admitía funciones de orden superior (usado en el campo de la Inteligencia Artificial).

A la larga, cada investigador se dedicó a desarrollar su propio lenguaje que para detener este crecimiento incontrolado, un grupo de investigadores notables Estándar como lenguaje no estricto y puramente funcional. Haskell 98 es la última versión del lenguaje.

La principal información sobre el lenguaje Haskell puede consultarse en la dirección: http://www.haskell.org

Propiedades de Haskell

En un lenguaje funcional se pueden definir funciones las cuales se usan en una expresion cuyo valor tiene que ser calculado. Para calcular el valor de una expresion se necesita un programa que entienda las definiciones de las funciones. Tal programa se llama interprete.

En el fichero prelude están las definiciones de las funciones estándar. Lo primero que hace el interprete es analizar estas funciones estándar. ‘Prelude’ significa ‘preludio’: este archivo se examina antes de que se puedan definir nuevas funciones.

Finalmente, el interprete comunica que se puede teclear .


   Type :? for help

   Prelude>   

El signo de interrogación indica que el interprete esta listo para calcular el valor de una expresion. En el prelude están definidas, entre otras, las funciones aritméticas. Se puede usar el interprete como calculadora.


   Prelude> 5+2*3
   
   11

   (5 reductions, 9 cells)
   
   Prelude>

El interprete calcula el valor de la expresion (el operador * indica multiplicación). Después de decir cual es el resultado, el interprete indica lo que fue necesario para el calculo: ‘5 reductions’ (una medida para el tiempo utilizado) y ‘9 cells’ (una medida para la memoria utilizada).

Prelude> ,indica que el interprete esta listo para el próximo cálculo.

CONCEPTOS de HASKELL
En un lenguaje funcional se pueden definir nuevas funciones aparte de las que están definidas en el preludio. La definición de una función se almacena en un fichero. El fichero se puede crear con cualquier procesador de textos.

El procesador de textos se arranca con el comando ‘:edit’, seguido por el nombre de un fichero,


   Prelude> :edit nuevo

Por los dos puntos al principio de la regla, el intérprete sabe que edit no es una expresion, sino un comando interno. El procesador de textos ocupa temporalmente el lugar que ocupaba Haskell en la pantalla.

EJ: Para la Función factorial debe definirse la función factorial en un fichero, por ejemplo el fichero ‘nuevo’. El factorial de un numero n (normalmente escrito como n!) es el producto de los números desde 1 hasta n inclusive, ej. 4! = 1* 2 * 3 * 4 = 24.

La definición sería:


    fac n = product [1..n]

Esta definición usa la notación para ‘lista de números entre dos valores’ y la función estándar product.

Luego se guarda este fichero como nuevo.hs y se puede salir del procesador de textos.

Para usar la nueva función, se puede indicar a través del comando :load


    Prelude> :load nuevo

COMANDOS DEL INTERPRETE de HASKELL
Además de :edit y :load, existen otros comandos que se envían directamente al interprete. Todos empiezan por dos puntos. Algunos de comandos son:

FUNCIONES Y OPERADORES de HASKELL
Los nombres de las funciones y los parámetros tienen que empezar con una letra minúscula, (minúsculas y mayúsculas son diferentes para el interprete).

Después pueden seguir mas letras (minúsculas y mayúsculas), pero también números, el símbolo ’ y el símbolo _.

Algunos ejemplos de nombres de funciones y parámetros son:


    f               sum            x3               g’             

    tot_de_macht                 nombreLargo

Volver al principio

TIPOS de HASKELL:
El sistema de tipos es utilizado para detectar errores en expresiones y definiciones de función.

Cada tipo tiene asociadas un conjunto de operaciones que no tienen significado para otros tipos, por ejemplo, se puede aplicar la función (+) entre enteros pero no entre caracteres o funciones.

Una propiedad importante del Haskell es que es posible asociar un único tipo a toda expresión bien formada. Esta propiedad hace que el Haskell sea un lenguaje fuertemente tipado. Como consecuencia, cualquier expresión a la que no se le pueda asociar un tipo es rechazada como incorrecta antes de la evaluación.

El análisis tiene dos fases:

FUNCIONES de HASKELL
Si a y b son dos tipos, entonces a->b es el tipo de una función que toma como argumento un elemento de tipo a y devuelve un valor de tipo b.

Las funciones en Haskell son objetos de primera clase. Pueden ser argumentos o resultados de otras funciones o ser componentes de estructuras de datos.

En Haskell, la función suma tiene el tipo:

LISTAS de HASKELL
Si a es un tipo cualquiera, entonces [a] representa el tipo de listas cuyos elementos son valores de tipo a.

Hay varias formas de escribir expresiones de listas:

Enunciando explícitamente sus elementos (por ejemplo, [1,3,10]) o

Añadiendo un elemento al principio de otra lista utilizando el operador de construcción (:).

Estas notaciones son equivalentes:

[1,3,10] = 1:[3,10] = 1:(3:[10]) = 1:(3:(10:[]))

El operador (:) es asociativo a la derecha, de forma que 1:3:10:[] equivale a

(1:(3:(10:[]))),

Una lista cuyo primer elemento es 1, el segundo 3 y el último 10.

El standar prelude incluye un amplio conjunto de funciones de manejo de listas.

Por Ej.: length xs devuelve el número de elementos de xs


   Prelude>length [1,3,10]
  
   3

Obsérvese que todos los elementos de una lista deben ser del mismo tipo.

La expresión ['a',2,False] no está permitida en Haskell

CADENAS de HASKELL
Una cadena es tratada como una lista de caracteres y el tipo "String" se toma como una abreviación de "[Char]".

Las cadenas pueden ser escritas como secuencias de caracteres encerradas entre comillas dobles. Todos los códigos de escape utilizados para los caracteres, pueden utilizarse para las cadenas.

Ej.


    Prelude>"hola" 
    
    hola

Puesto que las cadenas son representadas como listas de caracteres, todas las funciones del standar prelude para listas pueden ser utilizadas también con cadenas:

Ej.


		   Prelude> length "Hola"
		   4
		
		   Prelude> "Hola, " ++ "amigo"
		   Hola, amigo

TUPLAS de HASKELL
Los elementos de una tupla pueden tener tipos diferentes. Sin embargo, el tamaño de una tupla es fijo.

Si t1, t2, ..., tn son tipos y n >= 2, entonces hay un tipo de n-tuplas escrito


    (t1, t2, ..., tn) 

cuyos elementos pueden ser escritos también como


    (x1, x2, ..., xn) 

donde cada x1, x2, ..., xn tiene tipos t1,t2, ..., tn respectivamente.

Ejemplo:


		   (1, [2], 3) :: (Int, [Int], Int)
		
		   ('a', False) :: (Char, Bool)
		
		   ((1,2),(3,4)) :: ((Int, Int), (Int, Int))

Existe una tupla especial con 0 elementos denominada tipo unidad y se escribe como ().

INDUCCION Y RECURSIVIDAD
En la definición de una función se pueden usar las funciones estándar y las funciones definidas por el usuario.

Pero también se puede usar la propia función que se define en su definición. A tal definición se la llama definición recursiva.

La siguiente función es una función recursiva:

f x = f x

Las funciones recursivas tienen sentido bajo las siguientes dos condiciones:

- El parámetro de la llamada recursiva es mas simple que el parámetro de la función que se quiere definir (por ej., numéricamente menor o una lista mas corta);

- Existe una definición no recursiva para un caso base.

Una definición recursiva de la función factorial es:


   fac n | n==0 = 1

   | n>0 = n * fac (n-1)

Aquí el caso base es n==0; en este caso se puede calcular el resultado directamente (sin recursión).

En el caso n>0 existe una llamada recursiva, es decir fac (n-1).

El parámetro de esta llamada (n-1) es menor que n.

Otra manera de distinguir estos dos casos (caso base y caso recursivo) es usando patrones:


   fac 0 = 1
   
   fac (n+1) = (n+1) * fac n

También en este caso el parámetro de la llamada recursiva (n) es menor que el parámetro de la función que se quiere definir (n+1).

El uso de patrones tiene mucha relación con la tradición matemática del usar inducción.

Por ejemplo, la definición matemática de la función potencia puede ser usada casi directamente como función


   x ^ 0 = 1

   x ^ (n+1) = x * x^n

Una definición recursiva en que se usan patrones para distinguir diferentes casos (en lugar de expresiones booleanas) se llama también definición inductiva.

Las funciones sobre listas también pueden ser recursivas. Una lista es ‘menor’ que otra si tiene menos elementos.

Por ej.
función suma, puede ser definida de diferentes maneras. Una definición recursiva con expresiones booleanas es:


   suma lista | lista==[] = 0   (Sume la lista; si la lista esta vacía de por resultado igual a cero)

   | otherwise = head lista + suma (tail lista)    (sino sume la cabeza de la lista más la suma de la cola)

Pero también es posible obtener una version inductiva (usando patrones):


   suma [] = 0

   suma (cabeza:cola) = cabeza + suma cola

Es mas clara una definición con patrones, porque las diferentes partes en el patrón pueden conseguir un nombre directamente (como cabeza y cola en la función suma).

En la versión recursiva de suma se necesitan las funciones estándar head y tail para distinguir las diferentes partes en lista.

Volver al principio

PATRONES

Volver al principio


Paradigma: Hay ciertos defectos que bién manejados..
brillan más que la misma virtud..!!
(Rochefocauld)

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA HEURÍSTICO

Si consultas un diccionario, encontraras que el término heurístico:

Para nosotros los sistémicos el concepto inicial de la palabra heurística, conviene que lo interpretes como una especie de algorítmo inteligente de búsqueda.
El paradigma heurístico nace como necesidad de encontrar programas de capaces de resolver los típicos problemas de búsqueda de la mejor solución cuando las alternativas son numerosas, tales como:

Para resolver este tipo de planteos se recurre a la Programación Heurística asociada a la INTELIGENCIA ARTIFICIAL, que es la rama de la ciencia que, simulando la operativa de su razonamiento intenta emular en el ordenador los procesos mentales inteligentes del hombre.

Con tal fin, es necesario aplicar HUEURISTICAS, que son elementos operativos que resultan de agregarles conocimiento a los métodos de búsqueda para hacerlos más eficientes.

EJEMPLOS:


A priori podemos ver que no existe ningún procedimiento o algoritmo matemático que capaz de resuelver estos problemas, por ello será necesario probar diversas alternativas de acciones hasta hallar la solución óptima, dentro de todas las combinaciones posibles y cuya evaluación puede requerir largos lapsos de tiempo.

Para explorar tales combinaciones, la Inteligencia Artificial desarrolló técnicas como la búsqueda en profundidad, en amplitud, etc. de manera que algunos problemas pueden tratarse con métodos de búsqueda convencionales.

Para restringir restringir la búsqueda a solo un subconjunto de combinaciones posibles, conviene podar los caminos superfluos, aplicando heurísticas del tipo atajos dependientes del problema a tratar que la búsqueda insuma menor tiempo.

El éxito de una heurística dependerá de su calidad, pues en tarea de minimizar el tiempo de respuesta, puede ocurrir que determinadas heurísticas aplicadas no sean eficientes, que no lleven la solución del problema, por haber desechado caminos potencialmente válidos y por evaluar alternativas inútiles.

Por todo lo anterior, podemos deducir que en este paradigma, promueve aquel tipo de programación que aplica para la resolución de problemas reglas de buena lógica o heurísticas, proporcionando entre varios cursos de acción uno que presenta características de ser el más eficiente, pero que aún así, no garantiza necesariamente la solución cierta.

La Programación Heurística implica la aplicación del conocimiento específico integral de la naturaleza del problema a resolver, que comprende además de su operatoria, la manera cómo se genera y que efectos produce. Solo así podrá minimizarse el tiempo de búsqueda de las alternativas más eficaces.

Ahora bien, si una búsqueda heurística exhaustiva maximiza la posibilidad de alcanzar la solución óptima del problema, es necesario prever que el insumo de tiempo de esta tarea, puede ser demasiado extenso, con guarismos en años que superan una vida y aún así queda la posibilidad de no arribar a una solución final.

Las creaciones heurísticas por ser reglas de sentido común, pueden codificarse en cualquier lenguaje de programación, por ello el paradigma heurístico al contrario que otros, no deviene en un lenguaje de programación específico. Aunque sus conceptos están soportados en entornos de Inteligencia Artificial como KC, KEE o ART y encuentran su mayor campo de aplicación dentro de esta disciplina.

En la siguiente nómina que es incompleta, la idea es solo proporcionar formatos de problemas donde la programación heurística puede dar mejores resultados que la programación clásica.

Además de la Inteligencia Artificial la INGENIERIA DEL CONOCIMIENTO, también se apoya puntual y genéricamente del paradigma heurístico, porque utiliza sus conceptos de forma instrumental cuando resuelve los problemas de naturaleza completa no algorítmica.

En rigor, la programación heurística más que un modo de programación, es un método de guía para búscar soluciones a problemas computacionalmente complejos y aunque su ingente cantidad de alternativas factibles no aseguran el encontrar una solución óptima, sino solo una adecuada a determinadas circunstancias.

PROGRAMACION HEURÍSTICA
La Programación Heurística es el tipo de programación computarizada que resuelve problemas, aplicando reglas de buena lógica, denominadas heurísticas, que proporcionan entre varias alternativas de acción, la más optimista a pesar de no garantizar necesariamente la más efectiva.

La Programación Heurística constituye una forma de modelizar la representación de la estructura, estrategias de búsqueda y métodos de resolución de problemas.

La Programación Heurística es aplicada frecuentemente en el campo de la Inteligencia Artificial, especialmente en la Ingeniería del Conocimiento, dado que el hombre opera generalmente aplicando heurísticas, que constituyen conclusiones del razonamiento humano sobre un tema específico, apoyado en la experiencia, utilizando reglas de buena lógica.

La programación heurística permite procesar..
... por computadora los siguientes tipos de problemas:

El común denominador de estos problemas es la necesidad de buscar exhaustivamente entre las posibles, un conjunto finito de alternativas, cuya cantidad de elementos esté controlada, de manera de evitar un crecimiento exponencial del espacio de búsqueda, que sería imposible de procesar.

El algoritmo heurístico
Usa procedimientos de búsqueda de soluciones casi óptimas a razonables costos operativos, sin garantizar la optimización de las soluciones generadas ni determinar la distancia a la solución óptima. Así, el Paradigma Heurístico definirá modelos de resolución de problemas que incorporan alguna componente basada en:

Programación Heurística se presenta
Como:

Conviene aplicar Programación Heurística, cuando . .

PARADIGMA: Las computadoras no causan problemas
..hasta que las enciendes..!! (Wilucha)

Especificaciones del tratamiento heurístico
Las principales especificaciones del tratamiento heurístico tienen en cuenta sus características de información y de las especificaciones del problema, destacando los siguientes aspectos:

Si hubiera un lenguaje heurístico
Si definiéramos un lenguaje heurístico, dado que la programación heurística aplicada al campo de la I.A, y que posee heurísticas diseñadas con herramientas de esta área, sus características más destacables serían:

EJEMPLO: Se desea optimizar la provisión de la caña de azúcar, usada como materia prima en los ingenios azucareros.

En este problema, entre muchos otros, intervienen como factores de decisión aspectos, como la distancia y estado de los caminos que unen los cargaderos de caña con los ingenios; el costo unitario del medio de transporte; el precio de venta de la caña de cada proveedor; el precio de compra que paga cada ingenio, etc. La cantidad de alternativas de solución a evaluar serían:


   1    alternativa     para 1 ingenio  y 1 cargadero
   2    alternativas    para 2 ingenios y 2 cargaderos
   6    alternativas    para 3 ingenios y 3 cargaderos
   24   alternativas    para 4 ingenios y 4 cargaderos
   120  alternativas    para 5 ingenios y 5 cargaderos
   720  alternativas    para 6 ingenios y 6 cargaderos
Y si la cantidad correspondiera a la Provincia de Tucumán que tiene 14 ingenios azucareros, la cantidad, suponiendo solo 14 cargaderos sería el factorial de 14, que es un número demasiado grande..!!! que prácticamente no podríamos evaluar uno a uno.

En la realidad el problema se agrava, porque la provincia tiene cientos de cargaderos y si no contamos con una buena heurística estamos fritos..!!!, pero por suerte podemos probar con alguno de los algoritmos heurísticos siguientes:

PARADIGMA: Errar es humano, pero para enrredar las cosas en grande
..hace falta una computadora..!! (Wilucha)

CARACTERISTICAS del PARADIGMA HEURISTICO
Como se ha señalado inicialmente, un paradigma de programación es un modelo básico de diseño e implementación de programas. Un modelo que permite producir programas de acuerdo con una metodología específica. Así, el paradigma de programación estructurada se basa en estructuras modulares, con fuerte cohesión en el módulo y bajo acoplamiento entre ellos, desarrollo "top-down", utilización de diagramas privilegiados, etc.

El Paradigma Heurístico define, pues, un modelo de resolución de problemas en el que se incorpora alguna componente heurística sobre la base de:

PROGRAMACION HEURISTICA
Se puede definir como "aquel tipo de programación computacional que aplica para la resolución de problemas reglas de buena lógica (reglas del pulgar),denominadas heurísticas, las cuales proporcionan entre varios cursos de acción uno que presenta visos de ser el más prometedor, pero no garantiza necesariamente el curso de acción más efectivo."

Muchas de las más interesantes y difíciles tareas de programación implican utilizar el ordenador para resolver problemas del tipo: "¿Cuál es el camino más corto ?" "Listar todos los casos posibles ", "¿Existe una disposición de elementos que satisfaga ?. Las características de tales problemas implica potencialmente una búsqueda exhaustiva de todas las posibles combinaciones de algún conjunto finito, que si no está controlado puede producir una "explosión combinatoria" (incremento exponencial del espacio de búsqueda con la dimensión del problema) imposible de tratar.

La Programación Heurística ha venido a significar el uso del conocimiento específico del dominio para cubrir esta explosión de posibilidades guiando la búsqueda por las direcciones más prometedoras.

La Programación Heurística implica una forma de modelizar el problema en lo que respecta a la representación de su estructura, estrategias de búsqueda y métodos de resolución, que configuran el Paradigma Heurístico.

Este tipo de programación se aplica con mayor intensidad en el campo de la Inteligencia Artificial (I.A.), y en especial, en el de la Ingeniería del Conocimiento, dado que el ser humano opera la mayor parte de las veces utilizando heurísticas, un hecho cierto que una heurística es la conclusión del razonamiento humano en un dominio específico, por lo que es normal que este tipo de programación que encuadrado en el área de la I.A, ya que implementa el conocimiento humano, dado por la experiencia, utilizando reglas de buena lógica.

Por otra parte, la Programación Heurística se presenta y utiliza desde diferentes puntos de vista:

En general, un modelo heurístico es aconsejable si puede proporcionar resultados superiores a los del modelo actual.

Un paradigma que corresponde a los lenguajes de cuarta generación es la inteligencia artificial, que se ha resuelto con lenguajes de programación como PROLOG y LISP; el primero, desarrollado en 1956-1962 por J. McArthy y el segundo por A. Colmerauer en 1972, para el desarrollo de inteligencia artificial, que corresponden ambos a la definición de lenguajes funcionales o aplicativos.

Ejemplo: Problema de las jarras de agua:

Se tienen dos jarras de agua, una de 4l y otra de 3l sin escala de medición.

Se desea tener 2l de agua en la jarra de 4l. Las siguientes operaciones son válidas: llenar las jarras, tirar agua de las jarras, pasar agua de una jarra a otra.

Solución:

El programa debería encontrar un pasaje de estados para ir del estado (0,0) al estado (2,0). Puede existir más de un pasaje de estados hacia la solución, por ejemplo:

(0,0) => (0,3) => (3,0) => (3,3) => (4,2) => (0,2) => (2,0)

en la cual, a partir del estado inicial, se aplicaron las reglas 2, 8, 2, 6, 3 y 8, hasta conseguir el estado objetivo.

Otro pasaje de estados hacia la solución es la siguiente

(0,0) => (4,0) => (1,3) => (1,0) => (0,1) => (4,1) => (2,3) => (2,0)

en la cual se aplicaron las reglas 1, 5, 4, 7, 1, 5 y 4

Con respecto a las reglas se puede concluir que:

METODOS DE BUSQUEDA
  1. Búsqueda Breadth-First Search (primero en ancho) Este algoritmo de búsqueda visita cada nodo del árbol por niveles, es decir, visita todos los nodos de un nivel antes de visitar los del siguiente. A continuación se detalla un pseudo-código de este algoritmo:

    Lista_nodos = [estado_inicial];
    Mientras Not Vacia(lista_nodos)
    estado_actual = lista_nodos.primero;
    Si EstadoFinal(estado_actual) entonces
    Terminar;
    Sino
    lista_reglas = ReglasAplicables (estado_actual);
    Mientras NOT Vacia(lista_reglas)
    estado_sucesor = AplicarRegla (lista_reglas);
    lista_nodos = lista_nodos + [estado_sucesor];
    Fin Mientras;
    Fin Sino;
    Fin Mientras;

    Con la búsqueda a lo ancho se asegura que una vez alcanzada una solución no existe otra ruta hacia la solución que tenga menor cantidad de pasos. Una desventaja de este algoritmo es que para alcanzar una solución de n pasos, debe haber explorado todo el espacio de estados hasta ese nivel.

  2. Búsqueda Depth-First Search (primero en profundidad)
    Este algoritmo de búsqueda continúa por una rama del árbol hasta encontrar la solución o decidir terminar la búsqueda por esa dirección (por llegar al estado final, por tener un largo de ruta que supera una cota máxima determina, por haber llega a un estado ya visitado, etc.). Al fracasar una ruta, se realiza un backtracking o vuelta atrás, continuando la exploración en el paso inmediatamente anterior. A continuación se detalla un pseudo-código de este algoritmo recursivo que incialmente es llamado con el estado_inicial:

    Función Buscar (estado_actual) devuelve Boolean
    Comienzo
    Si EstadoFinal(estado_actual) entonces
    Devolver TRUE;
    Sino
    exito = FALSE;
    lista_reglas = ReglasAplicables (estado_actual);
    Mientras NOT exito AND NOT Vacia(lista_reglas)
    estado_sucesor = AplicarRegla (lista_reglas);
    exito = Buscar (estado_sucesor);
    Fin Mientras;
    Devolver exito;
    Fin Sino;
    Fin Buscar;

    Como desventajas de este algoritmo se señala que puede seguir una ruta infructuosa durante muchos pasos, y además la primera solución que encuentra puede distar mucho de ser la solución de mínima cantidad de pasos.

Volver al principio


PARADIGMA: La experiencia no tiene valor ético..
..solo es el nombre que le damos a nuestros errores..!!! (Wilucha)

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA IMPERATIVO
Llamado también PARADIGMA ALGORITMICO: Encuentra soluciones a problemas basándose en la operativa de la máquina de VON NEWMAN, que está provista de un programa en su memoria, el cual se va ejecutando secuencialmente, alimentándose de datos de tal memoria, con los que efectúa sus cálculos, para luego actualizar esta memoria.

La programación en el entorno del paradigma imperativo determina los datos que son requeridos para el cálculo, asocia a esos datos a variables que son direcciones de memoria, para luego efectuar paso a paso, las transformaciones de los datos almacenados, de forma que el valor final de la variable sea el resultado buscado.

En el lenguaje común, a la serie de transformaciones realizadas sobre los datos originales les llamamos cálculos, que son generados por los algoritmos que transforman los datos de entrada en la solución al problema en cuestión.

Para guiar estos cálculos, el paradigma imperativo proporciona en su versión básica las siguientes estructuras de control de flujos de datos:

Estas estructuras básicas existen en cualquier programa construido bajo el paradigma imperativo, cuya evolución ha generado otros nuevos tipos de estructuras de control de flujo, tales como while, do, if..then..else, etc que simplifican la tarea del programador.

Además, la naturaleza primaria de las celdas de memoria ha sido sustituida progresivamente por abstracciones como las variables, registros, array y otros tipos de datos complejos que simplifican el diseño de los algoritmos del programa.

Independiente de tales modificaciones, el rasgo característico del paradigma imperativo es la presencia de EFECTOS LATERALES, porque maneja el concepto de celda de memoria o las abstracciones surgidas sobre él, donde los cálculos intermedios siempre modificaran tales celdas, variables o estructuras de datos que representan el estado actual del problema en la computadora.-

Por otra parte, la existencia de estructuras de control es inevitable ya que la implementación de un algoritmo implica la existencia de una serie de pasos precisos, en forma de secuencias de instrucciones, bifurcaciones, repeticiones definidos por el programador.

En este ámbito, un error en la secuencia será un error lógico que implicará un resultado erróneo, y un error en la asignación de un valor a una variable implicará un error de cálculo que distorsionará los cálculos subsiguientes.

CARACTERISTICAS del PARADIGMA IMPERATIVO:
Opera comandos que actualizan variables que estan en almacenamiento. Basado en el modelo de computador del modelo de Von Neumann, que es una máquina capaz de ejecutar una serie de instrucciones secuencialmente, una tras de otra. Estas instrucciones deben estar almacenadas en memoria principal para poder ser leídas y ejecutadas por la unidad de control. Los dispositivos periféricos nos permiten obtener los resultados e introducir datos que queremos procesar en el sistema.

Como un Algoritmo, es un método preciso para resolver automáticamente un problema. Consta de una representación de los datos que se manejan y un conjunto de pasos tales que cada uno de ellos resuelve un problema menor. Es necesario describir el orden en el que se deben ejecutar estos pasos para poder introducirse en el ordenador y para esto,el paradigma imperativo tiene su límite natural en dos de sus características intrínsecas:

  1. EFECTOS LATERALES: La existencia de estos efectos por una aparte, hacen que los programas no sean seguros puesto que cualquier posición de memoria puede ser actualizada de forma no adecuada, y otra parte, el concepto de una única memoria global actualizada de forma repetida por las instrucciones del programa dificulta la portabilidad y reusabilidad de código.-

    Por tal razón, para minimizar los problemas por la existencia de variables en memoria compartida aparece el paradigma funcional, donde la ausencia de efectos laterales es su rasgo definitorio fundamental.

  2. LIMITACION de APLICACION: Su operativa se ajusta únicamente a aquellos problemas de naturaleza algorítmica clásica, similares en ejecución al de los cálculos matemáticos que no abordan con solvencia muchos problemas interesantes para resolver con la computadora.

En resumen, el paradigma imperativo propicia un entorno de programación procedimental, donde la secuencia de control y el concepto de variable son sus componentes fundamentales, que destacan las siguientes características:

EL ALGORITMO: Puede ser entendido como la estructura que guía la definición de las acciones que debe realizar un programa, como también sus estructuras de datos de tipo de variable, tales como el array, registro, fichero, etc., sobre los que acturá el algoritmo.

Por ello, este paradigma llamado también ALGORITMICO, es de tipo procedimental de efecto lateral, que insume mucha memoria para almacenar salidas codificadas de procesos y efectua secuencias de instrucciones para modificar tal memoria.

Este paradigma, asocia datos necesarios para cálculos con direcciones de memoria, para luego efectuar secuencias de transformaciones en los datos almacenados, hasta lograr el resultado final. Se caracteríza por aplicar:

  1. CONCEPTO DE CELDA DE MEMORIA ( variable ):
    Posee almacenamiento de datos en una memoria provista de muchas celdas donde guarda los valores de cada variable usada. Este componente principal de la arquitectura es la memoria, compuesto por un gran número de celdas donde se almacenan los datos. Las celdas tienen nombre (concepto de variable) que las referencian, y sobre los que se producen efectos de lado y definiciones de alias.

  2. OPERACIONES DE ASIGNACION
    Cada valor calculado es almacenado o asignado a la celda, de manera de actualizar el valor grabado. Está ligado a la arquitectura de la memoria, se encuentra la idea de que cada valor calculado debe ser "almacenado", es decir asignado a una celda. Esta es la razón de la importancia de la sentencia de asignación en el paradigma imperativo. Las nociones de celda de memoria y asignación en bajo nivel, se tienden a todos los lenguajes de programación y fuerzan en los programadores un estilo de pensamiento basado en la arquitectura de Von Neumann. Las asignaciones poseen la forma siguiente:

    expresión1:=expresión2
    donde: 1: denota la localidad de memoria y 2 : denota un valor.

  3. REPETICION
    El programa imperativo efectua su tarea iterando secuencias de pasos elementales o sea, realiza su tarea ejecutando repetidamente una secuencia de pasos elementales, ya que en este modelo computacional la única forma de ejecutar algo complejo es repitiendo una secuencia de instrucciones.

PROGRAMACION IMPERATIVA
Debido a su relación cerrada con las arquitecturas de las máquinas, los lenguajes de Programación Imperativa pueden ser implementados eficientemente.

La base de la programación imperativa es la completa especificación y manipulación controlada de datos con nombre de una manera secuencial. Esta programación se cree que se ajusta a la mente humana. Sus características son:

  1. Los Datos. Cada dato tiene una representación y un número de propiedades conocidas como tipo.
  2. El Estado De Los Programas. Una actividad importante de un programa en un lenguaje imperativo es el cambio del estado interno de la computadora representado por los valores de las variables y del estado externo representado por las entradas y salidas a dispositivos.
  3. El Flujo De Control. Los lenguajes imperativos dan al programador un control extensivo sobre el orden en el cual se ejecutan los enunciados en el programa. Los mecanismos usuales son: secuencia, selección, repetición e invocación de rutinas.
  4. La Composicion De Los Programas. Se pueden distinguir cuatro niveles de jerarquía: bloques, rutinas, paquetes (módulo o tareas) y programas.
  5. Efectos de una Asignación: Una propiedad característica de una asignación es que cambia el valor almacenado (estado actual) en una dirección (localidad) de memoria en un computador. Los conceptos de "estado" y "localidad" vienen directamente del modelo del computador para el lenguaje imperativo.

    Ejemplo 1:

    	Programa:	 a:=b+c
    		 b:=b+1
    
    	Estado 0:	a=2
    		b=3
    		c=4
    
    	 Modificacion:	a:=b+c
    	 Estado 1:	a=7
    			b=3
    			c=4
    
    	 Modificacion:	 b:=b+1
    	 Estado 2:	 a=7
    			 b=4
    			 c=4

    Ejemplo 2: Cálculo del modulo entre 2 números

    	función mod (x, y: enteros) : entero
    	inicio
    	z := x
    	mientras z >= y hacer
    	z := z - y
    	finmientras
    	devolver z
    	fin
    

    Resultan las siguientes caraceristicas:

    • Asignación de memoria almacenamos el valor del argumento en una variable z

      z:=x

    • Todos los calculos efectuados son almacenados en alguna direccion de memoria(variable):

      z := z - y

    • Repeticion , se ejecuta una instruccion en forma repetida mientras cumpla con una condición (z >= y):

      mientras

      z >= y hacer

      z := z - y

      finmientras

Volver al principio


Paradigma: La lógica es un método sistemático
que puede generar con confianza..
... la conclución erronea..!!
( Wilucha )

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA LOGICO
Resuelve problemas descriptos como las relaciones de un conjunto de datos, sobre las que aplica reglas de deducción y a partir de tales premisas genera conclusiones aceptadas como validas. Usa la lógica de predicados, o aserciones lógicas que representan el conocimiento sobre un ambito.

El programador especifica hechos y propiedades del problema, no como debe resolverse; es el sistema quién debe buscar la solución, usando:

Robert Kowalski crea el paradigma lógico, basado en las cláusulas de Horn, registradas en formato restrictivo, como un subconjunto de la Lógica de Predicados de primer orden. Desde el Imperial College de Londres uso tal formato restrictivo, provisto de una conclusión por cláusula, expresando mediante notación causal, proposiciones condicionales que combinan variables, constantes y expresiones de la forma:


   Casado( x, y )   
   SI esposo( y , x )  o  
   esposa( x , y )

Volver al principio


Paradigma: Cuando veas un hombre bueno
..trata de imitarlo..!!
..cuando veas un hombre malo, examinate a ti mismo..!!
( Confucio )

Volver al principio
Demostrativo
Funcional
Heuristico
Imperativo
Logico
O Objeto
Procedimental

PARADIGMA PROCEDIMENTAL

Características: Siguen una secuencia, paso a paso para obtener la solución al problema, pero su mayor dificultad reside en determinar si el valor computado es una solución correcta del problema, por lo que se han desarrollo una multitud de técnicas de depuración y verificación para probar la corrección de los problemas desarrollados basándose en este tipo de paradigmas.

Si un procedimiento es correcto, cada vez que sea ejecutado producirá, en principio, resultados correctos. Por el contrario, en caso de que el procedimiento contenga errores, se puede agilizar la búsqueda de éstos últimos y repararlos rápidamente.

Un programa puede verse como una secuencia de llamadas a procedimientos. El programa principal es el responsable de pasar los datos individuales en cada llamada, los datos son procesados y una vez que el programa finaliza, se presentan se obtienen los resultados finales.

Los paradigmas procedimentales definen la secuencia explícitamente, pero esta secuencia se puede procesar en serie o en paralelo. En este segundo caso el procesamiento paralelo puede ser asincronico (cooperación de procesos paralelos) o sincrónico (proceso simples aplicados simultáneamente a muchos objetos).

Ejemplo: En lenguaje C, veamos como se implementaría una pila:

Una pila tiene aplicaciones en distintas áreas, desde compiladores hasta algoritmos numéricos y es una de las estructuras de datos más simples.


			typedef struct {
			float v[20];
			int tope;
					  } Pila;
		 
			void mete(Pila *P, float val) {
			P->v[(P->tope)++] = val;
						}
		 
			float saca(Pila *P) {
			return( P->v[--(P->tope)] );
					}
		 
			void inicializa(Pila *P) {
			 P->tope = 0;
					}
		 
			int llena(Pila *P) {
			  return(P->tope >= 20);
					}
		
		

Para usar la estructura anterior en C se tiene que hacer lo siguiente: Pila P; inicializa(&P); /* inicializa la Pila */ mete(&P, 2.31); /* se meten algunos */ mete(&P, 1.19); /* elementos a la Pila*/ printf(''%g\n'', saca(&P)); /* se saca un elemento */ /* y se imprime */ mete(&P, 6.7); /* se pueden hacer operaciones */ mete(&P, saca(&P) + saca(&P); /* mas complejas */.

Los procedimientos son una secuencia de instrucciones que pueden ser llamados en forma repetida en distintas partes del programa, reduciendo el código y la complejidad de un programa .

Volver al principio


Paradigma: Hay ciertos defectos que bién manejados..
brillan más que la misma virtud..!!
Rochefocauld

Declarativo
Demostrativo
Funcional
Heuristico
Imperativo
Logico
Orientado Objeto
Procedimental

PARADIGMA ORIENTADO A OBJETOS

El origen del Paradigma Orientado a Objeto ( POO para los amigos..!!), se remonta a los años sesenta, cuando es concebido como un método que trata de emular en el ordenador, el funcionamiento del mundo real. Así, parte del hecho, que para resolver tus problemas cotidianos no necesitas recurrir a la aplicación de algoritmos o heurísticas estructuradas con listas, colas, pilas, árboles, registros, etc; pues solo recurres a utilizar algunas acciones con los objetos que tienes a tu alcance..!!

Como nuestro ámbito cotidiano está constituido por objetos, estamos rodeados de ellos, convivimos con ellos; ineludiblemente los usamos para encarar nuestros problemas y por ello, no te parece genial adoptar esta realidad, como modelo para diseñar nuestras heurísticas informáticas..!!
El POO, que implica ser codificada mediante la Programacion orientada a objetos, representa el "Antes y el despues de la programación informática", que factiblemente te acompañará por mucho tiempo y para ello, cuenta con las siguientes características:

Esta filosofía de diseño avanzado de software, se remonta al lenguaje SmallTalk, quién guiado por las pautas del paradigma orientado a objetos, propone soluciones a los típicos problemas de la programación, tales como:
- La falta de reusabilidad del código, en desmedro de la rentabilidad.

- La dificultad de modificar, actualizar o efectuar reingenieria de sistemas, minimizando así su vida útil.

- Los laboriosos, traumáticos y extensos procesos de desarrollo, carentes de codificación no intuitiva.

- La falta de portabilidad.

La Orientación a objetos es una metodología de análisis, diseño e implementación que configuran las fases fundamentales del ciclo de vida de un sistema informático, permitiendo una representación mas directa del mundo real, considerando un sistema como un conjunto de objetos, que sufren cambios en su comportamiento debido a la ocurrencia de eventos en su ambiente.

Una objeto, o ente, o entidad es todo aquello que existe; que puede ser percibido, representado mentalmente o conceptualizado por una persona; y puede ser:
- Objeto real o concreto: Ejemplo, una PC, un alumno, una webpage.

- Objeto ideal o abstracto: Ejemplo, un amor, una relación, un símbolo.

Las entidades se conocen a través de sus propiedades.
- Una propiedad es una característica que posee una entidad.

- Una entidad tiene un número ilimitado de propiedades.

- Aquellas propiedades de una entidad que son conocidas por un sujeto se denominan atributos.

- El conjunto de valores asignados a los atributos de una entidad, en un instante de tiempo dado, recibe el nombre de estado de la entidad.

- Las entidades pueden cambiar su estado con el tiempo.

- Un cambio de estado implica un cambio en uno o varios de los valores de los atributos de una entidad.

- Los cambios de estado son ocasionados por eventos que acontecen en un momento dado y que modifica o altera en modo alguno el estado de una entidad.

Todo evento dá inicio a un proceso que a su vez es un evento complejo, compuesto por una secuencia de uno o más eventos simples o complejos.

El término orientación a objetos (OO) es utilizado para referirse a un conjunto creciente de tecnologías de sofware que van desde los lenguajes de programación OO, pasando por los sistemas de bases de datos OO, las interfaces gráficas OO y los sistemas operativos OO, hasta llegar a la Ingeniería de Software OO y su aplicación a los sistemas de información OO. Tales tecnologías proveen conceptos, métodos, técnicas y herramientas para:

- Modelar el mundo real en una forma lo más cercana posible a la perspectiva del usuario.

- Interactuar facilmente con un entorno computacional utilizando metáforas familiares al usuario.

- Construir componentes de software reutilizables, asi como librerías de módulos de software facilmente extensibles.

- Modificar y extender facilmente las implementaciones de los componentes sin tener que recodificar los programas desde el inicio.

El POO, enfrenta estos inconvenientes adoptando la idea natural tomada de la existencia de nuestro mundo conformado de objetos reales, con los cuales podemos resolver tales problemas. Así, emulando tal realidad cotidiana del hombre, recurre al concepto de OBJETO, como una estructura compleja que pretende representar otra similar del mundo real, basada en las siguientes características que definen su propia naturaleza:

  1. Abstracción de Datos
  2. Encapsulación
  3. Polimorfismo
  4. Herencia
  5. ¿Qué es un Objeto?
  6. Operación Secuencial
  7. Método
  8. Datos del Objeto
  9. Soluciones con POO
  10. Reutilización
  11. SMALLTALK

  1. ABSTRACCION DE DATOS
    Permite diferenciar entre el comportamiento de un objeto o, la acción que es capaz de realizar y cómo lleva a cabo este comportamiento. Esta abstracción de datos se implementa a través de una interface de objeto, que permite a un objeto emisor comunicarse con otro objeto receptor, pero el objeto emisor desconoce la forma en que se lleva a cabo la acción solicitada (mensaje).

    Es la propiedad que destaca las características esenciales del objeto, distinguiéndola de otros tipos de objetos y según la perspectiva del que efectúa la abstracción, muestra su límite, así, los principales elementos del Diseño Orientado a Objetos consiste en componer niveles y conjuntos adecuados de abstracciones.

    El planteo de una correcta abstracción genera la amigabilidad del sistema, así por ejemplo, cuando decimos “soporte expeditivo de información interactiva para evaluativos” estamos planteando un nivel de abstracción elevada del “machete de examen”.

  2. ENCAPSULACION
    Esta propiedad denominada también ocultación de la información, se refiere a la arquitectura compleja del objeto, que integra en una unidad o cápsula, datos y programas relacionados entre sí; haciéndolo inaccesible e impide que otros objetos, usuarios, u otros programadores conozcan cómo está organizada la información disponible.

    Sin embargo, no es imposible conocer lo necesario respecto del objeto y su contenido, puesto que, para un programador autorizado, las peticiones de información al objeto podrán efectuarse recurriendo a mensajes dirigidos a él, con la orden de realizar la operación pertinente, de modo que la respuesta será la información buscada.

    El encapsulamiento hace que la OOP sea apta para la reutilizar programas; pues, su estructura de cápsula facilita enormemente que el objeto sea transportado a cualquier ubicación diferente que precise de él y si su diseño fue eficiente, sus métodos seguirán funcionando normalmente en su nuevo destino.

    Es la forma en que tanto los atributos, como los métodos se encuentran encerrados dentro de la estructura del objeto, con apariencia no visibles desde el exterior. Y así al estar ocultos, resultará que:

    -| Una clase contiene un numero de variables que son interdependientes y deben tener un estado consistente, luego, si un programador manipular esas variables directamente la clase puede entrar en un estado inconsistente y funcionar inapropiadamente.

    -| Cuando todas las variables de la clase estan ocultas y los métodos son la única posibilidad para cambiar los valores de las variables -ocultas- en objetos de la clase todo funciona bien.

    -| Si mediante un método tratamos de cambiar un valor para una variable y el valor no es correcto el método tiene la facultad para rechazarlo.

    -| Si las variables son directamente manipuladas, sin intervención de los métodos de la clase, el numero de posibilidades que tienes que comprobar se vuelve inmanejable.

    Tal estructura encapsula los tres siguientes componentes, cada uno de los cuales poseen sus propias funciones específicas:

  3. POLIMORFISMO
    Una analogía que permite conceptualizar el polimorfismo, es observar en la vida diaria cómo los alumnos responden al timbre de la escuela. Todos los alumnos conocen el significado del timbre. Cuando el timbre (mensaje) suena, sin embargo, tiene su propio significado para cada alumno (objeto). Algunos alumnos irán a casa, otros a la biblioteca, y otros irán a clases. Cada alumno responde al timbre, pero su respuesta puede ser diferente.

    En la POO, esta característica que permite diseñar métodos para que las clases derivadas, adquieran comportamientos distintos; así, una misma operación puede cambiar entre las distintas clases derivadas de una clase base, de modo que, dos objetos que sean instancias de distintas clases, generarán resultados diferentes a pesar de que la operación requerida por ambos tenga la misma denominación.

    El polimorfismo permite que un mismo mensaje global enviado a objetos de clases diferentes, estos, actúen de formas diferentes; así por ejemplo, un mensaje "+" a un objeto entero producirá una suma de dígitos, mientras que para un objeto cadena, generaría una concatenación.

    Este beneficio que surge al separar la implementanción del comportamiento permite a dos o más objetos responder al mismo mensaje. Un método llamado nombre también podría ser implementado en un objeto de la clase Curso.

    Aunque la implementación de este mensaje nombre devolvería el número de curso y su nombre, su protocolo es el mismo que el mensaje nombre del objeto Alumno. El polimorfismo permite a un objeto emisor comunicarse con diferentes objetos de una manera consistente sin tener que preocuparse sobre las diferentes implementaciones de un mensaje.

    Otro ejemplo del polimorfismo es la función de imprimir. Cada objeto que puede ser impreso debe conocer como imprimirse. El mensaje es el mismo a todos los diferentes objetos: print, pero la implementación sobre qué deben hacer para imprimirse a sí mismos varía.

    El objeto emisor no necesita conocer cómo el objeto receptor implementa el mensaje. Sólo el objeto receptor se preocupa de ello. Suponga que existe un método printPage en un objeto Documento que tiene la responsabilidad de imprimir una página. Para imprimir una página, el método printPage envía el mensaje print a cada objeto de página. El objeto Documento no necesita conocer qué tipos de objetos están en la página, sólo que cada uno soporta el comportamiento de la impresión.

    Nuevos objetos pueden ser agregados a la página sin afectar el método printPage. Este método sigue enviando el mensaje print y el nuevo objeto provee su propio método print en respuesta a ese mensaje.

    El polimorfismo permite al objeto emisor comunicarse con los objetos receptores sin tener que comprender qué tipo de objeto es, siempre y cuando el objeto receptor soporte los mensajes.

  4. HERENCIA
    Este concepto muy vinculado con el anterior, consiste en esa ventaja en que la clase derivada, hereda características de los atributos y métodos de su clase primigenia; potenciando así su capacidad de simplificar la correspondiente codificación.

    Por ejemplo, gracias a la herencia, tanto motocicletas como automóviles, poseerán automáticamente los mismos atributos y métodos de la clase automotor, razón por la cual al codificar la esta última clase, luego solo será necesario codificar las características particulares de las subclases motocicletas y automoviles.

    El grado de dividir una clase en subclases, más la característica de la herencia permite extender con simplicidad y seguridad la definición primigenia de una clase, hasta cualquier nivel de detalle requerido para un sistema en particular

    Cada objeto creado por un programador puede ser reaprovechado por otro, sin agregar modificaciones y si tal objeto no se ajuste a sus necesidades, podrá aprovechar la alternativa de generar una subclase del objeto con las características requerida, aprovechando las heredadas por el objeto original.

    La herencia permite a una clase tener el mismo comportamiento que otra y extender o limitar ese comportamiento para proveer una acción especial a una necesidad específica.

    Suponga la siguiente aplicación. La clase Graduado y la clase SinGraduar tienen comportamiento similar, como por ejemplo, el manejo de nombre, dirección, carrera, promedio, etc. En vez de colocar este comportamiento en ambas clases, el comportamiento es colocado en una nueva clase llamada Alumno. Ambas clases Graduado y SinGraduar se vuelven subclases de la clase Alumno, y ambas heredan el comportamiento de Alumno.

    Ambas clases Graduado y SinGraduar pueden agregar comportamiento adicional que sea único a ellas. Por ejemplo, Graduado puede ser tanto para un doctorado o una carrera de postgrado. Por otro lado, la clase SinGraduar puede querer conocer cómo un cierto alumno va en la carrera.

    Las clases que heredan de otras clases se llaman subclases. La clase, de la que una subclase hereda, es llamada superclase. En el ejemplo, Alumno es una superclase de Graduado y SinGraduar. Graduado y SinGraduar son subclases de Alumno.

  5. RELACIONES
    Que permiten que el objeto se inserte dinámicamente en el programa y están formadas esencialmente por punteros a otros objetos, que actúan como enlaces que permiten a cada objeto relacionarse con los demás componentes de la misma organización. Se agrupan en dos tipos fundamentales:

    • RELACIONES JERARQUICAS:
      Son relaciones bidireccionales, que hacen que un objeto que se encuentra situado inmediatamente encima, es padre de otro objeto de la organización de la que ambos forman parte; por esta relación si un objeto es padre de otro, este último es hijo del primero

      Según este vínculo relacional, la organización jerárquica simple será aquella donde un objeto tiene un solo padre, mientras que la organización jerárquica compleja puede existir un hijo con varios padres.

    • RELACIONES SEMANTICAS:
      Estas relaciones no tienen vinculación con la organización de los objetos que las establecen, porque sus propiedades y consecuencia solo dependen del significado los objetos en sí mismos y no de su posición en la organización.

      Supongamos para conceptuar esta relación, que redactaremos un diccionario informatizado para que su lector obtenga la definición de una palabra cualquiera. Si en tal diccionario, las palabras son objetos y que la organización jerárquica proviene de forma natural de la estructura de nuestros conocimientos sobre el mundo. Por ejemplo

                     
      				   /
      				   |  VIDA:   Ciencias biológicas:   Biología y 
      				   |                                 Medicina.  
      				   |                                           
      			 TEMAS   <  MUNDO:  Ciencias de la:        Matemáticas, 
      				   |          naturaleza             Física, 
      				   |          inerte                 Química y  
      				   |                                 Geología  
      				   | 
      				   |  HOMBRE. Ciencias humanas:      Geografía, 
      				   \                                Historia.
      		 

  6. PROPIEDADES: Son elementos que cualifican y cuantifican las características físicas del objeto, para diferenciarlo de los demás, por ello, cada objeto tiene cierto número de propiedades, cada una de las cuales tendrá a su vez, uno o varios valores, como ocurren con variables de la programación estructurada y que además pueden heredarlas a sus objetos descendientes.

    Las propiedades junto con los métodos y las relaciones, son datos encapsulados dentro del objeto, quién puede tener un único o un conjunto de valores estructurados en formatos matriciales, vectoriales, listas, etc, con valores del tipo numérico, alfabético, etc.

    En el POO, las propiedades se pueden heredar de unos objetos a otros, esta ventaja lo diferencia con las variables tradicionales y por ello, el objeto puede adquirir una propiedad de las siguientes maneras:

    - PROPIEDADES PROPIAS: Están formadas dentro de la cápsula del objeto.
    - PROPIEDADES HEREDADAS: Definidas en un objeto antepasado de éste, tal como padre, abuelo y que por lo tanto le otorgan el carácter de propiedades miembro, porque el objeto las posee simplemente por ser miembro de una clase.

  7. METODOS:
    Especifican la misión de cada objeto, codificadas en formato de programas de acciones que el objeto debe ejecutar y heredar a sus descendientes; tienen acceso a los datos y constituyen verdaderos códigos de programas procedimentales o procedurales, asociados a un objeto determinado y cuya acción se desencadenan mediante mensajes.

    El tradicional procedimiento, función, rutina, etc, del programa procedural, son sinónimos de método, aunque este posee propiedades específicas referidas tanto a la forma de invocar al objeto, mediante mensajes y a su campo de acción, limitado a un objeto y a sus descendientes.

    Los métodos pueden heredarse de unos objetos a otros y puden adquirirse de las siguientes formas:

    - MÉTODOS PROPIOS: Están incluidos dentro de la cápsula del objeto.

    - MÉTODOS HEREDADOS: Definidos en un objeto diferente, antepasado de éste, razón por la que estos métodos se llaman métodos miembro porque el objeto los adquiere por ser miembro de una clase.

    - DEMONIOS: Poco frecuente en POO, este tipo especial de métodos no heredable, se activa no con un mensaje, sino cuando sucede un evento especial, que se desencadena automáticamente al ocurrir un suceso determinado, tal como la asignación de un valor a una propiedad de un objeto, etc.

    En la programación orientada a objeto, los objetos interactúan entre ellos a través de los mensajes. Lo único que un objeto conoce de otro es su interface. Los datos y lógica de un objeto está oculta a los otros objetos.

    O sea, la interface encapsula los datos y código de un objeto. Esto permite al programador separar la implementación de un objeto, de su comportamiento. Tal separación crea una "caja negra" en donde el usuario está alejado de los cambios de la implementación.

    Mientras la interface permanezca igual, cualquier cambio interno a la implementación es transparente al usuario.

    Por ejemplo, si el mensaje nombre es enviado al objeto Alumno, al usuario no le importa cómo el programador implementó el código que maneja este mensaje. El programador puede cambiar la implementación en cualquier momento, pero el mensaje nombre aún debería trabajar ya que la interface es la misma.

    Tales especificaciones de la tarea que debe desarrollar el objeto, expresadas en formato de procedimientos o funciones que usan los atributos del objeto para efectuar altas, bajas, modificaciones, búsqueda, etc. A tal fin, cada mensaje posee un código asociado a él. Cuando un objeto recibe un mensaje, su código es ejecutado. En otras palabras, estos mensajes determinan el comportamiento de un objeto y el código determina cómo, el objeto, lleva a cabo cada mensaje. El código que está asociado a cada mensaje se llama método. El nombre del mensaje, también suele llamarse el nombre del método debido a su asociación con el método.

    Cuando un objeto recibe un mensaje, determina qué método es el solicitado y pasa el control al método. Un objeto tiene tantos métodos como acciones se desea que tenga.

    Observe el siguiente diagrama, nombre, nombre:, direccion y nombre:direccion: son nombres de métodos para el objeto Alumno. Cuando el objeto Alumno recibe el mensaje nombre, el mensaje nombre pasa el control al método nombre definido en Alumno.

    Los métodos que operan sobre objetos específicos son los métodos de instancias, y los mensajes que invocan métodos de instancia se llaman mensajes de instancia. Los métodos que operan sobre clases de objetos específicas son los métodos de clase.

  8. OBJETO
    Es el ente tangible o instancia de la clase, es la parte dinámica y operable que interactua con los métodos del programa para obtener la solución de un problema. Emulando la caja negra de una nave, el objeto está dotado interiormente de la funcionalidad necesaria para actuar frente a los mensajes de otros objetos, para luego devolver una acción, proporcionando así el servicio que justifica su propia existencia dentro del sistema.

    Con tal arquitectura, este paradigma promueve una adecuada reutilización o reaprovechamiento del código de cada parte del sistema, aceptando necesariamente los siguientes aspectos del objeto:

    Cada objeto necesita guardar la información sobre cómo realizar su comportamiento definido. Algunos objetos también contienen variables que soportan su comportamiento. Estas variables son llamadas variables de instancia. Sólo el método de instancia de un objeto puede referirse y modificar los valores guardados en las variables de instancia. Los métodos de instancia de los objetos no pueden referirse a los datos de otros objetos. Un objeto sólo puede acceder a los datos de otro objeto enviándole mensajes. A esto se lo llama encapsulación y asegura que el proceso para obtener los datos de un objeto sea seguro.

    Observe el siguiente diagrama, las variables de instancia variableUno hasta variableX sólo pueden ser accesadas por el emisor a través de los métodos de instancia métodoUno hasta métodoN. El emisor no puede referirse a las variables, directamente, por sí mismo.

    A diferencia de la programación procedural, donde las áreas de datos de uso común son utilizadas para compartir información, la programación orientada a objetos no aprueba el acceso directo a los datos de uso común (exceptuando el uso de las variables globales) por otros programas. Sólo el objeto que "posee" los datos puede cambiar su contenido. Otros objetos pueden ver o cambiar estos datos enviando mensajes al "dueño".

    Los nombres de variables de instancia pueden ser idénticos a los nombres de los métodos que están asociados a ellos. Por ejemplo, el objeto Alumno tiene los métodos nombre, dirección, y carrera así como también las variables de instancia nombre, dirección, y carrera. Smalltalk distingue entre los identificadores de variables y los identificadores de métodos a través de la posición que ocupan en la expresión.

    Un objeto puede ser considerado una "cosa" que puede realizar un conjunto de actividades que definen su comportamiento. Por ejemplo, un objeto "EstadoAlumno" puede informarle su promedio, año de escuela, etc.; o puede agregar una lista de las materias cursadas.
    Un objeto "Alumno" puede informarle su nombre o su dirección.

    La interfase del objeto consiste en un conjunto de comandos, cada comando desarrolla un acción específica. Un objeto puede pedirle a otro objeto que realice una acción, enviándole un mensaje. El objeto que envía el mensaje es designado emisor; y el objeto que recibe el mensaje es designado receptor. El control le es dado al objeto receptor hasta que complete la acción; luego el control regresa al objeto emisor.

    Por Ejemplo, un objeto Escuela le pide al objeto Alumno su nombre enviándole un mensaje preguntándole por su nombre. El objeto receptor Alumno devuelve su nombre al objeto emisor.

    Un mensaje también puede contener información que los objetos emisores necesitan pasar al objeto receptor, a esta información se la llama argumento de un mensaje. Un objeto receptor siempre devuelve un valor al objeto emisor. Este valor devuelto puede ser, o no, útil al objeto emisor.

    Por ejemplo, el objeto Escuela ahora desea cambiar el nombre del alumno. Esto lo hace enviando al objeto Alumno un mensaje para cambiar su nombre a uno nuevo. El nuevo nombre es pasado como un argumento en el mensaje. En este caso, al objeto Escuela no le interesa el valor que devuelva el mensaje.

  9. REUTILIZACION
    Una de las características más importantes de la programación orientada a objetos es la habilidad para modificar las soluciones existentes para resolver nuevos problemas. Si un tipo particular de problema ha sido resuelto utilizando la POO, un problema similar, aunque diferente, puede ser resuelto haciendo algunos cambios en el protocolo del objeto-mensaje ya existente. La mayoría del tiempo, esto requiere agregar nuevos mensajes. En otros casos puede requerir agregar nuevos objetos y nuevos mensajes a los que responden los nuevos objetos.

    La reutilización es, probablemente, la más importante característica de Smalltalk. Aunque los lenguajes procedurales también pueden ser reutilizados, Smalltalk hace la programación de la reutilización mucho más fácil.

  10. PARAMETROS DEL POO

    • ATRIBUTOS:
      Son las cuantificaciones de cada propiedad física del objeto, por ejemplo sus dimensiones, ubicación, apariencia, disponibilidad, etc.

    • METODOS:
      Son las especificaciones de la tarea que debe desarrollar el objeto, expresadas en formato de procedimientos o funciones que usan los atributos del objeto para efectuar altas, bajas, modificaciones, búsqueda, etc.

    • OBJETO:
      Es el ente tangible o instancia de la clase, es la parte dinámica y operable que interactua con los métodos del programa para obtener la solución de un problema. Emulando la caja negra de una nave, el objeto está dotado interiormente de la funcionalidad necesaria para actuar frente a los mensajes de otros objetos, para luego devolver una acción, proporcionando así el servicio que justifica su propia existencia dentro del sistema.

      Con tal arquitectura, este paradigma promueve una adecuada reutilización o reaprovechamiento del código de cada parte del sistema, aceptando necesariamente los siguientes aspectos del objeto:

      • CONDICIONES DEL OBJETO:

        - TODO LO EXISTENTE ES UN OBJETO: Globalmente podemos tomar cualquier ente y luego representarlo como objeto del programa.

        - EL PROGRAMA ES UN CONJUNTO DE OBJETOS: Los cuales indican que hacer entre ellos, mediante el envío adecuado de mensajes.

        - CADA OBJETO ESTÁ COMPUESTO POR OTROS OBJETOS: De manera que se puede simplificar la complejidad manipulando piezas simples componentes.

        - TODO OBJETO TIENE UN TIPO: Esto implica aceptar que todo objeto es una instancia de una clase en particular.

        - IGUAL TIPO DE OBJETOS PUEDEN CAPTAR EL MISMO MENSAJE: Todos los objetos de un mismo tipo particular pueden percibir el mismo mensaje.

      • ESTRUCTURA DEL OBJETO:
        A diferencia de una clase que es un tipo predefinido de estructura de datos intangible, el objeto es una instancia de una clase; así por ejemplo la clase es el plano de la casa, mientras que el objeto es la propia casa, construida en base de tal plano.

        Como ente tangible que tiene un estado, una identidad y un comportamiento predefinidos por su clase, el objeto se caracteriza por:
        - No ser un dato simple, porque contiene componentes estructurados.
        - No estar aislado, porque forma parte de una organización jerárquica.

      • ORGANIZACION DE LOS OBJETOS:
        Al igual que los objetos reales, también los objetos de este paradigma poseen una organización jerárquica, haciendo que ciertos objetos son superiores jerárquicamente a otros, agrupándolos como:

        - Objetos simples: Cuando su estructura pueda ser representada por medio de un árbol.
        - Objetos complejos: En caso contrario.

        En ambos casos existen tres niveles de objetos.

        1. LA RAÍZ DE LA JERARQUÍA:
          Se trata de un objeto único y especial, ubicado en el nivel más alto de la estructura y suele recibir un nombre genérico, que indica su categoría especial, como por ejemplo Raíz o Entidad u Objeto madre,.

        2. LOS OBJETOS INTERMEDIOS:
          Están ubicados después de la raíz y que a su vez tienen descendientes y constituyen conjuntos o clases de objetos, que pueden ser generales o especializados, según la aplicación.

          Los objetos intermedios reciben nombres genéricos que denotan al conjunto de objetos que representan, por ejemplo, contenedor, buscador, etc.

        3. LOS OBJETOS TERMINALES:
          Son objetos que descienden de una clase o subclase y no tienen descendientes y en casos particulares, pueden constituir instancias o ítems porque representan los elementos del conjunto representado por la clase o subclase a la que pertenecen.

      • MENSAJE: Denominado por algunos autores como EVENTO, es una comunicación del requerimiento de un objeto dirigida a otro objeto, para que este último concrete una acción.

      • ENCAPSULADO: Es la forma en que tanto los atributos, como los métodos se encuentran encerrados dentro de la estructura del objeto, con apariencia no visibles desde el exterior. Y así al estar ocultos, resultará que:

        - Una clase contiene un numero de variables que son interdependientes y deben tener un estado consistente, luego, si un programador manipular esas variables directamente la clase puede entrar en un estado inconsistente y funcionar inapropiadamente.

        - Cuando todas las variables de la clase estan ocultas y los métodos son la única posibilidad para cambiar los valores de las variables -ocultas- en objetos de la clase todo funciona bien. Si mediante un método tratamos de cambiar un valor para una variable y el valor no es correcto el método tiene la facultad para rechazarlo.

        - Si las variables son directamente manipuladas, sin intervención de los métodos de la clase, el numero de posibilidades que tienes que comprobar se vuelve inmanejable.

        Tal estructura encapsula las siguientes componentes, cada uno de los cuales poseen sus propias funciones específicas:

        1. PROPIEDADES:
          Son elementos que cualifican y cuantifican las características físicas del objeto, para diferenciarlo de los demás, por ello, cada objeto tiene cierto número de propiedades, cada una de las cuales tendrá a su vez, uno o varios valores, como ocurren con variables de la programación estructurada y que además pueden heredarlas a sus objetos descendientes.

          Las propiedades junto con los métodos y las relaciones, son datos encapsulados dentro del objeto, quién puede tener un único o un conjunto de valores estructurados en formatos matriciales, vectoriales, listas, etc, con valores del tipo numérico, alfabético, etc.

          En el POO, las propiedades se pueden heredar de unos objetos a otros, esta ventaja lo diferencia con las variables tradicionales y por ello, el objeto puede adquirir una propiedad de las siguientes maneras:

          - PROPIEDADES PROPIAS: Están formadas dentro de la cápsula del objeto.
          - PROPIEDADES HEREDADAS: Definidas en un objeto antepasado de éste, tal como padre, abuelo y que por lo tanto le otorgan el carácter de propiedades miembro, porque el objeto las posee simplemente por ser miembro de una clase.

        2. METODOS:
          Especifican la misión de cada objeto, codificadas en formato de programas de acciones que el objeto debe ejecutar y heredar a sus descendientes; tienen acceso a los datos y constituyen verdaderos códigos de programas procedimentales o procedurales, asociados a un objeto determinado y cuya acción se desencadenan mediante mensajes.

          El tradicional procedimiento, función, rutina, etc, del programa procedural, son sinónimos de método, aunque este posee propiedades específicas referidas tanto a la forma de invocar al objeto, mediante mensajes y a su campo de acción, limitado a un objeto y a sus descendientes.

          Los métodos pueden heredarse de unos objetos a otros y puden adquirirse de las siguientes formas:

          - MÉTODOS PROPIOS: Están incluidos dentro de la cápsula del objeto.

          - MÉTODOS HEREDADOS: Definidos en un objeto diferente, antepasado de éste, razón por la que estos métodos se llaman métodos miembro porque el objeto los adquiere por ser miembro de una clase.

          - DEMONIOS: Poco frecuente en POO, este tipo especial de métodos no heredable, se activa no con un mensaje, sino cuando sucede un evento especial, que se desencadena automáticamente al ocurrir un suceso determinado, tal como la asignación de un valor a una propiedad de un objeto, etc.

      • CLASE:
        Es la abstracción del objeto, algo así como los planos básicos de las características con los que se puede construir toda una familia de objetos, todos ellos con detalles comunes. Así, de la clase automotor, pueden construirse motocicletas, motos, coches, furgonetas, camiones, etc. Todos con elementos similares y con una característica común: sirven para transportar personas.

      • SUBCLASE:
        Es la extensibilidad que permite generar una clase, a partir de otra ya existente clase, por lo que ambas, a pesar de tener aspectos similares, tendrán partes propias a cada una que definirá su propia estructura particular.

        Tal concepto de la arquitectura de la clase derivada llamada subclase, implica una tremenda economía a la hora diseñar, mantener o rediseñar un sistema generado bajo esta filosofía de extensibilidad.

      • HERENCIA:
        Este concepto muy vinculado con el anterior, consiste en esa ventaja en que la clase derivada, hereda características de los atributos y métodos de su clase primigenia; potenciando así su capacidad de simplificar la correspondiente codificación.

        Por ejemplo, gracias a la herencia, tanto motocicletas como automóviles, poseerán automáticamente los mismos atributos y métodos de la clase automotor, razón por la cual al codificar la esta última clase, luego solo será necesario codificar las características particulares de las subclases motocicletas y automoviles.

        El grado de dividir una clase en subclases, más la característica de la herencia permite extender con simplicidad y seguridad la definición primigenia de una clase, hasta cualquier nivel de detalle requerido para un sistema en particular

        Cada objeto creado por un programador puede ser reaprovechado por otro, sin agregar modificaciones y si tal objeto no se ajuste a sus necesidades, podrá aprovechar la alternativa de generar una subclase del objeto con las características requerida, aprovechando las heredadas por el objeto original.

    • CARACTERÍSTICAS DEL LENGUAJE DE POO:
      • ABSTRACCIÓN:
        Es la propiedad que destaca las características esenciales del objeto, distinguiéndola de otros tipos de objetos y según la perspectiva del que efectúa la abstracción, muestra su límite, así, los principales elementos del Diseño Orientado a Objetos consiste en componer niveles y conjuntos adecuados de abstracciones.

        El planteo de una correcta abstracción genera la amigabilidad del sistema, así por ejemplo, cuando decimos “soporte expeditivo de información interactiva para evaluativos” estamos planteando un nivel de abstracción elevada del “machete de examen”.

      • ENCAPSULAMIENTO: 
        Esta propiedad denominada también ocultación de la información, se refiere a la arquitectura compleja del objeto, que integra en una unidad o cápsula, datos y programas relacionados entre sí; haciéndolo inaccesible e impide que otros objetos, usuarios, u otros programadores conozcan cómo está organizada la información disponible.

        Sin embargo, no es imposible conocer lo necesario respecto del objeto y su contenido, puesto que, para un programador autorizado, las peticiones de información al objeto podrán efectuarse recurriendo a mensajes dirigidos a él, con la orden de realizar la operación pertinente, de modo que la respuesta será la información buscada.

        El encapsulamiento hace que la OOP sea apta para la reutilizar programas; pues, su estructura de cápsula facilita enormemente que el objeto sea transportado a cualquier ubicación diferente que precise de él y si su diseño fue eficiente, sus métodos seguirán funcionando normalmente en su nuevo destino.

      • MODULARIDAD:
        La modularidad es la característica que hace factible la simplificación de la complejidad inherente al sistema, que habrá sido descompuesto en conjuntos de módulos operativos, cohesivos y casi independientes o débilmente acoplados, diseñados para ejecutar una tarea específica.

      • JERARQUÍA:
        La creación de una jerarquía permite clasificarlas u ordenarlas de alguna manera simplificando la comprensión del conjunto de abstracciones, las cuales no se pueden comprender en forma simultánea.

        En todo sistema complejo existen dos tipos de jerarquías:

        • Jerarquía de clases: Cuya semántica es "es un": Herencia que puede ser.

          - Herencia Simple: Define una relación entre clases, donde una clase comparte la estructura de comportamiento definida en otra clase antecesora.

          - Herencia Múltiple: Dicha estructura es compartida con varias clases definidas anteriormente.

          La herencia implica una jerarquía de generalización/especialización donde las clases antecesoras representan abstracciones generalizadas y las subclases especializan el comportamiento o estructura de sus superclases.

        • Jerarquía de partes:
          Cuya semántica es "parte de": Agregación que es aquella asociación donde clases de objetos llamadas partes, pertenecen a clases de objetos llamadas todo, pero que la existencia de cada parte es independiente de la existencia del todo, asi, si eliminamos el todo, no necesariamente desaparecen sus partes y tampoco la ausencia de una de sus partes no implica la ausencia del todo.

      • COMPOSICIÓN:
        La composición es la inclusión de tipos de objetos definidos por el usuario como partes de otros tipos de objetos, produciendo con esto, un efecto inverso a la herencia; de esto modo la composición es un tipo de agregación donde las clases de objetos llamadas partes pertenecen a una única clase de objetos llamada todo, de manera que si no está el todo, no están las partes.

      • POLIMORFISMO:
        Característica que permite diseñar métodos para que las clases derivadas, adquieran comportamientos distintos; así, una misma operación puede cambiar entre las distintas clases derivadas de una clase base, de modo que, dos objetos que sean instancias de distintas clases, generarán resultados diferentes a pesar de que la operación requerida por ambos tenga la misma denominación.

        El polimorfismo permite que un mismo mensaje global enviado a objetos de clases diferentes, estos, actúen de formas diferentes; así por ejemplo, un mensaje "+" a un objeto entero producirá una suma de dígitos, mientras que para un objeto cadena, generaría una concatenación.

      • TIPIFICACIÓN:
        Es una aplicación del concepto de clases, por el que objetos de distinto tipo solo pueden intercambiarse bajo grandes restricciones, porque cada tipo es una caracterización exacta de las propiedades estructurales de una serie de entidades, así por ejemplo no funcionaran regularmente los objetos impresora y mouse si los enchufamos en conectores de distinto tipo.

      • PERSISTENCIA:
        Este aspecto secundario del modelo de programación orientada a objetos se refiere a la característica por la cual un objeto conserva su estado a través del tiempo y en el espacio.

    • VENTAJAS DEL POO
      Por una parte, la necesidad de optimizar el desarrollo de nuevas áreas de software de aplicación, tales como el tratamiento de imágenes, sonido, bases de datos multimediales, automatización de oficinas; cada día se impone la necesidad de lograr la interacción intuitiva, amigable y segura entre el usuario y la máquina, tarea que se simplifica en sumo grado, trabajando dentro del entorno del POO

      Por otra parte, los costos de producción, mantenimiento, conservación y actualización de software existente son considerablemente onerosos, además de insumir tareas muy laboriosas, tediosas y complejas, especialmente si no se aplicó el desarrollo con las pautas del POO.

      • EMULA EL MUNDO REAL: El modo natural de pensar del ser humano es pensar en objetos, por ello este método le resulta más intuitivo que el estructurado, así se promueve llevar al límite la capacidad operacional de los lenguajes de programación modernos.

        Divide y Vencerás..!!, se cumple plenamente en la POO, pues la naturaleza de separar el todo en pequeñas partes, para luego construir con piezas simples, otras más complejas, incentiva a la creación de aplicaciones reutilizables.

      • REHUSABILIDAD: Resolver tales problemas promovió la necesidad de trabajar con objetos portables, dotados de la capacidad de la herencia, que permite la reusabilidad del código orientado a objetos, de manera de simplificar la modificación de código existente, logrando así, aplicaciones más modificables, fácilmente extendibles y con componentes reusables.

        La reusabilidad del código minimiza el tiempo destinado al desarrollo del software, haciéndolo mas intuitivo porque el programador piensa naturalmente en términos de objetos físicos, más que en términos de algoritmos de software.

        Esta mayor reutilización de los componentes de software implica la posibilidad de un producto de software , módulo, clase u otro para ser reutilizado total o parcialmente en una nueva aplicación

        Asi, puede disminuirse la laboriosidad al programar una aplicación y lograr mayor fiabilidad, por simplificar las múltiples pruebas operativas del sistema antes de su entrega a sus usuarios.

      • PROGRAMAAR EN LENGUAJE ORIENTADO A OBJETOS:
        La programación orientada a objetos usa un lenguaje orientado a objetos puede ser tanto imperativo como declarativo, cuyas ventajas en el desarrollo de software son:

        • MANEJO SIMPLE: De la complejidad inherente al software usando los tres mecanismos básicos para operar la complejidad:

          1. DESCOMPOSICION:
            Orientada a objetos, mediante la cual el dominio de aplicación de un sistema se descompone en base a los tipos o clases de objetos que están presentes o relacionados con dicho dominio.

          2. ABSTRACCION:
            Mecanismo cognoscitivo que permite manejar la complejidad para representar la totalidad de propiedades de un objeto complejo, ignorando aquellas propiedades del objeto que son poco relevantes o muy detalladas.

          3. JERARQUIZACION:
            De clases y objetos, a través de las cuales se establecen las relaciones de generalizacion entre clases (jerarquías es_un) y de composición entre objetos (jerarquías parte_de).

            En las jerarquías se habla de subtipo o especialización de un supertipo o generalización.

          Usar mejores mecanismos para manejar la complejidad contribuye a que el grupo de desarrollo logre una mejor compresión de los dominio de aplicación, así como de los requerimientos de usuarios, lo cual implica reducción de tiempo y costos.

          Simplificar el manejo de la complejidad, implica para los:

          - Usuarios, desarrollo más simple y mantenimiento más económico y ágil de los sistemas.

          - Analistas y diseñadores, proceso menos laborioso, mas claro e intuitivo de diseño.

          - Programadores, la claridad del modelo y el poder de las herramientas orientadas a objetos, que transforman en placentero y productivo la tediosa tarea de programar.

        • UN SOLO PARADIGMA PARA TODO: Uso del paradigma único de desarrollo, porque en los otros métodos de desarrollo de sistemas se emplean, los cuatro paradigmas diferentes para el análisis, diseño y programación de un sistema:

          - En el desarrollo de los programas de aplicación se utiliza el enfoque estructurado:

          Análisis Estructurado + Diseño Estructurado + Programación Estructurada

          - En el diseño conceptual de la base de datos se emplea el Modelo Entidad-Interrelación

          - En la implementación y uso de la base de datos se acude al Modelo Relacional.

          - En el diseño de la interfaz usuario-sistema se rige por metáforas basadas en objetos.

          El uso de un unico paradigma disminuye los costos de adiestramiento del personal que desarrolla sistemas, pues este personal no requiere ser formado en una diversidad de métodos, técnicas y herramientas basadas en paradigmas diferentes.

        • COSTOS MENORES: Reducción de los costos y tiempos de desarrollo. Esta ventaja es una consecuencia de las tres anteriores. La reutilización de componentes reduce los costos y tiempo de desarrollo, pues aprovecha la existencia de diseños y programas OO ya probados.

        • HERRAMIENTAS FLEXIBLES:Permite a los desarrolladores de sistemas diseñar con herramientas más flexibles, logrando así una óptima adaptación al cambio, actualización y a la evolución.

          El incremento de nuevas componentes durante el ciclo de vida del sistema, la orientación a objetos permite afrontar sistemas de gran complejidad sin colapsar como lo haría un sistema diseñado con el método estructurado.

      • NO TODO LO QUE BRILLA ES ORO..!!
        A pesar de las bondades enumeradas precedentemente, el programador debe evaluar los siguientes aspectos que hace el sistema orientado a objetos requiere invertir recursos para imponer una nueva cultura distinta a programadores procedurales, destacándose los siguientes temas:

        -| CURVAS DE APRENDIZAJE LARGAS: El sistema orientado a objetos enfoca de una sola manera al mundo, involucrando la conceptualización de todos los elementos de un programa, desde subsistemas a los datos, en la forma de objetos.

        La comunicación entre objetos se realiza por mensajes, forma en que no están escritos los programas orientados a objetos actualmente; de manera que inevitablemente al hacer la transición a un sistema orientado a objetos los programadores requieren capacitarse nuevamente.

        -| DEPENDENCIA DEL LENGUAJE: En la práctica existen muchas dependencias del programador y el proveedor, tanto que a pesar de la portabilidad conceptual de los objetos en un sistema orientado a objetos, actualmente en el mercado del soft, se ofrecen muchos lenguajes orientados a objetos están compitiendo para dominar el mercado.

        Migrar el lenguaje de implementación de un sistema orientado a objetos no es tarea sencilla; por ejemplo cambiar de C++ que soporta el concepto de herencia múltiple, a SmallTalk que no lo soporta; implica una decisión de elección cuya factibilidad debe ser evaluada.

        -| DETERMINACIÓN DE LAS CLASES: Como cada clase es un molde para crear nuevos objetos, será importante crear el conjunto de clases adecuado para un proyecto; pero en la práctica dado que la definición de las clases más que una ciencia es más un arte; si bien existen jerarquías predefinidas de clases, generalmente se deben crear clases específicas para la aplicación específica.

        -| PERFOMANCE: El tráfico de mensajes entre los objetos afecta la perfomance de todo el sistema; y aunque tal desventaja se va desvaneciendo con el avance tecnológico, velocidad de microprocesador, potencia, y capacidad de la memoria; pero aún en la situación actual aquella aplicación orientada a objetos de bajo perfomance, no será rentable.

    VER PARA CREER..!!

    -| EJEMPLO 1: Código para definir una clase y dentro de esta aprecia la manera de incrustar objetos, cuyos métodos son activados por eventos.

    
    	DEFINE CLASS ContainerLeeFecha AS ContainerWilo
    	  HEIGHT = 100
    	  ADD OBJECT RotDia AS Label   WITH TOP=10, LEFT=80,Autosize=.T.,HEIGHT=10, FontBold = .T.,Caption='DIA       MES        AÑO'
    	  ADD OBJECT BoxDia AS SpiDia 
    	  ADD OBJECT BoxMes AS ComboMes 
    	  ADD OBJECT BoxAno AS SpiAno 
    	  ADD OBJECT DeterminarHoroscopo AS CommandButton WITH TOP=10, LEFT=250, CAPTION='Suerte', HEIGHT=55, WIDTH=50, Picture='Ver.ico',ToolTipText='Aceptar estos datos',BackStyle=0
    	  ADD OBJECT Cancelar AS Image WITH TOP=60, LEFT=80, Picture='Borrar.ico',ToolTipText='Limpiar los datos',BackStyle=0
    	  
    	  PROCEDURE Init
    		ThisForm.LeeFecha.DeterminarHoroscopo.Visible = .F.
    	  ENDPROC  
    	
    	  PROCEDURE BoxDia.LostFocus
    		ThisForm.Caption='Selecciona el mes que naciste, luego ENTER' 
    		FormuWilo.LeeFecha.BoxMes.Visible = .T.
    	  ENDPROC  
    	  PROCEDURE BoxMes.LostFocus
    		ThisForm.Caption='Ahora el año que naciste, luego ENTER' 
    		FormuWilo.LeeFecha.BoxAno.Visible = .T.
    	  ENDPROC  
    	  PROCEDURE BoxAno.LostFocus
    		ThisForm.Caption='Click ..!! sobre el ojo para ver tu horóscopo' 
    		FormuWilo.LeeFecha.DeterminarHoroscopo.Visible = .T.
    		FormuWilo.LeeFecha.DeterminarHoroscopo.SetFocus
    	  ENDPROC  
    	
    	  PROCEDURE DeterminarHoroscopo.Click
    		FormuWilo.LeeFecha.VISIBLE=.F.
    		DO MostrarSuerte 
    	  ENDPROC
    	  PROCEDURE Cancelar.Click
    		FormuWilo.LeeFecha.DeterminarHoroscopo.VISIBLE=.F.
    		FormuWilo.LeeFecha.BoxDia.Value=1
    		FormuWilo.LeeFecha.BoxMes.Value='Ene'
    		FormuWilo.LeeFecha.BoxAno.Value=1970
    		FormuWilo.LeeFecha.BoxDia.SetFocus
    	  ENDPROC
    	ENDDEFINE
    

    -| EJEMPLO 2: Tanto las condiciones del POO, como la estructura del objeto y su encapsulamiento:

    
    	DEFINE CLASS ContainerWilo AS Container
    	  TOP    = 10
    	  LEFT   = 50
    	  WIDTH  = 390
    	  HEIGHT = 240
    	  Picture= 'Fondo7.gif'
    	  VISIBLE=.F.
    	  BorderStyle = 2
    	  BackColor  = 32768 
    	 ADD OBJECT Salir AS Image With Top=50,Left=10,Picture = 'Llave.jpg', ToolTipText='Cerrar esto',BackStyle=0
    	  PROCEDURE Salir.MouseMove
    		PARAMETER a, b, c, d, e
    		DO ActivarPantallaPrincipal
    	  ENDPROC
    	ENDDEFINE
    	 PROCEDURE Volar.MouseMove
    	  PARAMETER a, b, c, d, e
    	   IF (Messagebox('Cerrarás este sistema..??',4+32+256,'DESEAS VOLAR DE ESTE PROGRAMA')=6)
    		  Clear Events
    	   ENDIF
    	 ENDPROC
    	
    	
    	 PROCEDURE BoxesDeDatos.Limpiar.Click
    	  IF ThisForm.Caption = 'PARA BORRAR ESTA FICHA,  Pulsa -> Borrar'
    		 ThisForm.Caption = 'Ficha marcada para borrar:'+Nombre
    		  DELETE  
    		  IF (Messagebox(Amor+'  Salud: '+Salud,4+32+256,'DESEAS ELIMINAR LA FICHA DE')=6)
    			PACK 
    			Wait Window 'Se eliminó la ficha de '+Amor
    		  ENDIF
    		  DO ActivarPantallaPrincipal
    		ELSE
    		  ThisForm.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba' 
    		  DO LimpiarBoxes
    	   ENDIF   
    	 ENDPROC
    	 PROCEDURE BoxesDeDatos.BoxAmor.LostFocus
    	  PARAMETER a, b, c, d, e
    	  IF NOT(ThisForm.BoxesDeDatos.BoxAmor.Value='        ')
    		 ThisForm.BoxesDeDatos.Grabar.Visible = .T.
    	  ENDIF   
    	 ENDPROC
    	 PROCEDURE LogoUTN.MouseMove
    	  PARAMETER a, b, c, d, e
    		 This.TOP =  130
    		 This.LEFT = 10 
    		 This.Picture = 'Wilin.bmp'
    	 ENDPROC
    	 PROCEDURE LogoUTN.Click
    	  DO ActivarPantallaPrincipal 
    	  ThisForm.Caption = 'WWW.WILUCHA.COM.AR' 
    	  ThisForm.VerSuerte.Visible=.F.
    	  ThisForm.Modificar.Visible=.F.
    	  This.Visible=.F.
    	  ThisForm.VerAutor.Visible=.T.
    	 ENDPROC
    

    -| EJEMPLO 3: Ah.., así que no creias en los demonios..!!!, pero por ahora puedes ver en vivo a los métodos propios y a los heredados de la clase ContainerWilo a las clases ContainerVerDatos y las siguientes..

    
    	DEFINE CLASS ContainerWilo AS Container
    	  TOP    = 10
    	  LEFT   = 50
    	  WIDTH  = 390
    	  HEIGHT = 240
    	  Picture= 'Fondo7.gif'
    	  VISIBLE=.F.
    	  BorderStyle = 2
    	  BackColor  = 32768 
    	 ADD OBJECT Salir AS Image With Top=50,Left=10,Picture = 'Llave.jpg', ToolTipText='Cerrar esto',BackStyle=0
    	  PROCEDURE Salir.MouseMove
    		PARAMETER a, b, c, d, e
    		DO ActivarPantallaPrincipal
    	  ENDPROC
    	ENDDEFINE
    	DEFINE CLASS ContainerVerDatos AS ContainerWilo
    	  WIDTH  = 130
    	  HEIGHT = 120
    	 ADD OBJECT TeclaVerTabla  AS CommandButton With Top=10, Left=50, Width=70,Height=30,Caption = 'Ver Grilla',FontBold=.T.,ToolTipText='Muestra toda la tabla de datos'     
    	 ADD OBJECT BuscarPorCombo AS CommandButton With Top=40, Left=50, Width=70,Height=30,Caption = 'Buscar'    ,FontBold=.T.,ToolTipText='Permite Buscar por ComboBox'     
    	 ADD OBJECT BuscarPorBox   AS CommandButton With Top=70, Left=50, Width=70,Height=30,Caption = 'Una Ficha' ,FontBold=.T.,ToolTipText='Busca ficha por Teclado'
    	ENDDEFINE
    	
    	DEFINE CLASS ContainerBuscar AS ContainerWilo
    	 ADD OBJECT BoxDato     AS TextBox   With Top=10, Left=50, Width=190,Height=25,Visible = .F.,FontBold=.T.      
    	 ADD OBJECT ComboDeWilo AS ComboBox With Top=10, Left=50, Width=190,RowSourceType = 3,Visible=.T.,Value=1,;
    		RowSource="SELECT Amor FROM Suerte ORDER BY Suerte.Amor INTO CURSOR Dato",ToolTipText='Selecciona un dato'  
    	 ADD OBJECT Aceptar     AS CommandButton With Top=10, Left=260, Width=70,Height=30,Caption = 'Aceptar',ToolTipText='Aceptar el dato'
    	ENDDEFINE
    	
    	DEFINE CLASS ContainerGrilla AS ContainerWilo
    	 ADD OBJECT MiGrilla AS Grid  With Top=10,  Left=50, Width=330,Height=220, Visible = .T.,ReadOnly=.T.,FontBold=.T.      
    	ENDDEFINE
    	
    	DEFINE CLASS ContainerAutor AS ContainerWilo
    	 ADD OBJECT Foto AS Image With Top=10, Left=50, Picture = 'Pavaroti.jpg',ToolTipText='Londres Marzo 1998', Visible=.T.
    	ENDDEFINE
    	
    	PROCEDURE Volar.MouseMove
    	  PARAMETER a, b, c, d, e
    	   IF (Messagebox('Cerrarás este sistema..??',4+32+256,'DESEAS VOLAR DE ESTE PROGRAMA')=6)
    		  Clear Events
    	   ENDIF
    	ENDPROC
    

    Volver al principio


    Paradigma: Hay ciertos defectos que bién manejados..
    brillan más que la misma virtud..!!
    Rochefocauld

    Declarativo
    Demostrativo
    Funcional
    Heuristico
    Imperativo
    Logico
    Orientado Objeto
    Procedimental

    ESTRUCTURA de las REVOLUCIONES CIENTIFICAS

    Para Thomas Kuhn (1926 ...) la historia representa el color del cristal con el que debe mirarse toda la filosofía de la ciencia. Pero lo que Kuhn ha visto a través de este cristal ha resultado tener dos características inesperadas, que le han dado a sus ideas la gran prominencia que tuvieron cuando se publicaron y que han conservado a lo largo de más de 25 años; me refiero al relativismo y a la irracionalidad. El significado de estos dos términos revela la relación de las ideas de Kuhn con el método científico.

    La historia de la ciencia muestra, de acuerdo con Kuhn, que a lo largo de su evolución las distintas disciplinas han pasado por uno o más ciclos bifásicos, que él mismo llama "ciencia normal" y "revolución" (ocasionalmente se identifica una tercera fase inicial, llamada "preciencia", que desaparece a partir del segundo ciclo).

    En forma paralela a este concepto cíclico de la evolución de las ciencias, Kuhn introdujo también la famosa idea del "paradigma", que representó la teoría general o conjunto de ideas aprobadas y sostenidas por una generación o un grupo coherente de científicos contemporáneos.

    Kuhn usó el término "paradigma" con otras acepciones distintas lo que contribuyó a hacerlo un poco confuso. En publicaciones posteriores, Kuhn sustituyó el término "paradigma" por otros dos, "matriz disciplinaria" y "ejemplar", con objeto de ganar precisión, pero como para nuestros fines tal precisión no es necesaria, seguiré usando el término paradigma.

    De acuerdo con el esquema de Kuhn, los ciclos a que están sometidas las ciencias a través de la historia se inician por una etapa más o menos prolongada de "preciencia" o periodo "pre-paradigmático", durante el cual se colectan observaciones casi al azar, sin plan definido y sin referencia a un esquema general

    En ese periodo puede haber varias escuelas de pensamiento compitiendo pero sin que alguna de ellas prevalezca sobre las demás. Sin embargo, poco a poco un sistema teórico adquiere aceptación general, con lo que surge el primer paradigma de la disciplina.

    Los ejemplos de Kuhn para ilustrar el sentido de paradigma son la astronomía ptolemaica, la "nueva" química de Lavoisier, la óptica corpuscular de Newton, o la dinámica aristotélica.

    De acuerdo con Kuhn, un paradigma está formado por la amalgama de una teoría y un método, que juntos constituyen casi una forma especial de ver al mundo, sin embargo, el estado ontológico del paradigma kuhniano no es claro, se trata de una entidad curiosa, algo camaleónica y hasta acomodaticia, de la que a veces se oye hablar como si fuera algo real y con existencia independiente.

    "The Structure of Scientific Revolutions"
    "Una vez establecido el paradigma, la etapa de "preciencia" es sustituida por un periodo de "ciencia normal", caracterizado porque la investigación se desarrolla de acuerdo con los dictados del paradigma prevalente, o sea que se siguen los modelos que ya han demostrado tener éxito dentro de las teorías aceptadas...". Los siguientes aspectos son la sintesis de la propuesta de Kuhn:

    • Durante el periodo de "ciencia normal" los investigadores no se dedican a avanzar el conocimiento sino a resolver problemas o "acertijos" dentro de la estructura del paradigma correspondiente.

      Lo que se pone a prueba no es la teoría o hipótesis general, como quiere Popper, sino la habilidad del hombre de ciencia para desempeñar su oficio, en vista de que si sus resultados no son compatibles con el paradigma dominante, lo que está mal no es la teoría sino los resultados del trabajo del investigador.

      Durante el periodo de "ciencia normal" los resultados incompatibles con el paradigma prevalente se acumulan progresivamente en forma de anomalías, en lugar de usarse como argumentos para forzar el cambio de la teoría por otra u otras que las expliquen.

    • Sólo cuando se alcanza un nivel intolerable de anomalías es que el paradigma se abandona y se adopta uno nuevo que satisfaga no sólo los hechos explicados por el paradigma anterior sino también todas las anomalías acumuladas.

      A la ciencia que se realiza durante el periodo en que ocurre este cambio, de un paradigma por otro, Kuhn la llama "ciencia revolucionaria". Pero es precisamente en su análisis de este cambio donde Kuhn introdujo una de sus ideas más revolucionarias

    • Propuso que el rechazo de un paradigma rebasado por las anomalías acumuladas y la adopción de un nuevo paradigma históricamente no ha sido un proceso racional, entre otras razones porque los distintos paradigmas son inconmensurables, lo que no significa que sean incompatibles, sino simplemente que no son comparables entre sí.

      Kuhn comparó al cambio de paradigmas que caracteriza al periodo de "ciencia revolucionaria" con un "cambio de Gestalt", y hasta con una conversión religiosa.

    • La inconmensurabilidad del paradigma antiguo con el nuevo determina que sus respectivos partidarios hablen distintos idiomas, o sea que los mismos términos tengan diferentes significados, lo que dificulta o imposibilita la comunicación entre ellos.

      Frecuentemente, otra diferencia significativa entre los científicos que patrocinan los dos paradigmas en conflicto, el saliente y el entrante, es la edad promedio de cada grupo: muchos de los partidarios del paradigma que se abandona son individuos mayores, mientras que la mayoría de los devotos del nuevo paradigma son jóvenes.

      Esta diferencia generacional no sólo se suma al bloqueo en la comunicación, sino que también contribuye a la irracionalidad del cambio, que culmina cuando fallecen los últimos miembros del grupo de científicos partidarios del paradigma saliente, con lo que se legaliza la hegemonía del paradigma entrante y se inicia un nuevo periodo de "ciencia normal".

      Estas ideas de Kuhn se oponen de manera más o menos frontal al esquema hipotético-deductivo de la ciencia de Popper al mismo tiempo que postulan otro, que podría llamarse histórico-cíclico (Popper lo llama, con toda justicia, relativismo histórico).

    • Obviamente, Kuhn no está hablando de la lógica del descubrimiento científico sino más bien de la psico-sociología de la ciencia. Pero Kuhn y Popper coinciden en pasar por alto los mecanismos de generación de las hipótesis aunque el primero las atribuye a la intuición estimulada por la acumulación progresiva de anomalías y el segundo nada más a la intuición (pero basada en un componente genético, que se menciona en el último capítulo).

      En cambio, mientras Popper postula que el cambio de una teoría científica por otra proviene de la falsificación de la primera y el mayor poder explicativo de la segunda, o sea que se trata de un proceso lógico y racional, Kuhn insiste en que la historia muestra que el rechazo de una teoría científica y su sustitución por otra ha obedecido mucho más a fuerzas irracionales e ilógicas, más relacionadas con factores sociológicos que con principios racionales.

    • El concepto del crecimiento de la ciencia según Kuhn es muy distinto del postulado clásicamente, como puede sospecharse al contemplar el resultado de sus ciclos de ciencia normal acumulación de anomalías, revolución con cambio de paradigmas, ciencia normal, etc.,

      En vista de que la inconmensurabilidad de los paradigmas entrante y saliente impiden que se aproveche toda la información acumulada durante el periodo de ciencia normal anterior a la revolución, que termina por cambiar un paradigma por otro. Kuhn tiene plena conciencia de esto, por lo que el último capítulo de La estructura se titula "El progreso por medio de revoluciones" y en él se pregunta:

      • ¿Por qué es que la empresa detallada antes [la ciencia] avanza continuamente, como no lo hacen, digamos, el arte, la teoría política, o la filosofía?

      • ¿Por qué es el progreso una propiedad reservada casi exclusivamente para las actividades que llamamos ciencia?

      Las respuestas más comunes a estas preguntas han sido refutadas en este ensayo, de modo que conviene concluirlo preguntándonos si podemos encontrar otras que las sustituyen.

    • Quien haya leído a Kuhn sabe que un solo repaso de sus textos es generalmente insuficiente para capturar todas sus ideas y comprender todos sus alcances además de lecturas repetidas.

      Kuhn exige meditación seria sobre lo que dice, con la consecuencia que el lector que medita no siempre llega a la misma conclusión que el autor sobre un mismo párrafo.

      Por lo menos, eso es lo que todavía me pasa a mí con Kuhn (¡y con muchos otros autores!) pero acepto que seguramente se trata de un problema personal. Kuhn propone que en los periodos de ciencia normal, el progreso científico:

    • No es diferente en calidad del progreso en otros campos, pero la ausencia habitual de grupos competitivos que cuestionen mutuamente sus respectivos fines y estándares facilita la percepción del progreso de una comunidad científica normal.

    • Después de examinar el papel de la educación científica en las culturas occidentales, destacando que en las humanidades la consulta de los textos originales es mucho más frecuente que en las ciencias, Kuhn se pregunta:

      ¿Por qué es el progreso una concomitante universal de las revoluciones científicas?

      Una vez más tenemos mucho que ganar si preguntamos qué otra cosa podría provenir de una revolución. Las revoluciones terminan con la victoria total de uno de los dos campos opuestos,

    • ¿podrá tal grupo decir alguna vez que su triunfo no representa un progreso?

      Si lo hubiera sería como aceptar que ellos estaban equivocados y que sus oponentes tenían la razón.

      Por lo menos, para ellos el resultado de la revolución debe ser el progreso, y se encuentran en una posición excelente para asegurarse de que los miembros futuros de su comunidad acepten la historia anterior a ellos de la misma manera.

    • Kuhn examina el papel fundamental que desempeña la comunidad científica como árbitro de lo que es la ciencia y de su calidad, que es lo que caracteriza a las civilizaciones derivadas de la Grecia helénica;

      Kuhn identifica a la Europa de los últimos cuatro siglos como el origen de la mayor parte del conocimiento científico que poseemos actualmente, gracias a su tolerancia y apoyo a grupos de sujetos interesados en resolver problemas específicos del comportamiento de la naturaleza.

      Ofreciéndoles a tales sujetos, soluciones aceptables a la mayor parte de los miembros de los distintos grupos y sin interés primario en reclutar opiniones favorables de las autoridades oficiales de su tiempo (rey, papa, dictador, sultán, primer ministro, sátrapa o presidente), o del pueblo en general.

      La pequeña cofradía de científicos establece sus propias reglas del juego, al margen de intereses ideológicos o políticos, y se da el imperial y legítimo hijo de regirse exclusivamente por ellos.

      Este episodio solamente ha ocurrido una vez en toda la historia universal, y ni siquiera como una corriente ininterrumpida de desarrollo sino más bien como una serie de episodios más o menos breves, a veces infelices y otras veces afortunados, con largos intervalos sujetos a la hegemonía de la sinrazón.

    • En La estructura, Kuhn incluye un párrafo en donde señala con claridad el mecanismo de crecimiento de la ciencia en los periodos de "ciencia revolucionaria"; hablando del cambio de un paradigma por otro, Kuhn dice que el nuevo paradigma:

    • No será aceptado por los científicos a menos que se convenzan de que se cumplen dos importantes condiciones:

      En primer lugar, el nuevo paradigma debe parecer resolver algún problema importante y generalmente reconocido, que no se ha podido resolver de ninguna otra manera

      En segundo lugar, el nuevo paradigma debe garantizar la conservación de una parte relativamente grande de la capacidad para resolver problemas concretos que la ciencia ha alcanzado a través de sus predecesores.

      La novedad por sí misma no es un desideratum de las ciencias, pero sí lo es en muchos otros campos creativos.

      De esto resulta que, aunque los nuevos paradigmas rara vez o nunca poseen todas las capacidades de sus predecesores, generalmente conservan una gran parte de los aspectos más concretos de los triunfos previos y además siempre permiten soluciones adicionales a otros problemas concretos.

    • Finalmente según Kuhn, podemos concluir que a pesar de la inconmensurabilidad de los paradigmas en competencia, y de que el cambio de uno por otro durante las revoluciones científicas se parece más a una conversión religiosa que a una acción racional, el nuevo paradigma está obligado a garantizar la preservación de mucho de lo aprendido en los periodos previos de ciencia normal, lo que permite el crecimiento de la ciencia.

    BONUS:
    En este ámbito paradigmático ademas te ofrezco:

    1. LENGUAJES DE PROGRAMACIÓN:

      A S P
      Basic
      Builder
      C
      Delphi
      Fox
      Haskell
      HTML
      Java
      PHP
      Small
      UML

    2. PARADIGMAS IMPRESOS:

      Apuntes de clasesLenguaje Apuntes de clasesGramática Apuntes de clasesAutómata Apuntes de clasesLaplace Apuntes de clasesSeries Apuntes de clasesEcuación Apuntes de clasesOperador

    PARADIGMA
    Las computadoras no son fiables
    .. pero los hombres menos aún..!!
    wilocarpio

    PARADIGMA DE LA ETERNIDAD ES ..

    • Esperar el resultado de la prueba de embarazo.
    • Conservar la sonrisa hasta que tomen la foto.
    • Escuchar el sonido de una llave en la cerradura a las 2 de la madrugada
    • Esperar la luz verde cuando hay un espacio para estacionarse del otro lado de la calle.
    • Tratar de encontrar un error insignificante en el estado de nuestra cuenta bancaria.
    • Escuchar a un niño de seis años cuando trata de explicar la trama de una película emocionante.
    • Buscar una salida de la autopista cuando conducimos en dirección equivocada.
    • Educar a un cachorro.

    Facu Abrir Sofy Carpio Amor Yo..!! Sano Pity..!! Asado Cayo..!! Alegria Wilin..!! Extasis

    Te espero en: wilocarpio@gmail.com

    Esta page está en: www.wilocarpio.com.ar

    11/11/2014

    Volver al principio