Está en la página 1de 25

Filmina 1

Paradigma: conjunto de creencias, prácticas y conocimientos que guían el desarrollo de una


disciplina durante un periodo de tiempo.

Paradigma de programación: provee la visión y métodos de un programador en la


construcción de un programa. Es un estilo de desarrollo de software.

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 Imperativo: describe la programación como una secuencia de instrucciones que


cambian el estado de un programa. Por ejemplo, el código máquina.

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 Estructurado: la programación se divide en bloques (procedimientos y funciones)


que pueden o no comunicarse entre sí. La programación se controla con secuencia, selección e
iteración. Permite reutilización de código.

Paradigma Funcional: hace hincapié en la aplicación de las funciones y composición entre


ellas, más que en los cambios de estados y la ejecución secuencial de comandos.

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.

Paradigma Orientado a Objetos: basado en la idea de encapsular estado y operaciones en


objetos. Se resuelve comunicando dichos objetos a través de mensajes. Ventajas: código
reutilizable y facilidad para pensar soluciones a determinados problemas.

Objeto: es la representación en un programa de un concepto, y contiene toda la información


necesaria para abstraerlo: datos (atributos) y operaciones (métodos).

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:

• Mejor conceptualización y modelización del mundo real.


• Separa la implementación de la especificación.
• Permite la extensibilidad del sistema. Componentes de software reutilizables.

Encapsulamiento: es la propiedad que permite asegurar que el contenido de la información de


un objeto esta oculta al mundo exterior. Permite la división de un programa en módulos. Estos
módulos se implementan en clases, de forma que una clase representa la encapsulación de
una abstracción.
Filmina 2

Objeto: un conjunto de datos relacionados que identifican el estado actual del objeto. Un
conjunto de comportamientos.

El estado de un objeto se refiere a las características que lo definen en este momento.

Los comportamientos de un objeto se refieren a las actividades asociadas con el objeto. En


java se implementan dichos comportamientos como métodos. Indica qué sabe hacer el objeto.

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:

• Todo objeto es instancia de alguna clase.


• Toda instancia de la misma clase se comporta de la misma manera.
• A nivel instancia puedo acceder a la clase, pero no viceversa.

Herencia:

• Toda clase es subclase de otra y hereda comportamiento de su superclase.


• Jerarquía de especialización o generalización
• Subclases son especializaciones de la superclase y superclase es generalización de las
subclases.
• Una subclase a través de herencia puede extender o reducir el comportamiento de su
superclase.
• Relación “es un”
• Un objeto de una subclase puede usarse en cualquier lugar donde se admita un objeto
de la superclase, pero no viceversa.
• Tipos: solo una superclase (simple), varias superclases (múltiple).

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.

En Java su sintaxis es la siguiente, public abstract class NombreDeLaClase{…}. No resulta


posible instancia la clase, es decir, no es posible crear objetos de ese tipo. Sirve como
superclase para otras clases.

Características de los métodos abstractos:

• 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:

• Constructores: métodos que inicializan la instancia.


• Métodos genéricos: realizan acciones utilizando los atributos.
• Métodos para acceso directo a los atributos: getters y setters.

Filmina 4

Interfaz:

• Es un dispositivo o sistema que permite que entidades no relacionada interactúen.


• En Java, una interfaz es una colección de definiciones de métodos sin implementación
y declaraciones de constantes de tipo primitivo, agrupadas bajo su nombre.
• Puede extender múltiples interfaces. Por lo tanto, se tiene herencia múltiple.
• Establece qué debe hacer la clase que la implementa sin especificar el cómo.
• Sintaxis: public interface nombre_interface extendeds super_interface { … }

Clases abstractas:

• No es posible crear instancias.


• Ideal para agrupar un conjunto de clases a través de una interfaz común.

Filmina 5

Los programas algunas veces generan errores:

• En tiempo de compilación: tienen que ver con algún error de sintaxis.


• En tiempo de ejecución: tienen que ver con códigos que se comportan de manera
incorrecta.

Excepción: es un evento que trastorna el flujo normal de instrucciones durante la ejecución de


un programa.

Tipos de excepciones:

• Excepciones comprobadas: deben comprobarse con un mecanismo try-catch


• Excepciones no comprobadas: pueden comprobarse opcionalmente con un
mecanismo try-catch, aunque no es necesario. Se puede escribir con cuidado el código
a fin de evitar la posibilidad de que se lance la excepción.

