Está en la página 1de 9

PARADIGMA DE PROGRAMACIÓN:

Un paradigma de programación representa un enfoque particular o filosofía para diseñar


soluciones. Los paradigmas difieren unos de otros, en los conceptos y la forma de abstraer los
elementos involucrados en un problema, así también como en los pasos que integran su
solución.

PARADIGMA DECLARATIVO:
Fuertemente basado en el uso de relaciones, el paradigma declarativo hace uso de funciones o
bien de la lógica de predicados para establecer dichas relaciones. Se centra en la descripción
del problema para elaborar un enunciado preciso y así descubrir un algoritmo o solución
general.
Desventaja: Tiende a ser usado con propósitos especiales.
Ventaja: La solución de un problema se realiza con niveles de abstracción altos.

Iván Grosse – UTN FRT


PARADIGMA LOGICO:

La programación lógica gira en torno al concepto de predicado, o relación entre elementos. En


los lenguajes lógicos se utiliza el formalismo de la lógica de primer orden para representar el
conocimiento sobre un problema y para hacer preguntas que, si se demuestra que se pueden
deducir a partir del conocimiento dado en forma de axiomas y de las reglas de deducción
estipuladas, se vuelven teoremas. Así se encuentran soluciones a problemas formulados como
preguntas. Con base en la información expresada dentro de la lógica de primer orden, se
formulan las preguntas sobre el dominio del problema y el intérprete del lenguaje lógico trata
de encontrar la respuesta automáticamente. El conocimiento sobre el problema se expresa en
forma de predicados (axiomas) que establecen relaciones sobre los símbolos que representan
los datos del dominio del problema.

Este concepto de programación lógica está ligado históricamente a un lenguaje llamado


Prolog, que proviene de PROgrammation en LOGique (programación en lógica), que fue el
primer lenguaje de programación lógico y el más conocido y utilizado.

PROLOG
TERMINOS SIMPLES:

Variables: representa a un individuo genérico, se escriben con la primera letra en mayúsculas o


con el _ por delante. Ejemplo: Pepe

Constantes: representa a un objeto o individuo determinado, se escriben en minúsculas y


