Source: https://coggle.it/diagram/WohOvBxbWwAB86ki/t/desarrollo-de-software-tipos-abstractos-de-datos
Timestamp: 2018-09-22 23:02:22+00:00

Document:
Desarrollo de software. Tipos abstractos de datos Coggle
Desarrollo de software. Tipos abstractos de datos
La principal razón para que las personas aprendan lenguajes y métodos de programación es utilizar la computadora como una herramienta para resolver problemas. Una metodología a seguir para la resolución de problemas con computadoras es la Abstracción de Datos.
Abstracción de Datos: Consiste en inventar nuevos tipos de datos que sean más adecuados para una aplicación, lo cual nos facilita la escritura del código. Nos permite crear programas más cortos, legibles y flexibles.
Un tipo de dato definido por el programador se denomina tipo abstracto de dato, TAD (Abstract Data Type, ADT).
1.1. EL SOFTWARE (LOS PROGRAMAS)
Software: Conjunto de instrucciones que controlan y coordinan los componentes del hardware, para ejecutar una tarea. Existen dos tipos importantes de software: software del sistema y software de aplicaciones.
1.1.1 Software del sistema:
Es un conjunto generalizado de programas que gestiona los recursos del computador, tal como el procesador central. Conecta el software de aplicación y el hardware del computador.
Es el conjunto de programas indispensables para que la máquina funcione; se denominan también programas del sistema. Estos programas son, el sistema operativo, los editores de texto, los compiladores/intérpretes (lenguajes de programación).
1.1.2 Software de aplicaciones:
Conjunto de programas escritos por empresas o usuarios y que instruyen a la computadora para que ejecute una tarea específica. Tiene como función principal ayudar a un usuario de un computador para ejecutar tareas específicas.
1.1.3. Sistema operativo:
Es la parte más importante del software del sistema ya que es la parte que contrala y gestiona los recursos del computador. Es la colección de programas de computador que controla la interacción del usuario y el hardware del computador.
Asigna recursos, planifica el uso de recursos y tareas del computador, y monitoriza las actividades del sistema informático. El sistema operativo asigna memoria a un programa y manipula el control de los dispositivos de entrada y salida tales como el monitor el teclado o las unidades de disco.
Cuando un usuario interactúa con un computador, la interacción está controlada por el sistema operativo. El usuario se comunica con el sistema operativo a través de una interfaz de usuario. La interfaz gráfica (Graphical User Interface, GUI) hace uso de iconos, botones, barras y cuadros de diálogo, para realizar tareas que se controlan por el teclado o el ratón.
1.1.3.1. Tipos de sistemas operativos
Multiprogramación/Multitarea
La multiprogramación permite a múltiples programas compartir recursos de un sistema de computadora en cualquier momento a través del uso de una UCP. Sólo un programa utiliza realmente la UCP, sin embargo, las necesidades de entrada/salida pueden ser atendidas en el mismo momento. Dos o más programas están activos al mismo tiempo, pero no utilizan los recursos del computador simultáneamente. Un grupo de programas se ejecutan alternativamente y se alternan en el uso del procesador.
Tiempo compartido (múltiples usuarios, time sharing)
Es un sistema operativo que tiene la capacidad de permitir que muchos usuarios compartan simultáneamente los recursos de proceso de la computadora. Dada la alta velocidad de transferencia de las operaciones, la sensación es que todos los usuarios están conectados simultáneamente a la UCP, con cada usuario recibiendo únicamente en un tiempo de máquina determinado.
Cuando un sistema operativo puede enlazar a dos o más UCP para trabajar en paralelo en un único sistema de computadora. El sistema operativo puede asignar múltiples UCP para ejecutar diferentes instrucciones del mismo programa o de programas diferentes, dividiendo el trabajo entre las UCP.
Las técnicas utilizadas por los desarrolladores profesionales de software para llegar a soluciones adecuadas para la resolución de problemas se denomina proceso de desarrollo de software.
Las fases de desarrollo de software se suelen considerar las siguientes:
•1.2.2 Análisis y especificación del problema.
•1.2.3 Diseño de una solución.
•1.2.4 Implementación (codificación).
•1.2.5 Pruebas, ejecución, corrección y depuración.
•1.2.6 Documentación.
•1.2.7 Mantenimiento y evaluación.
1.2.1. Modelos de proceso de desarrollo de software
Modelos normativos (prescriptivos).
Modelos en cascada.
Modelos de proceso incremental
El proceso unificado (RUP de Booch, Rumbaugh y Jacobson)
Métodos Ágiles [ Beck 01]
1.2.2. Análisis y especificación del problema
Antes de intentar solucionar el problema, que necesario tener una buena definición sobre este,
Se debe analizar profundamente todos sus aspectos. Se requiere una descripción precisa y lo más completa posible de la entrada del problema (información disponible para la resolución del problema) y la salida requerida. Además, se requiere información adicional tal como: hardware y software necesarios, tiempo de respuesta, plazos de entrada, facilidad de uso, robustez del software.
1.2.3 Diseño de una solución.
El diseño de la solución se inicia una vez que se tiene la especificación del problema y consiste en la formulación de los pasos o etapas para resolver el problema. Se requiere el uso de algoritmos. Un algoritmo es un conjunto de instrucciones o pasos para resolver un problema Los algoritmos deben procesar los datos necesarios para la resolución del problema.
Una buena técnica para el diseño de un algoritmo es el diseño descendente, que consiste en descomponer el problema en subproblemas o subtareas más pequeñas y sencillas, luego descomponer cada subproblema o subtarea en otra más pequeña y así sucesivamente, hasta llegar a subtareas que sean fáciles de realizar.
Otra técnica de diseño muy utilizado es el diseño orientado a objetos. El diseño orientado a objetos se centra en la localización de módulos y objetos del mundo real. Estos objetos del mundo real están formados por datos y operaciones que actúan sobre los datos y modelan, a su vez, a los objetos del mundo real, e interactúan entre sí para resolver el problema concreto.
1.2.4 Implementación (codificación).
Implica la traducción de la solución de diseño elegida en un programa de computadora escrito en un lenguaje de programación.
El código fuente, sea cual sea el lenguaje de programación en el cual se haya escrito, debe ser legible, comprensible y correcto (fiable). Ya que estos programas se usan, normalmente, durante mucho tiempo y requieren un mantenimiento que en muchos casos se realiza por programadores distintos a los que escribieron el programa original. Por estas razones, es muy importante escribir programas que se puedan leer y comprender con facilidad.
1.2.5. Pruebas y depuración
Consiste en verificar que dicho programa funciona correctamente y cumple realmente todos sus requisitos, las pruebas deben revelar todos los errores existentes en el programa.
La prueba del software es un elemento de un tema más amplio que suele denominarse verificación y validación. Verificación es el conjunto de actividades que aseguran que el software funciona correctamente con una amplia variedad de datos. Validación es el conjunto diferente de actividades que aseguran que el software construido se corresponde con los requisitos del cliente.
Para que los datos de prueba sean buenos, necesitan cumplir dos propiedades:
Se necesita conocer cuál es la salida que debe producir un programa correcto para cada entrada de prueba.
Las entradas de prueba deben incluir aquellas entradas que más probabilidad tengan de producir errores.
La depuración es el proceso de fijación o localización de errores. La detección de una entrada de prueba que produce un error. Después que se encuentra una entrada de prueba errónea se debe determinar exactamente por qué ocurre el error.
1.2.6. Documentación
La documentación completa del software presenta todos los documentos en un manual que sea útil a los programadores y a su organización.
Existen cinco documentos imprescindibles en la documentación final de un programa:
1.Descripción del problema.
2.Cambio y desarrollo de algoritmos.
3.Listados de programas.
4.Ejecución de las pruebas de muestra.
5.Manual de usuario.
1.2.7. Mantenimiento
Una vez terminado el programa, su uso se puede extender durante mese o años, por eso, hay que tener en cuenta que pueden surgir errores en un futuro y estos hay que corregirlos.
También pueden surgir nuevos cambios deseados en el programa como mejoras en el rendimiento, añadir nuevas funciones etc.
1.3. CALIDAD DEL SOFTWARE
El software de calidad debe cumplir las siguientes características:
Corrección: Capacidad del software de realizar exactamente las tareas definidas por su especificación.
Legibilidad y comprensibilidad: Un sistema debe ser fácil de leer y sencillo. Estas características se ven favorecidas con el empleo de abstracciones, indentación y comentarios.
Extensibilidad: Capacidad de adaptarse a cambios en su especificación. Existen dos principios fundamentales para conseguir esto, diseño simple y descentralización.
Robustez: Capacidad de funcionar incluso en situaciones anormales (manejo de errores).
Eficiencia:capacidad para hacer un buen uso de los recursos del computador. Un sistema eficiente es aquél cuya velocidad es mayor con el menor espacio de memoria ocupada.
Facilidad de uso: Que el usuario puede comunicarse con el software de manera cómoda y fácil.
Transportabilidad (portabilidad): El software puede ser transportado sobre diferentes sistemas físicos o lógicos.
Verificabilidad: Capacidad para soportar los procedimientos de validación y de aceptar test o ensayo de programas.
Reutilización: Capacidad de ser reutilizado en nuevas aplicaciones.
Integridad: Capacidad para proteger sus propios componentes contra los procesos que no tengan el derecho de acceso.
1.4. ALGORITMOS
Resolución de un problema se refiere al proceso completo que abarca desde la descripción inicial del problema hasta el desarrollo de un programa de computadora que lo resuelva. Los pasos para la resolución de un problema son:
Diseño del algoritmo que describe la secuencia ordenada de pasos que conducen a la solución de un problema dado.
Expresar el algoritmo como un programa en un lenguaje de programación adecuado.
Ejecución y validación del programa por la computadora.
Diagramas de flujo: representación gráfica de un algoritmo.
Pseudocódigo: lenguaje de especificación de algoritmos.
Algoritmo: conjunto finito de reglas que dan una secuencia de operaciones para resolver un determinado problema.
1.2. RESOLUCIÓN DE PROBLEMAS Y DESARROLLO DE SOFTWARE
La abstracción ofrecida por los lenguajes de programación se puede dividir en dos categorías: abstracción de datos (perteneciente a los datos) y abstracción de control (perteneciente a las estructuras de control).
Las estructuras de control describen el orden en que se ejecutan las sentencias o grupos de sentencia. Las unidades de programa se utilizan como bloques básicos de la clásica descomposición “descendente”. Los subprogramas constituyen una herramienta potente de abstracción ya que, durante su implementación, el programador describe en detalle cómo funcionan. Cuando el subprograma se llama, basta con conocer lo que hace y no cómo lo hace.
Las abstracciones y estructuras de control se clasifican en estructuras de control a nivel de sentencia y a nivel de unidades. La abstracción de control a nivel de unidad se conoce como abstracción procedimental.
Abstracción procedimental (por procedimientos o funciones)
esencial para diseñar software modular y fiable. La abstracción procedimental se basa en la utilización de procedimientos o funciones sin preocuparse de cómo se implementan.
La abstracción aparece en los subprogramas debido a las siguientes causas:
• Con el nombre de los subprogramas, un programador puede asignar una descripción abstracta que captura el significado global del subprograma.
• Los subprogramas proporcionan ocultación de la información. Las variables locales y cualquier otra definición local se encapsulan en el subprograma, ocultándolas realmente de forma que no se pueden utilizar fuera del subprograma.
• Los parámetros de los subprogramas, junto con la ocultación de la información anterior, permiten crear subprogramas que constituyen entidades de software propias. Los detalles locales de la implementación pueden estar ocultos mientras que los parámetros se pueden utilizar para establecer la interfaz pública.
Los primeros pasos hacia la abstracción de datos se crearon con lenguajes tales como FORTRAN, COBOL y ALGOL 60, con la introducción de tipos de variables diferentes, que manipulan enteros, números reales, caracteres, valores lógicos, etc. EL problema era que estas no podían ser modificadas y no siempre se ajustaban al tipo necesitado.
La siguiente generación, PASCAL, SIMULA-67 y ALGOL 68, permitió al programador modificar y ampliar los tipos de datos existentes mediante construcciones específicas.
SIMULA-67 fue el primer lenguaje que mezcló datos y procedimientos mediante la construcción de clases.
La abstracción de datos es la técnica de programación que permite inventar o definir nuevos tipos de datos. Los nuevos tipos de datos definidos por el usuario se llaman tipos abstractos de datos (ADT, Abstract Data Types).
Ghezzi indica que un tipo de dato definido por el usuario se denomina tipo abstracto de dato (TAD) si:
•    Existe una construcción del lenguaje que le permite asociar la representación de los datos con las operaciones que lo manipulan.
•    La representación del nuevo tipo de dato está oculta de las unidades de programa que lo utilizan.
1.6. TIPOS ABSTRACTOS DE DATOS
Un tipo de dato definido por el programador se denomina tipo abstracto de datos (TAD). Es un tipo que consta de datos (estructuras de datos propias) y operaciones que se pueden realizar sobre esos datos. La estructura de un tipo abstracto de dato, desde un punto de vista global, se compone de la interfaz y de la implementación. La estructura de un tipo abstracto de dato, desde un punto de vista global, se compone de la interfaz y de la implementación.
Los algoritmos utilizados para implementar cada una de las operaciones de los TAD están encapsuladas dentro de los propios TAD.
Las unidades de programación de lenguajes que pueden implementar un TAD reciben distintos nombres:
Modula-2 módulo
Ada paquete
1.6.1. Ventajas de los tipos abstractos de datos
Permite una mejor conceptualización y modelización (modelado) del mundo real. Mejora la representación y la comprensibilidad.
Mejora la robustez del sistema.
Mejora el rendimiento. Para sistemas tipificados, el conocimiento de los objetos permite la optimización de tiempo de compilación.
Separa la implementación de la especificación. Permite la modificación y mejora de la implementación sin afectar al interfaz público.
Permite la extensibilidad del sistema. Los componentes de software reutilizables son más fáciles de crear y mantener.
Recoge mejor la semántica del tipo. Los tipos abstractos de datos agrupan o localizan las operaciones y la representación de atributos.
1.6.2. Especificación de los TAD
El objetivo de la especificación es describir el comportamiento del TAD; consta de dos partes, la descripción matemática del conjunto de datos, y de las operaciones definidas en ciertos elementos de ese conjunto de datos, puede tener un enfoque informal, éste describe los datos y las operaciones relacionadas en lenguaje natural o formal, supone suministrar un conjunto de axiomas que describen las operaciones en su aspecto sintáctico y semántico.
1.7. PROGRAMACIÓN ESTRUCTURADA
La programación orientada a objetos se desarrolló para tratar el problema de que cuando los programas se vuelven muy grandes, el programador tiene muchas dificultades para controlar ese gran número de instrucciones. Para resolver este problema los programas se descompusieron en unidades más pequeñas que adoptaron el nombre de funciones. De este modo un programa orientado a procedimientos se divide en funciones, de modo que cada función tiene un propósito bien definido y resuelve una tarea concreta, y se diseña una interfaz, para su comunicación con otras funciones.
Las dos razones más evidentes de los programas estructurados para resolver problemas complejos son:
las funciones tienen acceso ilimitado a los **datos globales**.
las funciones inconexas y datos, fundamentos del paradigma procedimental, proporcionan un modelo pobre del mundo real.
1.7.1. Datos locales y datos globales
Existen dos tipos de datos en los programas procedimentales, los datos locales que son ocultos en el interior de la función y solo pueden ser utilizados por la función, y los datos globales a los cuales se puede acceder desde cualquier función del programa.
globales en un programa procedimental. Un programa grande (Figura 1.4) se compone de numerosas funciones y datos globales y ello conlleva una multitud de conexiones entre funciones y datos. y lectura. Todas estas conexiones múltiples originan diferentes problemas, hacen difícil diseñar la estructura del programar, el programa es difícil de modificar ya qué cambios en datos globales pueden necesitar la reescritura de todas las funciones que acceden a ellos.
1.7.2. Modelado del mundo real
Un problema importante de la programación estructurada es que la disposición separada de datos y funciones no se corresponden con los modelos de las cosas del mundo real. Los objetos complejos o no del mundo real tienen atributos y comportamiento.
Los atributos o características de los objetos son, por ejemplo: en las personas, su edad, su profesión, su domicilio.
El comportamiento son las acciones que ejecutan los objetos del mundo real como respuesta a un determinado estímulo.
Al contrario que la programación procedimental que enfatiza en los algoritmos, la POO enfatiza en los datos. En lugar de intentar ajustar un problema al enfoque procedimental de un lenguaje, POO intenta ajustar el lenguaje al problema. La idea es diseñar formatos de datos que se correspondan con las características esenciales de un problema. La idea fundamental de los lenguajes orientados a objetos es combinar en una única unidad o módulo, tanto los datos como las funciones que operan sobre esos datos. Tal unidad se llama objeto.
1.8.1. Propiedades fundamentales de la orientación a objetos
• Abstracción (tipos abstractos de datos y clases).
• Encapsulado o encapsulamiento de datos.
• Ocultación de datos.
• Abstracción: a propiedad de los objetos que consiste en tener en cuenta sólo los aspectos más importantes y no tener en cuenta los restantes aspectos.
• Encapsulación y ocultación de datos: proceso de agrupar datos y operaciones relacionadas bajo la misma unidad de programación.
El diseño de un programa orientado a objetos contiene, al menos, los siguientes pasos:
Identificar los objetos del sistema.
Agrupar en clases a todos los objetos que tengan características y comportamiento comunes.
Identificar los datos y operaciones de cada una de las clases.
Identificar las relaciones que pueden existir entre las clases.
• Herencia: Permite compartir información entre dos entidades evitando la redundancia (nos permite no tener que repetir código de manera innecesaria). La herencia permite definir nuevas clases a partir de otras clases ya existentes, de modo que presentan las mismas características y comportamiento de éstas, así como otras adicionales.
• Polimorfismo: Propiedad de que un operador o una función actúen de modo diferente en función del objeto sobre el que se aplican. Es aquella en que una operación tiene el mismo nombre en diferentes clases, pero se ejecuta de diferentes formas en cada clase.

References: resolución 
 resolución 
 resolución 
 resolución 

Resolución 
 resolución 
 RESOLUCIÓN