Para determinar si una excepción está comprobada o no comprobada, es necesario encontrar


su clase asociada en el sitio web API de Java. Si se encuentra que es un descendiente de la
clase RuntimeException, se trata de una excepción no comprobada. En el caso contrario, se
trata de una excepción comprobada.

Evitar manejo 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.

Aspectos básicos de la gestión de memoria de la plataforma Java:

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:

• Se quita la responsabilidad de liberar y destruir los objetos a los


programadores.
• Garantiza la interoperabilidad entre distintas APIs, librería o frameworks.
• Facilita el uso de grandes cantidades de memoria.

Desventajas:

• Consumo adicional de recursos.


• Impacto en el rendimiento de aplicaciones.
• Posibles paradas en la ejecución de las aplicaciones.
• Incompatibilidad con la gestión manual de la memoria.

Características del GC:

• 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.

Los GC suelen crearse basándose en dos suposiciones o precondiciones denominadas Weak


Generational Hypothesis:

• 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.

En la zona de Young Generation se almacenan los objetos que se acaban de construir en el


programa. Esta zona se divide en Eden Space y Survivor Space. La zona Eden es la zona en la
que los objetos que acabamos de construir se almacenan. Cuando el recolector pasa, elimina
todos los objetos que no están referenciados en el Eden y los supervivientes se mueven al
Survivor Space.

La zona Old Generation está divida en dos partes:

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:

1. Inicializándolo cuando se lo declara. Se llama miembro final en blanco si no se inicializa


en la declaración.
2. Inicializándolo dentro de un bloque inicializador de instancias o dentro de un
constructor. Si hay más de un constructor en la clase, debe inicializarse en todos ellos.
3. Inicializándolo dentro de un bloque estático.

Clase final: no se puede extender. Existen dos usos para el uso de esta clase:

1. Evitar la herencia, ya que no se pueden extender.


2. Crear una clase inmutable como la clase String predefinida.

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í.

• Ayuda a darle organización a la aplicación ya que permite modularizar o categorizar las


diferentes estructuras que componen nuestro software.
• Nos brinda un nivel adicional de seguridad para nuestras clases, métodos o interfaces.
• Su declaración debe estar al principio del archivo Java.
• Cada punto en la ruta del paquete es una nueva carpeta.

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.

Framework: un framework de colecciones es una arquitectura unificada para representar y


manipular colecciones. Este contiene:

• 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:

• Reduce el esfuerzo de programación: al proporcionar estructuras de datos y


algoritmos útiles permiten al programador concentrarse en las partes más importantes
de su programa.
• Calidad y velocidad del programa: proporciona un alto rendimiento y alta calidad en
las implementaciones de las estructuras, datos y algoritmos.

Jerarquía del núcleo de interfaces del JCF:

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

La interfaz Collection contiene los siguientes métodos:

• size, isEmpty: cuantos elementos tiene la colección.


• contains: si la colección contiene un determinado objeto.
• add, remove: agregar o remover elementos de la colección.
• iterator: provee un iterador de la colección.
• containsAll: retorna true si la colección contiene todos los elementos de la colección
pasados por parámetro.
• addAll: agregar todos los elementos de la colección pasada por parámetro a la
colección.
• removeAll: elimina de la colección los elementos pasados por parámetro.
• retainAll: elimina de la colección todos los elementos que no contengan la colección
pasada por parámetro.
• clear: elimina todos los elementos contenidos en la colección.
• toArray: permite que una colección pueda llevarse a un array de objetos: String [] a =
c.toArray(new String[0]) donde c es una colección.

Set:

• no puede contener elementos duplicados.


• Contiene varios tipos de implementaciones:
o HashSet:
▪ Almacena los elementos en una tabla Hash.
▪ Es la de mejor rendimiento de todas, pero no garantiza ningún orden a
la hora de realizar iteraciones.
▪ Proporciona tiempos constantes en las operaciones básicas siempre y
cuando la función hash disperse de forma correcta los elementos
dentro de la tabla hash.
▪ Es importante definir el tamaño inicial de la tabla.
o TreeSet:
▪ Almacena los elementos ordenándolos en función de sus valores.
▪ Es bastante más lento que HashSet.
▪ Los elementos almacenados deben implementar la interfaz
Comparable.
▪ Tiene un rendimiento de log(n) en las operaciones básicas.
o LinkedHashSet:
▪ Almacena los elementos en función del orden de inserción.
▪ Es más costosa que HashSet.

