Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Los lenguajes de programación son basados en uno o más paradigmas. Ejemplo: java es
lenguaje en el paradigma POO, mientras que Python soporta múltiples paradigmas.
Paradigma Declarativo: no se basa en el cómo se hace algo, sino que declara cómo es algo. Se
enfoca en describir las propiedades de la solución buscada, dejando indeterminado el
algoritmo usado para encontrar esa solución.
Paradigma Lógico: se basa en la definición de reglas lógicas para luego, a través de un motor
de interfaces lógicas, responder preguntas planteadas al sistema y así resolver los problemas.
Tipo Abstracto de Datos (TAD): es un tipo de dato definido por el programador. Se compone
de estructuras de datos y los procedimientos o funciones que manipulan esas estructuras de
datos. TAD = datos + funciones
Los algoritmos utilizados para implementar cada una de las operaciones de los TAD, están
encapsulados dentro de los propios TAD. La característica de ocultamiento de la información
del TAD significa que los objetos tienen interfaces públicas. Sin embargo, las representaciones
e implementaciones de esas interfaces son privadas.
Ventajas:
Objeto: un conjunto de datos relacionados que identifican el estado actual del objeto. Un
conjunto de comportamientos.
Clase: es una descripción de un conjunto de objetos. Consiste en una lista de variables y una
de métodos. Las variables de instancia es una clase especifican el tipo de dato que un objeto
puede almacenar y los métodos de instancia especifican el comportamiento que un objeto
puede exhibir. Los métodos y variables de clase están asociados con una clase completo. Por
ejemplo, la clase Math contiene el método round() que no está asociado con una instancia en
particular de Math.
Clases e instancias:
Herencia:
Filmina 3
Clase abstracta: es una clase que declara la existencia de métodos, pero no la implementación
de dichos métodos. Puede contener métodos no abstractos, pero al menos uno de los
métodos debe ser abstracto.
• No tiene cuerpo.
• Su firma termina con punto y coma.
• Solo puede existir dentro de una clase abstracta.
• Los métodos abstractos forzosamente habrán de estar sobrescritos en las subclases.
¿Una clase se puede declarar como abstracta y no contener métodos abstractos? Sí, una
clase puede ser declarada como abstracta y no contener métodos abstractos. En algunos casos
la clase abstracta simplemente sirve para efectuar operaciones comunes a subclases sin
necesidad de métodos abstractos. En otros casos, sí se usarán los métodos abstractos para
referenciar operaciones en la clase abstracta al contenido de la sobre escritura en las
subclases.
Polimorfismo: es una relajación del sistema de tipos, de tal manera que una referencia a una
clase, acepta direcciones de objetos de dicha clase y de sus clases derivadas. La ventaja en
utilizar clases abstractas, es que podemos trabajar con variables o parámetros de tipo Figura y
llamar a los métodos comunes sin saber a priori el tipo concreto de Figura. Esto permite en el
futuro, agregar nuevas Figuras, sin cambiar las clases ya desarrolladas. A este concepto se le
llama polimorfismo.
Tipos de métodos:
Filmina 4
Interfaz:
Clases abstractas:
Filmina 5
Tipos de excepciones:
• Try-Catch: se utiliza un bloque try para “intentar” una o más llamadas peligrosas a
métodos. Si hay algún problema, la JVM salta a un bloque catch y se ejecutan las
declaraciones encerradas por el bloque catch. Los bloques try-catch deben ser
contiguos.
• Throw: se usa para lanzar explícitamente una excepción desde un método o bloque de
código. Puede ser comprobada o no comprobada. En primer lugar, se debe obtener un
descriptor de un objeto Throwable, bien mediante un parámetro en una
cláusula catch o, se puede crear utilizando el operador new.
• Finally: algunas veces es conveniente contar con un código de limpieza que se ejecute
sin importar si se ha lanzado o no una excepción. Si una excepción se maneja con
Throw, se requiere contar con un código de limpieza y debe utilizar el bloque finally.
Este está asociado con un bloque try particular y como tal debe colocarse
inmediatamente después de un bloque try.
La memoria de la JVM se divide en zonas para cada hilo de ejecución y una zona común para
todos los hilos. A su vez la zona común para todos los hilos puede separarse en diversas
secciones entre las cuales se encuentra el Heap (la memoria encargada de almacenar la
información de los objetos que se están utilizando en las aplicaciones Java).
Heap: es un espacio de memoria dinámico. Cuando éste se queda sin espacio, existen dos
posibilidades, o bien aumentar el tamaño del mismo, o bien liberar espacio y es en esta última
solución donde aparecen los recolectores de basura (GC).
Garbage Collector (GC): es una aplicación que se ejecuta dentro de la JVM y se encarga de
gestionar el Heap, liberando automáticamente la memoria ocupada por aquellos objetos que
no van a ser utilizados en un programa.
Ventajas:
Desventajas:
• Concurrentes vs Stop-The-World:
o Concurrentes: realizan su trabajo a la vez que se ejecuta una
aplicación.
o S-T-W: para la ejecución de la aplicación para realizar sus tareas de
limpieza.
• Paralelo vs Serie:
o Paralelo: aprovechan la existencia de múltiples CPUs para realizar su
trabajo.
o Serie: se ejecutan en un único hilo.
• Incremental vs Monolítico:
o Incrementales: dividen su trabajo en diferentes fases u operaciones,
siendo estas fases separadas en el tiempo.
o Monolíticos: realizan su trabajo en una única tarea.
• Precisos vs Conservadores:
o Precisos: identifican y procesan todas las referencias de los objetos en
el momento de la recolección.
o Conservadores: desconocen algunas de las referencias de los objetos
en el momento de la recolección, o no están seguro de si un campo es
una referencia o no.
• Compactadores vs No Compactadores:
o Compactadores: tras realizar las tareas de limpieza mueven los
objetos, actualizando sus referencias, minimizando de esta manera la
fragmentación de la memoria. Esta operación implica ser S-T-W.
o No compactadores: se limitan a eliminar la basura de la memoria.
• La mayoría de los objetos dejan de ser útiles al poco tiempo de ser instanciados.
• Hay pocas probabilidades de que los objetos viejos referencien a los jóvenes.
¿Cómo funciona el Java Garbage Collector exactamente?: Java divide la memoria en dos
bloques fundamentales, Young Generation y Old Generation.
1. Tenured Generation: donde los objetos que tienen un ciclo de vida largo se
almacenan.
2. Permanent Generation: donde están cargadas las clases Java que la JVM necesita.
Cuando tenemos objetos que han sobrevivido a varios GC, pasan del Survivor Generation
Space al Tenured Generation Space.
Tipos de Garbage Collectors:
• Recolector Serie: trabaja sobre una única CPU tantos para los objetos viejos como
jóvenes. Este recolector se recomienda para sistemas embebidos.
• Recolector Paralelo: recolecta los objetos de generación joven en paralelo, mientras
que los viejos los recolecta en serie. Es útil cuando se tienen múltiples CPUs.
• Recolector paralelo con compactación: tanto jóvenes como viejos se recolectan en
paralelo y además se compactan.
• Recolector CMS (Concurrent Mark Sweep): utiliza un algoritmo Mark/Sweep para
recolectar objetos. Consiste en: la revisión del heap identifica los objetos referencias
como vivos y los no referenciados como muertos. Se vuelve a revisar los marcados
como muertos y se liberan los espacios de memoria ocupados por estos.
• Recolector G1: no divide el heap en posiciones correlativas de Eden, supervivientes y
objetos antiguos, sino que mantiene celdas de igual tamaño que van adquiriendo
roles, sin un tamaño concreto para cada espacio.
Miembros de clase estáticos: es una variable que no se asocia a un objeto (instancia) de una
clase, sino que se asocia a la clase misma, es decir, no hay una copia del dato para cada objeto
sino una sola copia que es compartida por todos los objetos de la clase. Se los llama variables
de clase. Se define con la palabra reservada static. Pueden ser accedidos desde cualquier lugar,
escribiendo el nombre de la clase, separada por un punto y colocando el nombre del miembro
o método. Podríamos considerarlas como variables súper globales.
Miembros finales: cuando se declara con la palabra clave final, su valor no se puede modificar,
es decir, se convierte en constante. Debe inicializarse y solo se puede inicializar una vez. Las
tres formas de inicializar un miembro final:
Clase final: no se puede extender. Existen dos usos para el uso de esta clase:
Métodos finales: no puede ser anulado. La clase Object hace esto: varios de sus métodos son
finales.
Paquetes (Package): en Java son la forma en la que nos permite agrupar de alguna manera
lógica los componentes de nuestra aplicación que estén relacionados entre sí.
Filmina 6
Colecciones: representa un grupo de objetos. Estos objetos son conocidos como elementos.
Cuando se trabaja con un conjunto de elementos, es necesario un almacen para poder
guardarlos. Así es que nace la interfaz Collection, donde podemos almacenar cualquier tipo de
objeto y usar una serie de métodos comunes, como agregar, eliminar, obtener el tamaño de la
colección, etc.
• Interfaces: son las clases abstractas que representan las colecciones. Permiten a las
colecciones ser manipuladas de manera independiente. Forman una jerarquía.
• Implementaciones: son las implementaciones concretas de la colección de interfaces.
• Algoritmos: son los métodos que realizan los cálculos de utilidad, tales como,
búsqueda y clasificación sobre los objetos que implementan interfaces de colección.
Java Collection Framework (JCF): se trata de un conjunto de interfaces y clases para mejorar la
capacidad del lenguaje respecto a la estructura de datos. Provee los siguientes beneficios:
Todas las interfaces son genéricas. Su sintaxis: Public interface Collection<E> donde <E> nos
dice que es una interfaz genérica. Se puede especificar el tipo de objeto que será contenido
por la colección. Por ejemplo: Public Collection curso<Alumnos> donde la colección curso
contendrá objetos de tipo Alumno.
Interfaz Collection
Interfaz Map
Set:
Contiene los métodos: size, isEmpty, add, remove, iterator. Suponiendo que s1 y s2 son set:
List: es una colección ordenada, también llamada secuencia. Pueden contener elementos
duplicados. Generalmente el usuario de una lista desea tener un control preciso sobre el lugar
en donde la lista ingresa cada elemento, pudiendo acceder a estos por su índice. Ademas de
las operaciones heredadas desde Collection, implemente las siguientes operaciones:
ArrayList:
• Es un array dinámica.
• No tiene restricciones de capacidad. Su tamaño se ajusta de forma dinámica. Posee un
constructor por defecto, new ArrayList() con capacidad inicial 0.
• Los elementos son Objetos.
• Métodos que contiene:
o int size(): devuelve el tamaño actual del array.
o void add(obj): agrega el elemento almacenado en la posición N.
o void set(index, obj): sustituye el elemento en la posición index por el objeto
obj.
o Object remove(index): elimina el elemento a la posición index. Devuelve el
objeto eliminado.
o int indexOf(obj): busca el objeto dentro del ArrayList, y si lo encuentra,
devuelve la posición donde lo ha encontrado. Caso contrario devuelve -1.
• Map: es un objeto que mapea claves con valores. No puede contener claves
duplicadas, cada clave puede mapear a un solo valor.
• SortedMap: es un Map que contiene sus claves ordenadas en orden ascendente. Es
usado para colecciones de clave/valor tales como, diccionarios o agendas de teléfono.
• HashMap,Queue.
Filmina 7
El lenguaje Java fue diseñado por la compañía Sun Microsystems Inc, con el propósito de crear
un lenguaje que pudiera funcionar en sistema de computadoras heterogéneas, y que fuera
independiente de la plataforma en la que se vaya a ejecutar.
Ventajas:
Desventajas:
• Mayor consumo de memoria: consume más memoria por dos razones, es necesario
cargar la máquina virtual y en general necesita más memoria para alojar los elementos
de un programa.
• Mayor tiempo de carga: la carga de la JVM lleva tiempo y como la carga de las clases
con bajo demanda la ejecución al principio de un programa es relativamente lenta.
• Integración no perfecta con el sistema operativo: como está diseñado para ser
multiplataforma, la integración con el sistema operativo no es sencilla y suele
necesitar extensiones nativas que rompen la portabilidad.
• Es un lenguaje de programación: como todo lenguaje de programación, aprenderlo no
es tarea fácil.
La plataforma Java se diferencia de la mayoría porque está formada únicamente por software
que se ejecuta en cualquier otra plataforma independiente del hardware. Tiene dos
componentes:
• El intérprete, JVM.
• La interfaz de Programación de Aplicaciones Java o Java API: es una amplia colección
de componentes de software que facilitan muchas necesidades de programación, por
ejemplo, código necesario para construir una interfaz de usuario (GUI). El API se
agrupo en librería o packages de componentes relacionados entre sí.
Kit de desarrollo Java (JDK) también llamado Software Development Kit (SDK): es necesario
para poder escribir un programa en Java. Este contiene el software necesario para que los
programadores compilen, depuren y ejecuten programas y applets escritos en Java.
Java Runtime Environment (JRE): su objetivo es aportar el entorno necesario para ejecutar
una aplicación Java. Forman parte del JRE la JVM, encargada de ejecutar el bytecode Java, así
como las bibliotecas que ofrecen los servicios definidos en la plataforma.
1. Java SE: conocida como Standard Edition, es la más difundida. Incorpora los elementos
necesarios para crear aplicaciones de escritorio.
2. JavaFX: era una alternativa para Java SE para el desarrollo de proyectos de tipo RIA
(Rich Internet Applications), con un núcleo más ligero, fácil de distribuir y un
mecanismo simplificado para el diseño de interfaces de usuario.
3. Java EE: es la Enterprise Edition, dirigida al desarrollo de soluciones de software que se
ejecutaran en un servidor de aplicaciones.
4. Java ME: la edición Micro Edition está enfocada a la creación de programas que se
ejecutaran en sistemas con recursos limitados, tales como teléfonos móviles,
electrodomésticos o microchips (Rasperry Pi).
Para ejecutar aplicaciones desarrolladas en Java sobre un SO es necesario que exista para el
mismo una implementación concreta de la plataforma. También existen otras alternativas a la
hora de implementar una plataforma:
• OpenJDK: es respaldada por Oracle cuyo objetivo es mantener una versión de código
abierto de la plataforma Java. Ofrece Java SE para múltiples distribuciones de
GNU/Linux.
• Si queremos utilizar OpenJDK en otros sistemas, como Windows o OS X, podemos
recurrir a Zulu.
• IBM también ofrece su propia implementación de la plataforma Java, conocida como
IBM J9 para GNU/Linux así como para varios SO para mainframes y derivados de UNIX.
• Si nuestro objetivo es desarrollar para dispositivos embebidos, encontraremos
versiones específicas de la plataforma Java para tal fin. Un ejemplo son las versiones
Embedded de Java SE y Java ME. También otras como OpenJDK.
• Android es un SO algo especial en cuanto a la ejecución de aplicaciones Java, ya que
incorpora un entorno de ejecución propio, llamado ART (Android RunTime), en lugar
de la correspondiente implementación del JRE. Las aplicaciones se desarrollan usando
el JDK de Java SE, pero el código se compila posteriormente para ART.
Filmina 8
Tag: esta apunta a un cierto momento en el tiempo en una rama especifica. Se utiliza para
volver de forma precisa a un instante determinado.
Add: antes de realizar cambios en el repositorio, agregamos todos los archivos necesarios
mediante el comando add, que además llevara asociado un usuario para saber quién lo hizo.
Commit: para realizar los cambios en el repositorio, usaremos el comando commit, que
también lleva un usuario asociado.
Revisión: es un identificador que representa una versión especifica del código, siendo HEAD la
última versión.
Integración con IDEs: los sistemas de control de versiones, se integran en los entornos de
desarrollo, como, por ejemplo, Netbeans, Eclipse, etc.
Filmina 9
Lenguaje de Modelado Unificado (UML): es un lenguaje estándar para escribir diseños de
software. Sirve para ayudar a los desarrolladores a construir el software. Es un estándar ISO.
Todos los sistemas tienen una estructura estática y un comportamiento dinámico. UML
proporciona diagramas para capturar y describir ambos aspectos. Los diagramas de clases se
usan para documentar y expresar la estructura estática de un sistema, es decir, las clases y sus
relaciones. Los diagramas de estado y los diagramas de interacción describen el
comportamiento de un sistema, para demostrar cómo los objetos interactúan dinámicamente
en diferentes momentos durante su ejecución.
Diagramas de Interacción: los objetos dentro de un sistema se comunican unos con otros,
enviándose mensajes. Un mensaje es una operación donde un objeto llama a otro. De esta
forma, la dinámica de un sistema se refiere a cómo los objetos cambian de estado durante el
ciclo de vida del mismo y también a cómo dichos objetos colaboran a través de la
comunicación. En el primer caso, se utilizan los diagramas de estado y los diagramas de
actividad. En el segundo caso, la comunicación entre objetos se representa mediante los
diagramas de interacción, que a su vez agrupan a dos tipos de diagramas: secuencia y
colaboración.
Diagramas de estado: muestran el conjunto de estados por los cuales pasa un objeto durante
su vida en una aplicación en respuesta a eventos, junto con sus respuestas y acciones. También
ilustran qué eventos pueden cambiar el estado de los objetos de la clase. Un estado simple es
aquel que no tiene estructura. Un estado que tiene subestados, es decir, estados anidado, se
lo denomina estado compuesto. Contienen:
• Los nombres de clases comienzan con mayúsculas y deben estar escritos con letra
negrita en sus símbolos.
• El comportamiento superior está destinado al nombre de la clase, el del medio a sus
atributos y el inferior a sus operaciones.
• Visibilidad de atributos y operaciones:
o + atributos/operaciones públicas.
o – atributos/operaciones privadas.
o # atributos/operaciones protegidas.
o Si se omite el prefijo, se asume que es pública.
• El nombre de una clase abstracta debe estar en estilo itálico o con la indicación
{abstract}. Lo mismo para las operaciones.
• Herencia: se muestra utilizando flechas que apuntan hacia arriba en la jerarquía.
• Interfaces: se muestran utilizando una flecha discontinua de la clase hacia la interfaz.
Esta lleva el prefijo <<interface>>. También se puede mostrar mediante una línea
continua y un circulo relleno para representar a la interfaz junto con su nombre arriba.
• Asociaciones: caracteriza un cierto tipo de relación que puede darse entre instancia de
determinadas clases. Una asociación muestra que existe una relación de propiedad
entre personas y perros, por la cual una persona puede ser propietaria de cero o más
perros y un perro es propiedad de una única persona. No es obligatorio poner
nombres a las asociaciones, pero si recomendable. Tampoco sus roles.
Filmina 10
Patrones de diseño: son soluciones para problemas típicos y recurrentes que nos podemos
encontrar a la hora de desarrollar un sistema.
¿Cuántos patrones de diseño existen? ¿tengo que conocerlos todos? – Patrones de diseño
hay muchos y siguen apareciendo nuevos cada cierto tiempo. Como el desarrollo de software
es una disciplina en permanente cambio, los problemas a los que nos enfrentamos también
cambian. Así que las herramientas utilizadas también se van actualizando y mejorando. Es
imposible conocerlos todos. Lo más útil es tener un catálogo de patrones que podamos
consultar.
Tipos de patrones:
¿se pueden desarrollar nuevos patrones? – Cada cierto tiempo aparecen nuevos patrones o
revisiones de los ya existentes. Por lo tanto, es factible que cualquiera pueda descubrir un
nuevo patrón. Lógicamente deberá ser puesto a prueba por la comunidad de desarrolladores
demostrando que es útil para solucionar problemas comunes de desarrollo.
Singleton (creacional): se utiliza para asegurarnos que una clase tiene solo una instancia y
proporciona un punto global de acceso a ella. Por ejemplo, el gestor de impresión. Se compone
de un constructor privado, incluyendo un atributo privado donde se alojará la instancia única y
un método de clase que permite el acceso a dicha instancia.
Observer (de comportamiento): permite definir una dependencia uno a machos entre objetos
de tal forma que, cuando el objeto cambie de estado, todos sus objetos dependientes sean
notificados y actualizado automáticamente. Elementos que lo componen:
• Sujeto: clase abstracta que conoce a sus observadores y que proporciona la interfaz
para agregar y eliminar observadores.
• Observador: clase abstracta que define un método actualizar utilizado por el sujeto
para notificar cambios en su estado.
• Sujeto concreto: subclase de sujeto que mantiene el estado del mismo y que se
encarga de notificar a los observadores al cambiar su estado.
• Observador concreto: subclase de observador que mantiene una referencia al sujeto
concreto e implementa la interfaz actualización.
Adapter (estructural): las interfaces se utilizan para desacoplar las clases clientes de las clases
que ofrecían ciertos servicios. De esta forma se hace independiente la clase cliente de la clase
servidora. Este patrón se utiliza para convertir la interfaz de una clase en otra interfaz que es la
esperada por el cliente que usa dicha clase. Elementos que la componen:
Los frameworks utilizan patrones de diseño, ya que, así logran soportar aplicaciones de más
alto nivel y que reutilizan una mayor cantidad de código, frente a uno que no utiliza dichos
patrones. Los patrones ayudan a hacer la arquitectura de los frameworks más adecuada para
muchas y diferentes aplicaciones sin necesidad de rediseño.
1. Los patrones de diseño son más abstractos que los frameworks: el código del
framework se escribe una vez, en cambio, cada vez que se requiere un patrón de
diseño se debe de codificar con respecto a la aplicación. Un framework puede ser
escrito en un lenguaje de programación, en cambio, un patrón de diseño puede ser
aplicado a cualquier lenguaje de programación, pero se tiene que reescribir desde
cero.
2. Los patrones de diseño son elementos arquitectónicos más pequeños que los
frameworks: un solo framework contiene varios patrones de diseño, pero jamás a la
inversa.
3. Los patrones de diseño son menos especializados que los frameworks: existen
frameworks con un dominio especifico. Además, los patrones son un poco más
generales debido a que pueden ser utilizados en un mayor número de aplicaciones de
varios tipos.
Clasificación de frameworks:
Filmina 11
Proceso ágil: se caracteriza por la forma en la que aborda cierto número de suposiciones clave
sobre los proyectos de software:
Modelos agiles: programación extrema (XP), desarrollo adaptativo de software (DAS), SCRUM,
método de desarrollo de sistemas dinámicos (MDSD), cristal, DIC, DES, MA, PUA.
SCRUM: los principios Scrum se utilizan para guiar actividades de desarrollo dentro de un
proceso de análisis que incorpora las siguientes actividades estructurales: requerimientos,
análisis, diseño, evolución y entrega. Dentro de cada actividad estructural las tareas del trabajo
ocurren con un patrón del proceso llamado sprint. El trabajo realizado dentro de un sprint se
adapta al problema en cuestión y se define en tiempo real por parte del equipo Scrum.
Retraso: lista de prioridades de los requerimientos o características del proyecto que dan al
cliente un valor del negocio. Es posible agregar en cualquier momento otros aspectos al
retraso.
Reuniones Scrum: son reuniones breves que el equipo efectúa a diario. Las tres preguntas
claves que se pide que respondan son:
Un líder de equipo, llamado maestro Scrum, dirige la junta y evalúa las respuestas de cada
persona. Esta reunión ayuda al equipo a descubrir los problemas potenciales tan pronto como
sea posible.