pueden ser constantes numéricas (2, - o sim óli as pepe, omida, . Ejemplo: pepe

TERMINOS ESTRUCTURADOS:

Listas: secuencia ordenada de términos (que pueden ser otras listas). Si la lista no está vacía
[] puede considerarse que posee una cabeza (primer elemento) y una cola (el resto).
Ejemplo: [a1, a2, a3].

Predicado: representa la propiedad de un objeto, y puede evaluarse como verdadero o falso.


Ejemplo: blanco(X). Si el predicado tiene más de un argumento, entonces se forma una
relación padre(X, Y). X es padre de Y.

Un hecho es un predicado que no tiene ninguna variable entre sus argumentos.

Una consulta se escribe como un predicado durante la ejecución del programa, donde si solo
posee constantes devolverá Yes o No , y si posee una variable devolverla los valores para
donde esa variable sea verdadera.

Regla: se utiliza para representar conocimiento. Resultan útiles para definir nuevos predicados
en base a otros, por ejemplo: padre(X, Y) :- hijo(Y, X) . Donde :- significa si , resultando en Y
es hijo de X si X es padre de Y . En general las reglas tienen cabeza y cuerpo. Otro ejemplo más
complejo: abuelo(X, Y):- padre(X, Z), (padre(Z, Y) ; madre(Z, Y)).

Cláusulas de Horn: los hechos, reglas y consultas son clausulas. Los hechos son clausulas sin
cabeza, las consultas clausulas sin cuerpo. Los hechos y reglas forman la base de
conocimientos. Durante la ejecución el usuario realiza consultas a esta base de conocimientos.

Iván Grosse – UTN FRT


Estas cláusulas son del tipo Si es verdad el antecedente, es verdad el consecuente , y en este
caso escribimos primero el consecuente y después el antecedente.

Backtracking: es el proceso que se inicia cuando se llega a un resultado falso en una cláusula
de Horn, se comienza a deshacer todo lo ejecutado, dejando todo como estaba antes de la
ejecución.

Findall
Esta operación que nos provee Prolog posee tres argumentos, y se escribe de la siguiente
manera: findall(Respuesta, Objetivo, ListaRespuestas).

Funciona almacenando por cada iteración sobre el Objetivo (base de conocimiento) en


Respuesta el valor coincidente con nuestra condición de búsqueda, que se grabará en
ListaRespuestas. Ejemplo:

habitacion(001, ocupada).

habitacion(002, desocupada).

habitacionesOcupadas(ListaHabitaciones) :- findall(Numero, habitación(Numero, ocupada),


ListaHabitaciones).

PARADIGMA FUNCIONAL:

Este paradigma se caracteriza por utilizar funciones para resolver problemas, devolver un
resultado, en base a los datos que le proporcionamos. Se dispone de un conjunto de valores,
funciones y operadores predefinidos, denominado Prelude.

HASKELL
Lenguaje funcional puro, no estricto y fuertemente tipificado.

Puro: hace que el razonamiento matemático sea aplicable a los programas.

No estricto: hace referencia a que el orden aplicado para reducir expresiones no es el


aplicativo, sino generalmente la evaluación perezosa. Es decir, a menos que le indiquemos lo
contrario, Haskell no ejecutará funciones ni calculará resultados hasta que se vea realmente
forzado a hacerlo.

Fuertemente tipificado: indica que los elementos utilizados en el lenguaje (valores, funciones,
operadores) están clasificados en distintas categorías o tipos. Cuando compilamos un
programa, el compilador sabe que trozos del código son enteros, cuales son cadenas de texto,
etc. Gracias a esto un montón de posibles errores son capturados en tiempo de compilación.
Haskell usa un fantástico sistema de tipos que posee inferencia de tipos. Esto significa que no
tenemos que etiquetar cada trozo de código explícitamente con un tipo porque el sistema de
tipos lo puede deducir de forma inteligente.

Si una función es llamada dos veces con los mismos parámetros, obtendremos siempre el
mismo resultado. A esto lo llamamos transparencia referencial y no solo permite al
compilador razonar acerca del comportamiento de un programa, sino que también nos
permite deducir fácilmente (e incluso demostrar) que una función es correcta y así poder
construir funciones más complejas uniendo funciones simples.

Iván Grosse – UTN FRT


Funciones
Una función en Haskell debe estar declarada (indicar el tipo de los parámetros que recibe y del
resultado) y definida (se trata de dar el método para calcular el valor resultante). Para declarar
la función después del nombre se coloca el operador :: que significa tiene el tipo y luego
los tipos. La definición de la función consiste en colocar el nombre de la función y los nombres
de los parámetros que se le introducen separados por espacios en blanco.

¿Variable de tipo? Ejemplo: head :: [a] -> a


Esto significa que a puede ser cualquier tipo. Es parecido a los tipos genéricos de otros
lenguajes, solo que en Haskell son mucho más potentes ya que nos permite definir fácilmente
funciones muy generales siempre que no hagamos ningún uso específico del tipo en cuestión.
Las funciones que tienen variables de tipos son llamadas funciones polimórficas.

¿Polimorfismo en Haskell? Funciones que tienen sentido para más de un tipo. Ejemplos head
(devuelve la cabeza de una lista) o fst (primer elemento de una tupla) fts :: (a, b) -> a

Cuando declaremos una función con variables de tipo se puede especificar a qué grupo de
tipos pertenecerá esta, por ejemplo:
cuadrado :: Num a => a -> a

cuadrado x = x*x

Cualquier cosa antes del símbolo => es una restricción de clase. Podemos leer la declaración de
tipo anterior como: la función cuadrado toma un parámetro del tipo Num y devuelve otro
del mismo tipo.

Estructuras de datos
Una tupla es un dato compuesto donde el tipo de cada componente puede ser distinto, se
escribe (Hola, 2). Por otro lado una lista es un conjunto de 0 o más elementos del mismo tipo,
de la forma [a1, a2, .., aN]. La lista vacía se representa como []. Las listas poseen cabeza y cola
(x:xs).

Las listas por comprensión son listas formadas a partir de un comportamiento o condición, por
ejemplo:

[ x | x <- [50..100], x `mod` 7 == 3]

Esto es todos los números del 50 al 100 cuyo resto al dividir por 7 fuera 3.

Encaje/Ajuste de patrones
Un ajuste de patrones consiste en una especificación de pautas que deben ser seguidas por los
datos, los cuales pueden ser desarmados permitiéndonos acceder a sus componentes.

Ejemplo: lucky :: (Integral a) => a -> String

lucky 7 = "¡El siete de la suerte!"

lucky x = "Lo siento, ¡no es tu día de suerte!"

Cuando llamamos a lucky, los patrones son verificados de arriba a abajo y cuando un patrón
concuerda con el valor asociado, se utiliza el cuerpo de la función asociado. En este caso, la
única forma de que un número concuerde con el primer patrón es que dicho número sea 7. Si
no lo es, se evaluara el siguiente patrón, el cual coincide con cualquier valor y lo liga a x.
También se podría haber implementado utilizando una sentencia if. Pero, ¿qué pasaría si

Iván Grosse – UTN FRT


quisiéramos una función que nombrara los número del 1 al 5, o "No entre uno 1 y 5" para
cualquier otro número? Si no tuviéramos el ajuste de patrones deberíamos crear un
enrevesado árbol if then else.

Guardas
Las guardas se indican con barras verticales que siguen al nombre de la función y sus
parámetros. Normalmente tienen una sangría y están alineadas. Una guarda es básicamente
una expresión booleana. Si se evalúa a True, entonces el cuerpo de la función correspondiente
es utilizado. Si se evalúa a False, se comprueba la siguiente guarda y así sucesivamente.
Muchas veces la última guarda es otherwise, está definido simplemente
como otherwise = True y acepta todo. Si todas las guardas de una función se evalúan a False,
entonces otherwise entra en acción.

Where
Nos sirve para declarar una variable auxiliar que se calcula utilizando los datos proporcionados.
Por ejemplo:
bmiTell :: (RealFloat a) => a -> a -> String
bmiTell weight height
| bmi <= 18.5 = "Tienes infrapeso ¿Eres emo?"
| bmi <= 25.0 = "Supuestamente eres normal."
| bmi <= 30.0 = "¡Estás gordo! Pierde algo de peso gordito."
| otherwise = "¡Enhorabuena, eres una ballena!"
where bmi = weight / height ^ 2

Funciones de orden Superior


Funciones de Haskell pueden tomar funciones como parámetros y devolver funciones como
resultado.

Hay tres maneras principales para definir una función:


1- Con condicionales:
a. fact1 :: Integer -> Integer
b. fact1 n = if n == 0 then 1
i. else n * fact1 (n-1)
2- Mediante guardas:
a. Fact2 :: Integer -> Integer
b. Fact2 n
i. | n == 0 =1
ii. | otherwise n * fact2 (n-1)
3- Mediante patrones:
a. Fact3 :: Integer -> Integer
b. Fact3 0 = 1
c. Fact3 n = n * fact3 (n-1)

Función map
La función map toma una función y una lista y aplica esa función a cada elemento de esa lista,
produciendo una nueva. Vamos a ver su definición de tipo y como se define.

map :: (a -> b) -> [a] -> [b]

map _ [] = []

Iván Grosse – UTN FRT


map f (x:xs) = f x : map f xs

Ejemplo: map (+3) [1,5,3,1,6] devuelve [4,8,6,4,9]

Función filter
Es una función que toma un predicado (un predicado es una función que dice si algo es cierto o
falso, o en nuestro caso, una función que devuelve un valor booleano) y una lista y devuelve
una lista con los elementos que satisfacen el predicado. Ejemplos:
ghci> filter (>3) [1,5,3,2,1,6,4,3,2,1]
[5,6,4]
ghci> filter even [1..10]
[2,4,6,8,10]

Lambdas
Las lambdas son funciones anónimas que suelen ser usadas cuando necesitamos una función
una sola vez. Normalmente creamos funciones lambda con el único propósito de pasarlas a
funciones de orden superior. Para crear una lambda escribimos un \ (Porque tiene un cierto
parecido con la letra griega lambda si le echas mucha imaginación) y luego los parámetros
separados por espacios. Luego escribimos una -> y luego el cuerpo de la función. Ejemplo:
map (\(a,b) -> a + b) [(1,2),(3,5),(6,3),(2,6),(2,5)]
[3,8,9,8,7]

PARADIGMA IMPERATIVO:
En contraposición a la programación declarativa, es un paradigma de programación que
describe la programación en términos del estado del programa y sentencias que cambian
dicho estado.

PARADIGMA ORIENTADO A OBJETOS:


Es un paradigma de programación que usa objetos en sus interacciones, para diseñar
aplicaciones y programas informáticos.

Sus cuatro pilares son la herencia, el polimorfismo, la abstracción y el encapsulamiento.

Herencia
Es un mecanismo que permite derivar de una superclase métodos y propiedades comunes a
sus clases hijas. Logrando así una mayor reutilización y extensibilidad. La herencia permite
crear clases que nunca serán instanciadas directamente, por ejemplo: una clase "perro"
heredaría los atributos y métodos de la clase "mamífero", así como también "gato", "delfín" o
cualquier otra subclase; pero, en ejecución, no habrá ningún objeto "mamífero" que no
pertenezca a alguna de las subclases. A estas clases se las conoce como abstractas.

Polimorfismo
El polimorfismo es una relajación del sistema de tipos, en un lenguaje fuertemente tipado
como es Java o C. Gracias a este mecanismo el lenguaje aceptará objetos de la clase hija o
derivada, y no solo de la clase padre declarada. Ejemplo: creamos una clase Vehículo , la cual
tiene tres clases derivadas o hijas, que son Auto , Moto y Colectivo . Si creamos un array
de tipo Vehículo:

Iván Grosse – UTN FRT


Vehículo [] vehículos = new Vehículo [3];

Este aceptara no solo objetos de tipo vehículo, sino también de las clases hijas auto, moto y
colectivo. El polimorfismo también se aplica a parámetros de funciones, siguiendo el ejemplo
de recién si creamos una función: void ejemplo(Vehículo a1);

Esta función aceptara que le pasemos como parámetros, además de vehículos, autos, motos
y colectivos.

Abstracción
Abstracción es un término del mundo real que podemos aplicar tal cual lo entendemos en el
mundo de la Programación Orientada a Objetos. Algo abstracto es algo que está en el universo
de las ideas, los pensamientos, pero que no se puede concretar en algo material, que se pueda
tocar.

Por ejemplo ¿en el mundo real hay un "animal" como tal? No, ni tan siquiera hay un
"mamífero". Lo que tenemos son especímenes de "perro" o "vaca", "hormiga", "cocodrilo",
"gorrión" pero no un "animal" de forma general. Es cierto que un perro es un animal, pero el
concepto final, el ejemplar, es de perro y no animal. Por tanto "animal", en términos del
lenguaje común, podemos decir que es un concepto genérico, pero no una concreción. En
términos de POO decimos que es un concepto abstracto, que implementaremos por medio de
una clase abstracta. No instanciaremos animales como tal en el mundo, sino que
instanciaremos especímenes de un tipo de animal concreto.

Abstracción y Herencia
En POO no solo tenemos clases abstractas, sino también, métodos abstractos. Siguiendo el
ejemplo de los animales, podríamos pensar en un mecanismo que todos los animales realizan,
aunque sea de distinta manera, por ejemplo nacer . Creamos así: public abstract function
nacer();

Esto quiere decir que todos los animales del mundo heredarán un método abstracto llamado
nacer. En las clases concretas que hereden de animal y donde ya sepamos cómo nace tal
animal, por ejemplo, la gallina, podemos implementar ese método, para que deje de ser
abstracto.

Abstracción y Polimorfismo
Esta relación es difícil de explicar de manera precisa, pero con un ejemplo se logra entender
fácilmente. Por ejemplo, tengo la clase "PoligonoRegular", sé que los polígonos regulares voy a
querer conocer su área, pero para saber su área necesito conocer el número de lados que
tiene. Entonces la clase "PoligonoRegular" tendrá un método abstracto "calcularArea()".
Luego, al definir la clase "cuadrado", o el "pentágono", etc., podremos implementar tal
método, con lo que dejará de ser abstracto. Gracias a que fueron definidos los métodos
abstractos "calcularArea()"en la clase padre, tengo clara una cosa: cuando trabajo con
elementos de la clase "poligonoRegular", sé que a todos los polígonos regulares que pueda
recibir les puedo pedir que me devuelvan su área. Eso me permite, en un esquema de
polimorfismo, que pueda estar seguro que todos los objetos que reciba puedan responder a
acciones determinadas, pues en las clases hijas habrán sido definidas necesariamente, aunque
los métodos se calculen de forma distinta.

Iván Grosse – UTN FRT


Encapsulamiento
Se denomina Encapsulamiento al ocultamiento de los datos miembros de un objeto de manera
que sólo se puedan cambiar o ver mediante las operaciones definidas para ese objeto.

Cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a
un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados de un
objeto contra su modificación por quien no tenga derecho a acceder a ellos, eliminando
efectos secundarios e interacciones.

Componentes POO
Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La
instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de


comportamiento o funcionalidad (métodos) los mismos que consecuentemente reaccionan a
eventos. Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos
del sistema (del programa). Es una instancia a una clase.

Método: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se


desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento,
es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del
objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de


objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus
características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún
método.

¿Clase estática? (static)


La definición formal de los elementos estáticos (o miembros de clase) nos dice que son
aquellos que pertenecen a la clase, en lugar de pertenecer a un objeto en particular. Son
elementos que existen dentro de la propia clase y para acceder los cuales no necesitamos
haber creado ningún objeto de esa clase. Osea, en vez de acceder a través de un objeto,
accedemos a través del nombre de la clase.

MODELO VISTA CONTROLADOR


El modelo–vista–controlador (MVC) es un patrón de arquitectura de software que separa
los datos y la lógica de negocio de una aplicación de la interfaz de usuario y el módulo
encargado de gestionar los eventos y las comunicaciones. Para ello MVC propone la
construcción de tres componentes distintos que son el modelo, la vista y el controlador, es
decir, por un lado define componentes para la representación de la información, y por otro
lado para la interacción del usuario.

Este patrón de arquitectura de software se basa en las ideas de reutilización de código y


la separación de conceptos, características que buscan facilitar la tarea de desarrollo de
aplicaciones y su posterior mantenimiento.

Iván Grosse – UTN FRT


Persistencia
En el caso particular de Java vamos a analizar los aspectos principales de su conexión a una
base de datos a través de MySQL.

JDBC
Java Database Connectivity, más conocida por sus siglas JDBC, es una API que permite la
ejecución de operaciones sobre bases de datos desde el lenguaje de programación Java,
independientemente del sistema operativo donde se ejecute o de la base de datos a la cual se
accede, utilizando el dialecto SQL del modelo de base de datos que se utilice.

Driver
En nuestro proyecto de aplicación Java, sobre la plataforma del IDE Netbeans, tenemos que
añadir las bibliotecas, drivers o interfaces adecuadas para el servicio Jdbc que utilizaremos,
MYSQL JDBC Driver es la biblioteca adecuada para MySql.

Clase GestionConexion
Esta clase es clave para que el programa se conecte con la base de datos. Cuenta con los
siguientes atributos:

Connection de tipo Connection, statement de tipo Statement y driver, protocolo, servidor,


database, user, password de tipo String.

Y dos métodos principales: conectar() y cerrar().

Comandos manipular tablas SQL


SELECT se utiliza cuando quieres leer (o seleccionar) tus datos.

INSERT se utiliza cuando quieres añadir (o insertar) nuevos datos.

UPDATE se utiliza cuando quieres cambiar (o actualizar) datos existentes.

DELETE se utiliza cuando quieres eliminar (o borrar) datos existentes.

REPLACE se utiliza cuando quieres añadir o cambiar (o reemplazar) datos nuevos o ya


existentes.

Iván Grosse – UTN FRT

También podría gustarte