Ejemplo: Collection<Type> noDups = new HashSet<Type>(c)

Contiene los métodos: size, isEmpty, add, remove, iterator. Suponiendo que s1 y s2 son set:

• s1.containsAll(s2): retorna true si s2 es subconjunto de s1.


• s1.addAll(s2): transforma s1 en la unión de s1 y s2.
• s1.retainAll(s2): transforma s1 en la intersección de s1 y s2.
• S1.removeAll(s2): transforma s1 en la diferencia asimétrica entre los conjuntos s1 y s2.

SortedSet: mantiene sus elementos ordenados en orden ascendente. Provee operaciones


adicionales que permiten tomar ventaja de la ordenación. Sirve para conjuntos ordenados,
tales como listas de palabras.

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:

• Acceso posicional: permite manipular elementos basados en su posición numérica en


la lista.
• Búsqueda: búsqueda de objetos específicos en la lista y retorna su posición numérica.
• Iteración: extiende la semántica de Iterator para aprovecha la secuencia natural de la
lista.
• Rango: realiza diversas operaciones arbitrarias de rango sobre la lista.

Métodos que implementa la colección List:

• add y addAll: agrega el o los nuevos elementos en el final de la lista.


• remove: elimina la primera ocurrencia del elemento especificado de la lista.
• add y addAll con parámetros: permite insertar elementos en una posición
determinada.
• get y set: permite obtener y cambiar el elemento en la posición dada.
• set y remove: retorna el valor viejo antes de sobrescribirlo o eliminarlo.
• indexOf y lastIndexOf: permite saber la posición de la primera o la última vez que un
elemento aparece en la lista; si el elemento no se encuentra devuelve -1.
• subList: devuelve una “vista” de la lista, desde el elemento fromIndexinclusive hasta el
toIndexclusive.

Contiene dos implementaciones de propósito general de List:

1. ArrayList: es la implementación de mejor desempeño. Almacena los elementos de la


colección en un array de Objects.
2. LinkedList: ofrece un mejor rendimiento en determinadas circunstancias. Almacena los
elementos en una lista enlazada.

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.

Otros tipos de colecciones:

• 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.

Características generales de Java:

• Sencillo: elimina la complejidad de los lenguajes como C y da paso al contexto de los


lenguajes modernos orientados a objetos.
• Orientado a Objetos: su nivel de abstracción facilita la creación y mantenimiento de
programas.
• Independiente a la arquitectura y portable: al compilar un programa, el código
resultante es un tipo de código binario conocido como Java bytecodes. No depende de
una arquitectura de ordenador especifica. El código compilado de Java es
interpretado.
• Robusto: simplifica la gestión de la memoria dinámica. El acceso a memoria es
supervisado por el intérprete de tal manera que no es posible acceder a zonas de
memoria no autorizadas sin provocar un error.
• Seguro: tiene políticas que evitan que se puedan codificar virus con este lenguaje.
• Multitarea: soporta múltiples threads, hilos o tareas, es un lenguaje que puede
ejecutar diferentes líneas de código al mismo tiempo.
• Dinámico: no es necesario cargar completamente el programa en memoria, sino que
las clases compiladas puede ser cargadas bajo demanda en tiempo de ejecución.

La principal característica de Java es que es compilado e interpretado. Con el compilador Java,


el programa fuente con extensión .java es traducido a lenguaje intermedio llamado Java
bytecodes generándose un programa compilado almacenado en un archivo con extensión
.class. Este archivo puede ser posteriormente interpretado y ejecutado por el intérprete de
Java (conocido como JVM, Java Virtual Machine). La compilación se produce una vez y la
interpretación cada vez que el programa se ejecuta.

Ventajas:

• Compatibilidad: no es necesario modificar el código si se desea ejecutar el programa


en otra máquina. Solo se necesita una JVM.
• Metodología OO: es un lenguaje de programación orientado a objetos, y tiene todos
los beneficios que ofrece esta metodología de programación.
• Menor y mejor código: comparaciones de métricas de programas indican que un
programa escrito en Java es cuatro veces menor tamaño que uno escrito en C++.
• Gratuidad: el kit de desarrollo Java es gratuito y puede descargarse desde su página
oficial.

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.

Java contiene cuarto tipos de plataformas:

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

Repositorio: contiene el registro con las diferentes versiones en el tiempo.

Branch: es un hilo separado de código con su propia historia.

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.

Clone: nos permite clonar un repositorio completo.

Push: nos permite subir un commit a un repositorio remoto como GitHub.

Pull: nos permite bajar un commit de un repositorio remoto como GitHub.

Revisión: es un identificador que representa una versión especifica del código, siendo HEAD la
última versión.

Un sistema de control de versiones es un software que administra el acceso a un conjunto de


archivos, y mantiene un historial de los cambios realizados.
Características:

• Mecanismo de almacenamiento de los elementos que deba gestionar.


• Posibilidad de realizar cambios sobre los elementos almacenados.
• Registro histórico de las acciones realizadas con cada elemento o conjunto de
elementos.

Clasificación de los sistemas de control de versiones:

1. Centralizados: todos los archivos y sus versiones están almacenados en un único


directorio (repositorio) de una computadora especial (servidor).
2. Distribuidos: no hay repositorio central. Todos los desarrolladores tienen su propia
copia del repositorio, con todas las versiones y toda la historia. Los sistemas de control
de versiones distribuidos permiten que en cualquier momento dos desarrolladores
cualesquiera puedan sincronizar sus repositorios.

Control de versiones: consiste en una copia maestra en un repositorio central, y un programa


cliente con el que cada usuario sincroniza su copia local. Esto permite compartir los cambios
sobre un mismo conjunto de archivos.

Funcionamiento: se basa en disponer de un repositorio, que es el conjunto de información


gestionada por el sistema. Este repositorio contiene el historial de versiones de todos los
elementos gestionados. Para modificar la copia local existen dos semánticas básicas:

1. Exclusivos: para poder realizar un cambio es necesario marcar en el repositorio el


elemento que se desea modificar y el sistema se encargara de impedir que otro
usuario pueda modificar dicho elemento.
2. Colaborativos: en el que cada usuario se descarga la copia, la modifica, y el sistema
automáticamente combina las diversas modificaciones.

Procedimiento de uso habitual de un sistema de control de versiones:

1. Descarga de ficheros inicial (Checkout).


2. Ciclo de trabajo habitual:
a. Modificación de los ficheros.
b. Actualización de ficheros en local (Update).
c. Resolución de conflictos (si los hay).
d. Actualización de archivos en repositorio (Commit).

Integración con IDEs: los sistemas de control de versiones, se integran en los entornos de
desarrollo, como, por ejemplo, Netbeans, Eclipse, etc.

Git: es un sistema de control de versiones distribuido. Permite el uso de repositorios públicos


de forma gratuita, así como repositorios privados mediante suscripción. Está escrito en
lenguaje C.

GitHub: es una plataforma de desarrollo colaborativo para almacenar proyectos utilizando el


sistema de control de versiones Git.

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.

Posee dos diagramas principales:

1. Diagramas de Estructura: muestran la estructura estática de los objetos en un sistema.


2. Diagramas de Comportamiento: muestran el comportamiento dinámico de los objetos
en el sistema.

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 Secuencia: muestran la interacción de un conjunto de objetos a través del


tiempo. Es decir, nos proporcionan la interacción entre los objetos, que se sucede en el
tiempo, para un escenario específico durante la ejecución del sistema. Gráficamente, un
diagrama de secuencia es una tabla con dos ejes: el eje horizontal muestra el conjunto de
objetos y el eje vertical muestra el conjunto de mensajes, ordenados en el tiempo. Este
contiene:
• Objetos: estos se representan en el eje horizontal, y cada uno de ellos mediante un
rectángulo que contiene el nombre y la clase del objeto en el siguiente formato,
nombre del objeto : nombre de la clase.
• Distinción de los diagramas de colaboración:
o Línea de vida: representa la existencia de un objeto durante un cierto periodo
de tiempo. Se dibuja mediante una línea vertical discontinua desde el
rectángulo que contiene al objeto hasta la parte final del diagrama.
o Activación: la activación de un objeto muestra el periodo de tiempo en el cual
un objeto se encuentra desarrollando alguna acción. Un objeto activado puede
estar ejecutando código propio o bien esperando la vuelta de otro objeto al
que previamente le ha enviado un mensaje. Se dibuja mediante un rectángulo
delgado sobre la línea de vida del objeto. La parte superior del rectángulo está
alineada con el comienzo de la acción y la inferior con su fin.
• Mensajes: representan la comunicación entre los objetos y de dibujan como líneas
horizontales continuas, dirigidas desde el objeto que envía el mensaje hasta el que lo
ejecuta. Los mensajes tienen un nombre, el cual puede aparecer o no acompañado de
parametros. Tambien puede tener condiciones.

o Simple: representa un flujo de control simple. Muestra como el control se pasa


de un objeto a otro sin describir ningun detalle sobre la comunicación.
o Sincrono: representa un flujo de control anidado, implementado como una
llamada a una operación. La operación que soporta el mensaje se termina
antes de que el objeto que envio el mensaje continue con su ejecucion. La
vuelta se puede mostrar como un mensaje simple.
o Asincrono: representa un flujo de control asincrono. No hay vuelta explicita al
objeto que envio el mensaje, el cual continua ejecutandose despues de enviar
el mensaje sin esperar ninguna respuesta.

Creación y destrucción de un objeto (diagrama de secuencia): un objeto puede crear uno


nuevo por medio de un mensaje <<create>>. Asimismo, se puede eliminar mediante un
mensaje <<destroy>>. Cuando se destruye se marca con una X y la línea de vida del objeto solo
se dibuja hasta el punto en el que se ha eliminado.

Diagrama de colaboración: muestran la interacción de un conjunto de objetos en el espacio.


Gráficamente es un grafo formado por un conjunto de vértices, los objetos y de arcos, los
enlaces, que conectan dichos vértices.

• Objetos: se representa mediante un rectángulo que contiene el nombre y la clase del


objeto. Nombre del objeto : nombre de la clase.
• Enlaces: es una instancia de una asociación en un diagrama de clases. Se representa
como una línea continua que une a dos objetos. Distinción de los diagramas de
secuencia:
o Path: indica que tipo de objeto recibe el mensaje.
o Numero de secuencia.
• Flujo de mensajes/control: expresa el envió de los mensajes. Se representa mediante
una flecha dirigida cercana a un enlace. La mayoría de las veces el flujo de control es
secuencia. Sin embargo, se pueden modelar flujos más complejos, donde está
implicada una iteración o una ramificación.
o Iteración: representa una secuencia repetida de mensajes. Expresión * [i : = 1
… n] (o simplemente * para no especificar más detalles).
o Condición: representa un mensaje cuya ejecución depende a de la evaluación
de una expresión booleana. Expresión [x > 0].
• Creación/destrucción de un objeto:
o New: indica que se crea un objeto.
o Destroyed: indica que se elimina un objeto existente.
o Transient: indica que se crea un objeto durante la ejecución de la interacción,
pero se destruye antes que se termina la misma.

PostScript(PS): es un lenguaje de descripción de página, se utiliza para decirle a un dispositivo


destinado a imprimir cómo y qué debe imprimir. Un documento PS, es un pequeño programa
que le dice a una impresora qué, cómo y dónde imprimir.

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:

• Eventos: es una ocurrencia que puede causar la transición de un estado a otro de un


objeto. Este permanece en un estado durante un tiempo finito. Se representa por
medio de un rectángulo con los bordes redondeados y con tres divisiones internas. Los
tres compartimientos alojan el nombre del estado, el valor característico de los
atributos del objeto en ese estado y las acciones que se realizan en ese estado. En
muchos diagramas se omiten los dos comportamientos inferiores. Esta ocurrencia
puede ser una:
o Condición que toma el valor de verdadero (eventoCambio).
o Recepción de una señal explicita de un objeto a otro (eventoSeñal).
o Recepción de una llamada a una operación (eventoLlamada).
o Paso de cierto periodo de tiempo, que después de entrar al estado actual, o de
cierta hora y fecha concretas (eventoTiempo).
• Acciones: es una operación atómica, que no se puede interrumpir por un evento y que
se ejecuta hasta su finalización. Puede ser:
o Una llamada a una operación.
o Creación o destrucción de otro objeto.
o El envío de una señal a un objeto.
• Actividades: una acción contrasta con una actividad, ya que esta última puede ser
interrumpida por otros eventos.
• Transiciones simples: es una relación entre dos estados que indica que un objeto en el
primer estado puede entrar al segundo y ejecutar ciertas operaciones cuando un
evento ocurre y si ciertas condiciones son satisfechas. Se representa como una línea
continua dirigida desde el estado origen hasta el estado destino. Puede venir
acompañado por un texto, nombre-evento (lista-argumentos) [guard-condition] /
expresión-acción ˆ clausula-envío
o Nombre-evento y lista-argumentos describen el evento que da lugar a la
transición y forman lo que se denomina event-signature.
o Guard-condition es una condición (booleana) adicional al evento y necesaria
para que la transición ocurra. Si se combina con un event-signature, entonces
deben suceder dos cosas: debe ocurrir el evento y la condición booleana debe
ser verdadera.
o Expresión-accion es una expresión procedimental que se ejecuta cuando se
dispara la transición.
o Clausula-envio es una acción adicional que se ejecuta con el cambio de
estado, como el envío de evento a otros paquetes o clases.
• Subestados secuenciales: suceden uno detrás de otro. Puede tener un estado inicial y
un estado final.
• Subestados concurrentes: suceden al mismo tiempo. No tienen un estado inicial y un
estado final. Sin embargo, los subestados secuenciales que componen un estado
concurrente pueden tenerlos.

Diagramas de clases: es un tipo de diagrama de estructura estática que describe la estructura


de un sistema mostrando las clases del sistema, sus atributos, métodos y las relaciones entre
los objetos. Representación de clases:

• 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.

• Composición: permite expresar que un objeto se compone de otros objetos. La


asociación entre el objeto compuesto y sus constituyentes se denota con una línea con
diamante relleno en el extremo del objeto compuesto. Debe mostrarse la multiplicidad
en el extremo del constituyente de la asociación.

• Agregacion: permite expresar que un objeto agrupa a otros objetos. La asociacion


entre el agregado y sus contituyentes se denota con una linea con diamante abierto en
el extremo del agregado.

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.

¿Por qué utilizar patrones de diseño? – Si queremos desarrollar aplicaciones de calidad,


robustas y fácil de mantener, debemos cumplir ciertas reglas. Es por eso que los patrones de
diseño nos ayudan a cumplir muchos de estos principios, como por ejemplo la reutilización de
código.

¿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:

• Creacionales: crean objetos de manera de tener que instanciarlos directamente,


proporcionando mayor flexibilidad para decidir que objetos usar.
• De comportamiento: permiten definir la comunicación entre los objetos de nuestro
sistema y el flujo de la información entre los mismos.
• Estructurales: permiten crear grupos de objetos para realizar tareas complejas.

¿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:

• Objetivo: interfaz que utiliza el cliente.


• Cliente: colabora con los objetos usando la interfaz Objetivo.
• Adaptado: define una interfaz existente que necesita ser adaptada.
• Adaptador: adapta la interfaz del adaptado a la interfaz Objetivo.
• Esquema de herencia múltiple: el objetivo adaptador hereda la interfaz de Objetivo al
mismo tiempo que hereda de la clase Adaptado el método PeticionEspecifica
• Esquema composición: el objeto Adaptador hereda el interfaz de Objetivo y está
compuesto de un objeto del tipo Adaptado a cuyo método PeticionEspecifica delega
las peticiones que le llegan del cliente.
Herencia múltiple Composición
Solo permite adaptar una clase, no sus Permite que un único adaptador trabaje
subclases. sobre muchos adaptados.
Permite que el adaptador sobrescriba Introduce un nivel más de indirección, lo
parte de la conducta del adaptado. cual implica una penalización en
con la herencia nos evitamos la rendimiento.
indirección que se produce en la Complica la sobrescritura de la conducta
composición. del adaptado.

Framework: se refiere a un conjunto de bibliotecas, utilizadas para implementar la estructura


estándar de una aplicación. Todo esto se realiza con el propósito de promover la reutilización
de código, con el fin de ahorrarle trabajo al desarrollador al no tener que rescribir código para
una nueva aplicación que desee crear.

El framework se encarga de definir la estructura general, sus particiones en clases y objetos,


las responsabilidades clave. Promueve la reutilización de código y de diseño. Las aplicaciones
deben de evolucionar y crecer al mismo tiempo que crece el framework, ya que, un cambio en
alguna interfaz del mismo, significa un cambio de la aplicación.

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.

Principales 3 diferentes entre framework y patrón de diseñ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:

• De aplicación: forman una estructura básica de programador para ciertos tipos de


aplicaciones.
• De dominio: crean la estructura de programación para un área problemática particular
y por lo tanto proporcionan funciones para resolver este problema.
• De clase: son una combinación de clases y métodos que se pueden utilizar para una
amplia gama de aplicaciones. Apoyan la implementación a un cierto nivel abstracto.
• De componentes: proporcionan un entorno para el desarrollo e integración de
componentes de software, que son un conjunto de clases y generalmente tienen una
interfaz claramente definida.
• De coordinación: proporcionan la capacidad de configurar interacciones de
dispositivos y sirven para garantizar una compatibilidad perfecta.
• De prueba: se utiliza para probar software desarrollado.
• De web: están diseñados para el desarrollo de webs dinámicas y aplicaciones web.

Filmina 11

Manifiesto: se lo asocia con un movimiento político emergente, ataca a la vieja guardia y


sugiere un cambio revolucionario.

El manifiesto por el desarrollo ágil de software estable lo siguiente:

• Los individuos y sus interacciones, sobre los procesos y las herramientas.


• El software que funciona, más que la documentación exhaustiva.
• La colaboración con el cliente, y no tanto la negociación del contrato.
• Responder al cambio, mejor que apegarse a un plan.

¿Qué es la agilidad en el contexto del desarrollo de software? – un equipo ágil es diestro y


capaz de responder de manera apropiada a los cambios.

La sabiduría convencional del desarrollo de software señala que el costo se incrementa en


forma no lineal a medida que el proyecto avanza. Es relativamente fácil efectuar cambios
cuando el equipo de software reúne los requerimientos. Pero cuando se debe ingresar un
cambio funcional grande, las cosas cambian; se deberá modificar el diseño de la arquitectura
del software y el costo aumenta con rapidez. Se afirma que un proceso ágil “aplana” el costo
de la curva de cambio.

Proceso ágil: se caracteriza por la forma en la que aborda cierto número de suposiciones clave
sobre los proyectos de software:

• Es difícil predecir que requerimientos de software persistirán y cuales cambiarán.


• Para muchos tipos de software, el diseño y la construcción deben ejecutarse en forma
simultánea.
• El análisis, diseño, construcción y pruebas no son tan predecibles como nos gustaría.

Por lo tanto, un proceso ágil debe ser adaptable incrementalmente.

Los 12 principios de la Alianza Ágil:

1. La prioridad más alta es satisfacer al cliente a través de la entrega pronta y continua de


software valioso.
2. Son bienvenidos los requerimientos cambiantes, aun en una etapa avanzada del
desarrollo.
3. Entregar con frecuencia software que funcione, de dos semanas a un par de meses.
4. Las personas de negocios y los desarrolladores deben trabajar juntos durante todo el
proyecto.
5. Hay que desarrollar los proyectos con individuos motivados.
6. El método más eficiente y eficaz para transmitir información a los integrantes de un
equipo de desarrollo es la conversación cara a cara.
7. La medida principal de avance es el software que funciona.
8. Los procesos agiles promueven el desarrollo sostenible.
9. La atención continua a la excelencia técnica y el buen diseño mejora la agilidad.
10. Es esencial la simplicidad: el arte de maximizar la cantidad de trabajo no realizado.
11. Las mejores arquitecturas, requerimientos y diseños surgen de los equipos con
organización propia.
12. El equipo reflexiona a intervalos regulares sobre cómo ser más eficaz, para después
afinar y ajustar su comportamiento en consecuencia.

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.

Programación extrema (XP): existen 5 valores fundamentales:

1. Comunicación: pone énfasis en la colaboración estrecha pero informal entre los


clientes y los desarrolladores, en el establecimiento de historias para comunicar
conceptos importantes, en la retroalimentación continua y en evitar la documentación
voluminosa como medio de comunicación.
2. Simplicidad: restringe a los desarrolladores para que diseñen solo las necesidades
inmediatas, en lugar de considerar las del futuro. Si hay que mejorar el diseño, se
rediseñara en un momento posterior.
3. Retroalimentación: se obtiene de tres fuentes, el software implementado, el cliente y
otros miembros del equipo de software.
a. Al implementar y diseñar una estrategia de pruebas eficaz, el software da
retroalimentación al equipo ágil.
b. Cuando se entrega un incremento al cliente, las historias implementadas se
utilizan como base para las pruebas de aceptación.
c. El equipo da al cliente una retroalimentación rápida con miras al costo y al
efecto en la programación de actividades.
4. Valentía: la mayor parte de equipos de software justifican que diseñar para el mañana
ahorrara tiempo y estufero a largo plazo. Un equipo ágil debe tener disciplina para
diseñar para hoy y reconocer que los requerimientos futuros tal vez cambien mucho.
5. Respeto: inculca respeto entre sus miembros, entre otros participantes y los
integrantes del equipo, conforme logra la entrega exitosa de incrementos de software,
el equipo desarrolla más respeto para el proceso XP.

La XP usa un enfoque orientado a objetos y engloba un conjunto de reglas y prácticas que


ocurren en el contexto de cuatro actividades:

1. Planeación: comienza escuchando, esto lleva a la creación de historias que describen


la salida, características y funcionalidad del software que se va a elaborar. A cada
historia se le asigna un numero en base al valor general de la características o función
para el negocio. Es escrita por el cliente. Luego el equipo XP evalúa cada historia y le
asigna un costo. Si la historia requiere más de tres semanas, se le pide al cliente que la
descomponga en historias más chicas. Una vez que se llega a un acuerdo sobre la
entrega, el equipo XP ordenas las historias en una de tres formas:
a. Todas las historias se implementarán de inmediato.
b. Las historias con más valor entraran a la programación de actividades y se
implementaran en primer lugar.
c. Las historias más riesgosas formaran parte de la programación de actividades y
se implementaran primero.
Después de la primera entrega, el equipo XP calcula la velocidad de éste. Esto se utiliza
para estimar las fechas de entrega y programar las actividades de las entregas
posteriores. Y determina si se ha logrado un gran compromiso para todas las historias
durante todo el desarrollo del proyecto.
2. Diseño: sigue rigurosamente el principio mantelo sencillo. El diseño guía la
implementación de una historia conforme se escribe. Estimula el uso de las tarjetas
CRC como un mecanismo eficaz para pensar el software en un contexto orientado a
objetos. Estas tarjetas son el único producto del trabajo de diseño que se genera como
parte del proceso XP. Si el diseño de una historia es complejo, XP recomienda la
creación inmediata de un prototipo operativo de esa porción del diseño (solución en
punta). El objetivo es disminuir el riesgo cuando comience la implementación
verdadera.
El diseño ocurre tanto antes como después de la codificación.
3. Codificación: Luego de que se hayan desarrollado las historias y el trabajo de diseño, el
equipo no inicia la codificación, sino que desarrolla una serie de pruebas unitarias a
cada una de las historias que se van a incluir en la entrega en curso. Una vez creada, el
desarrollador esta mejor capacitado para centrarse en lo que debe implementarse
para pasar la prueba.
Un concepto clave durante la actividad de codificación es la programación por parejas.
Esto da un mecanismo para la solución de problemas en tiempo real y para el
aseguramiento de la calidad también en tiempo real. También mantiene a los
desarrolladores centrados en el problema que están tratando. En la práctica una de
ellas tal vez piense en los detalles del código de una porción del diseño, mientras que
la otra se asegura de que se siguen los estándares de codificación o de que el código
satisfará la prueba unitaria desarrollada a fin de validad el código con la historia.
A medida que las parejas de programadores terminan su trabajo, el código que
desarrollan se integra con el trabajo de los demás.
4. Pruebas: a medida que se organizan las pruebas unitarias individuales en un grupo de
prueba universal, las pruebas de la integración y validación del sistema pueden
efectuarse a diario. Las pruebas de aceptación, también llamadas pruebas del cliente,
son especificadas por el cliente y se centran en las características y funcionalidad
generales del sistema que son visibles y revisables por parte del cliente.

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.

Sprints: consiste en unidades de trabajo que se necesitan para alcanzar un requerimiento


definido en el retraso que debe ajustarse en una caja de tiempo predefinida (lo común son 30
días). Durante los sprints no se introducen cambios, así permite a los miembros del equipo
trabajar en un ambiente de corto plazo, pero estable.

Reuniones Scrum: son reuniones breves que el equipo efectúa a diario. Las tres preguntas
claves que se pide que respondan son:

1. ¿Qué hiciste desde la última reunión del equipo?


2. ¿Qué obstáculos estas encontrando?
3. ¿Qué planeas hacer mientras llega la siguiente reunión del equipo?

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.

Demostraciones preliminares: entregar el incremento de software al cliente de modo que la


funcionalidad que se haya implementado pueda demostrarse al cliente y este pueda evaluarla.

También podría gustarte