viernes, 9 de diciembre de 2011

Notas finales

Estimados estudiantes:Ante todo agradecerles por la experiencia academica compartida a través del proceso de enseñanza aprendizaje desarrollado en el trascurso del semestre.
Felicitar a los aprobados y enviar animos a los reprobados para que se suban a la senda de la lectura y una mayor dedicación.
Felices fiestas de fin de año y que el nacimiento del niño Jesús renueve en nosotros las esperanzas de dóas mejores.
Atte.
Guillermo Choque Aspiazu PhD.
http://menteerrabunda.blogspot.com/


lunes, 5 de diciembre de 2011

Notas parciales

Notas de las pruebas parciales y de las practicas de taller.

miércoles, 30 de noviembre de 2011

Taller 14

El secreto de la educación es enseñar a la gente de tal manera que no se den cuenta de que están aprendiendo hasta que es demasiado tarde.” Harold E. Edgerton.


1. Diseñe una clase que permita conocer el resultado de una elección de alcalde con base en los siguientes datos: El candidato A tiene el 35% de los votos validos, el candidato B tiene el 12% de los votos validos y el candidato C tiene el 42% de votos validos. Los votos en blanco corresponden al resto de los votos validos. Los votos totales son X y el 78% de estos votos son validos.

2. Dados A, B, C y D que corresponden a medidas de trozos de madera diseñe una clase que determine si se puede construir una mesa de: 2 patas, 3 patas y 4 patas.

3. El dueño de un hotel solicita desarrollar un pequeño sistema, compuesto por un diagrama de clases, casos de uso y secuencias, para consultar sobre las piezas disponibles y reservar piezas de su hotel. El hotel posee tres tipos de piezas: simple, doble y matrimonial, y dos tipos de clientes: habituales y esporádicos. Una reservación almacena datos del cliente, de la pieza reservada, la fecha de comienzo y el número de días que será ocupada la pieza. El recepcionista del hotel debe hacer las siguientes operaciones: (1) Obtener un listado de las piezas disponible de acuerdo a su tipo. (2) Preguntar por el precio de una pieza de acuerdo a su tipo. (3) Preguntar por el descuento ofrecido a los clientes habituales. (4) Preguntar por el precio total para un cliente dado, especificando su número de NIT, tipo de pieza y número de noches. (5) Dibujar en pantalla la foto de una pieza de acuerdo a su tipo. (6) Reservar una pieza especificando el número de la pieza, NIT y nombre del cliente. (7) Eliminar una reserva especificando el número de la pieza. El administrador puede usar el programa para: (1) Cambiar el precio de una pieza de acuerdo a su tipo. (2) Cambiar el valor del descuento ofrecido a los clientes habituales. (3) Calcular las ganancias que tendrán en un mes especificado (considere que todos los meses tienen treinta días). (4) El hotel posee información sobre cuales clientes son habituales. Esta estructura puede manejarla con un diccionario, cuya clave sea el número de NIT y como significado tenga los datos personales del cliente. El diseño a desarrollar debe facilitar la extensibilidad de nuevos tipos de pieza o clientes y a su vez permitir agregar nuevas consultas.

NOTA
Las respuestas a este taller deben ser enviadas en formato .doc a la dirección de correo electrónico: saguicas@yahoo.com.mx, en el asunto debe indicar Taller 14 ADS, en el cuerpo debe incluirse los nombres, apellidos, número de cedula de identidad y dirección de mail de cada uno de los integrantes de grupo. El documento de respuestas debe acompañarse como documento adjunto.

Notas hasta 2do parcial

miércoles, 23 de noviembre de 2011

Taller 13

El objeto de la educación es formar seres aptos para gobernarse a sí mismos, y no para ser gobernados por los demás.” Herbert Spencer.

1. Realice un análisis y diseño básico orientado a objetos empleando los siguientes diagramas del Lenguaje de Modelado Unificado: (1) Diagrama de casos de uso. (2) Diagrama de clases y (3) Diagrama de secuencias. Aplique dichos diagramas a los procesos elementales de inventario y facturación a la tienda de compra y venta de teléfonos celulares “Androide”. Considere el conjunto de documentos generados en talleres anteriores.

2. Escriba un mapa mental del siguiente conjunto de diapositivas: Zuloaga Rotta Luis (2002) Análisis y diseño orientado a objetos con UML (Parte II). Disponible en línea: http://www.galeon.com/zuloaga/Doc/UML02.pdf

NOTA
Las respuestas a este taller deben ser enviadas en formato .doc a la dirección de correo electrónico: saguicas@yahoo.com.mx, en el asunto debe indicar Taller 13 ADS, en el cuerpo debe incluirse los nombres, apellidos, número de cedula de identidad y dirección de mail de cada uno de los integrantes de grupo. El documento de respuestas debe acompañarse como documento adjunto.

Analisis y diseño orientado a objetos

VINCULOS
Libro: Larman Craig (2000) UML y Patrones. McGrawHill. Disponible en línea: https://rs327l33.rapidshare.com/#!download327tl5174990606UML_y_Patrones__Craig_Larman_.rar31480R~A8DCCB736331676A4760803A6054C1DB00

Libro: Alarcón Raúl ( ) Diseño Orientado a Objetos con UML. Grupo Eidos. Disponible en línea: http://depositfiles.com/files/e7enpzls7

Curso: Análisis y Diseño Orientado a Objetos con UML. Disponible en línea: http://login.osirislms.com/offline/uml/index.htm

Diapositivas: Metodología orientada a objetos. Análisis Orientado a Objetos. Disponible en línea: www.oocities.org/es/marthidalgolivo/curso.ppt

Diapositivas: Hernández H. Domingo. Introducción al UML. Escuela de Ingeniería de Sistemas Departamento de computación. Disponible en línea: www.magma.com.ni/~jorge/upoli_uml/refs/Introducion_UML.pdfSimilares

Diapositivas: Introducción al Análisis y Diseño Orientado a Objetos. Tema 3. Disponible en línea: http://astreo.ii.uam.es/~jlara/TACCII/4_ADOO.pdf

Diapositivas: Zuloaga Rotta Luis (2002) Análisis y diseño orientado a objetos con UML (Parte I). Disponible en línea: http://www.galeon.com/zuloaga/Doc/UML01.pdf

Diapositivas: Zuloaga Rotta Luis (2002) Análisis y diseño orientado a objetos con UML (Parte II). Disponible en línea: http://www.galeon.com/zuloaga/Doc/UML02.pdf

miércoles, 16 de noviembre de 2011

Taller 12

Son vanas y están plagadas de errores las ciencias que no han nacido del experimento, madre de toda certidumbre.” Leonardo Da Vinci

1. Desarrollar un conjunto de clases que representen figuras geométricas sencillas como triángulo, rectángulo, polígono en general, basándose en una clase genérica PUNTO y si es necesario en clases predefinidas como arrays o listas. Debe ser posible desplazar la figura, imprimir sus vértices, calcular el perímetro, etc.

2. Elaborar una clase RACIONAL que modele los números racionales implementando al menos las operaciones de suma, resta, opuesto e inverso de un número racional a imitación de la suma o resta de los números reales o enteros.

3. Establecer una clase COMPLEJO que modele los números complejos implementando al menos las operaciones de suma, resta y módulo de un número complejo a imitación de la suma o resta de los números reales o enteros.

4. Elaborar una clase POLINOMIO que modele los polinomios de grado dos implementando al menos las operaciones de suma (de un polinomio para obtener un tercer polinomio) y producto por un número y el cálculo de las raíces reales del polinomio, si es que existen.

5. Escribir una clase RELOJ que simule el comportamiento de un cronómetro digital (con las características puesta_a_cero, incremento, etc.). Cuando el contador llegue a 23:59:59 y reciba el mensaje de incremento deberá pasar a 00:00:00.

6. Un cerrojo con combinación tiene las siguientes propiedades básicas: la combinación (una secuencia de tres números) está oculta; el cerrojo se puede abrir proporcionando la combinación; y la combinación se puede cambiar, pero solamente por alguien que conoce la combinación actual. Diseñe una clase con métodos públicos abrir y cambiarComb, y atributos privados para almacenar la combinación. La combinación debería asignarse en el constructor.

7. Establezca una jerarquía de clases que represente a los estudiantes de una universidad sabiendo que todos los estudiantes se caracterizan por un nombre y un número. Hay varios tipos de estudiantes: los estudiantes ocasionales, sean de cursos de verano o de cursos específicos (se matriculan de un curso determinado), los que cursan primer ciclo de una titulación, los que cursan segundo ciclo y los de tercer ciclo. Además, la universidad imparte cursos de especialización gratuitos para sus empleados.

8. Escriba una clase, triángulo, que represente un triángulo. La clase debe incluir los siguientes métodos que devuelven un valor lógico indicando el tipo del triángulo: (1) es_rectangulo (para triángulos rectángulos). (2) es_escaleno (todos los lados distintos) (3) es_isosceles (dos lados iguales y el otro distinto) (4) es_equilatero (los tres lados iguales).

9. Construya una estructura de clases que represente una serie de personas caracterizadas por el nombre (compuesto de nombre de pila y dos apellidos) y el número de cédula de identidad. Debe ser posible imprimir los datos completos de una persona y devolver el nombre o cédula de identidad independientemente.

10. ¿Cuál es el resultado del siguiente programa?
class Alcance {
public static void main (String [ ] args) {
int i=3;
int j=4;
System.out.println ("j: "+j);
System.out.println ("i: "+i);
}
}

NOTA
Las respuestas a este taller deben ser enviadas en formato .doc a la dirección de correo electrónico: saguicas@yahoo.com.mx, en el asunto debe indicar Taller 12 ADS, en el cuerpo debe incluirse los nombres, apellidos, número de cedula de identidad y dirección de mail de cada uno de los integrantes de grupo. El documento de respuestas debe acompañarse como documento adjunto.

Orientación a objetos

1. INTRODUCCION
Las personas viven en un mundo de objetos. Estos objetos existen en la naturaleza, en entidades hechas por el hombre, en los negocios y en los productos que se utilizan. Pueden ser clasificados, descritos, organizados, combinados, manipulados y creados. Por eso no es sorprendente que se proponga una visión orientada a objetos para la creación de software de computadora, una abstracción que modela el mundo de forma tal que ayuda a entenderlo y gobernarlo mejor.

La primera vez que se propuso un enfoque orientado a objetos para el desarrollo de software fue a finales de los años sesenta. Sin embargo, las tecnologías de objetos han necesitado casi veinte años para llegar a ser ampliamente usadas. Durante los años 1990, la ingeniería del software orientada a objetos se convirtió en el paradigma de elección para muchos productores de software y para un creciente número de sistemas de información y profesionales de la ingeniería.

Las tecnologías de objetos llevan a reutilizar, y la reutilización, especialmente de los componentes de software, lleva a un desarrollo de software más rápido y a programas de mejor calidad. El software orientado a objetos es más fácil de mantener debido a que su estructura es inherentemente poco acoplada. Esto lleva a menores efectos colaterales cuando se deben hacer cambios. Los sistemas orientados a objetos son más fáciles de adaptar y escalar, es decir pueden crearse grandes sistemas ensamblando subsistemas reutilizables.

Hacia mediados de los años 1980, los beneficios de la programación orientada a objetos empezaron a obtener reconocimiento, y el diseño de objetos pareció ser un enfoque sensato para la gente que deseaba utilizar el lenguaje de programación orientada a objetos. Un enfoque orientado a objetos ofrece muchos beneficios sobre un enfoque estructurado.

El análisis orientado a objetos y su diseño se enfoca en los objetos. Los objetos tienen ciertos comportamientos y atributos que determinan la manera en que interactúan y funcionan. No se intenta proporcionar un orden para las acciones al momento del diseño debido a que los objetos funcionan basados en la manera en que funcionan otros objetos. La programación orientada a objetos ayuda a los desarrolladores a crear objetos que reflejan escenarios del mundo real.

La implementación orientada a objetos oculta datos, lo cual significa que se muestra únicamente el comportamiento a los usuarios y se oculta el código subyacente de un objeto. Los comportamientos que el programador expone son únicamente aquellos elementos que el usuario de un objeto puede afectar.

El enfoque orientado a objetos permite que los objetos estén auto-contenidos. Los objetos existen por sí mismos, con una funcionalidad para invocar comportamientos de otros objetos. Al utilizar un enfoque orientado a objetos, los desarrolladores pueden crear aplicaciones que reflejan objetos del mundo real, como rectángulos, elipses y triángulos, además de dinero, números de partes y elementos en un inventario.

En un enfoque orientado a objetos, los objetos, por definición, son modulares en su construcción. Esto quiere decir que son entidades completas y, por lo tanto, tienden a ser altamente reutilizables. Las aplicaciones orientadas a objetos se construyen sobre el paradigma de los mensajes o de los eventos en donde los objetos envían mensajes a otros objetos.

2. PARADIGMA ORIENTADO A OBJETOS
Durante muchos años el término Orientado a Objetos se usó para referirse a un enfoque de desarrollo de software que utilizaba alguno de los lenguajes orientados a objetos: Ada 95, C++, Eiffel, Smalltalk, etc. Thomas Khun describe un paradigma como un conjunto de teorías, estándares y métodos que juntos representan un medio de organización del conocimiento: es decir, un medio de visualizar el mundo. En este sentido, la orientación a objetos es un nuevo paradigma. La orientación a objetos obliga a repensar acerca del rol que juega la computación, sobre lo que significa realizar computación y sobre cómo se estructura la información al interior de la computadora.

Jenkins y Glasgow observan que “la mayoría de los programadores trabajan en un lenguaje y utilizan sólo un estilo de programación. Ellos programan en un paradigma forzado por el lenguaje que utilizan. Con frecuencia, no se enfrentan a métodos alternativos de resolución de un problema, y por consiguiente tienen dificultad en ver la ventaja de elegir un estilo más apropiado al problema a manejar”. Bobrow y Stefik sugieren que existen cuatro clases de estilos de programación: (1) Orientados a procedimientos. Que utilizan algoritmos. (2) Orientados a objetos. Con clases y objetos. (3) Orientados a lógica. Expresado en cálculo de predicados. (4) Orientados a reglas. Con el uso de reglas si-entonces. No existe ningún estilo de programación idóneo para todas las clases de programación. La orientación a objetos se acopla a la simulación de situaciones del mundo real.

3. ORIENTACIÓN A OBJETOS
La orientación a objetos puede describirse como el conjunto de disciplinas que desarrollan y modelan software que facilitan la construcción de sistemas complejos a partir de componentes.

El atractivo intuitivo de la orientación a objetos es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible. Estos conceptos y herramientas orientados a objetos son tecnologías que permiten que los problemas del mundo real sean expresados de modo fácil y natural.

Las técnicas orientadas a objetos proporcionan mejoras y metodologías para construir sistemas de software complejos a partir de unidades de software modularizado y reutilizable. Se necesita un nuevo enfoque para construir software en la actualidad. Este nuevo enfoque debe ser capaz de manipular tanto sistemas grandes como pequeños y debe crear sistemas fiables que sean flexibles, mantenibles y capaces de evolucionar para cumplir las necesidades del cambio.

La orientación a objetos trata de cubrir las necesidades de los usuarios finales, así como las propias de los desarrolladores de productos software. Estas tareas se realizan mediante la modelización del mundo real. El soporte fundamental es el modelo objeto.

Un objeto es la instancia de una clase. Una clase es la representación abstracta de un concepto en el mundo real, y proporciona la base a partir de la cual se crean instancias de objetos específicos. Como ejemplo, puede crear una clase que defina a un cliente. Después puede crear una nueva instancia de la clase cliente para tener un objeto utilizable de Cliente. Para poder crear un objeto de la clase cliente, debe crear una nueva instancia basada en esa clase. Por ejemplo:

Private ObjetoCustomer as ClaseCustomer
ObjetoCustomer = New ClaseCustomer()


Cada objeto es un elemento único de la clase en la que se basa. Si una clase es como un molde, entonces un objeto es lo que se crea a partir del molde. La clase es la definición de un elemento; el objeto es el elemento. El molde para una figura de cerámica en particular, es como una clase; la figura es el objeto.

Todos los objetos están compuestos de tres elementos: (1) Interfaz. La Interfaz es el conjunto de métodos, propiedades, eventos y atributos que se declaran como públicos en su alcance y que pueden invocar los programas escritos para usar los objetos. (2) Implementación. Al código dentro de los métodos se le llama Implementación. Algunas veces también se le llama comportamiento, ya que este código es el que efectivamente logra que el objeto haga un trabajo útil. Es importante entender que las aplicaciones del cliente pueden utilizar los objetos creados aunque se cambie la implementación, siempre que no se cambie la interfaz. Siempre que se mantengan sin cambio el nombre de método, su lista de parámetro y el tipo de datos de devolución, se podrá cambiar la implementación totalmente. (3) Estado. El estado o los datos de un objeto es lo que lo hace diferente de otros objetos de la misma clase. El estado se describe a través de las variables del “elemento miembro” o de la “instancia”. Las variables del miembro son aquellas declaradas, de tal manera que están disponibles para todo el código dentro de la clase. Por lo general, las variables del miembro son privadas en su alcance. Algunas veces, se les conoce como variables de la instancia o como atributos. Observe que las propiedades no son variables del miembro, ya que son un tipo de método que funciona para recuperar y establecer valores.

3.1. Clase
Una clase es esencialmente un proyecto, a partir del cual puede crear objetos. Una clase define las características de un objeto, incluyendo las propiedades que definen los tipos de datos que ese objeto puede contener y los métodos que describen el comportamiento del objeto. Estas características determinan la manera en que otros objetos pueden acceder y trabajar con los datos que se incluyen en el objeto.

Para definir una clase, se coloca la palabra clave Class antes del nombre de su clase, y después se insertan los miembros de la clase (datos y métodos) entre la definición del nombre de la clase y la instrucción End Class. Si incluye los métodos, entonces el código de cada método también se debe incluir entre la declaración del método y el final del mismo.

Por ejemplo, si desea construir objetos que representen perros, puede definir una clase Perro con ciertos comportamientos, como caminar, ladrar y comer, y propiedades específicas, como altura, peso y color. Una vez que haya definido la clase Perro, puede crear objetos con base en esa clase. Es importante observar que todos los objetos Perro creados con base en la clase perro compartirán los mismos comportamientos, pero tendrán sus propios valores específicos para el mismo conjunto de propiedades.

El siguiente ejemplo representa la definición de la clase Perro. Tome en consideración que ésta no es una sintaxis estricta de VB.NET; simplemente es un ejemplo de la definición de clase.

Public Class Perro
Dim Altura As Decimal
Dim Peso As Decimal
Dim Color As String

Sub Caminar(ByVal Pasos As Integer)
End Sub

Sub Ladrar()
End Sub

Sub Comer()
End Sub
End Class


El siguiente ejemplo define una nueva clase, Persona, con dos partes de información relevante asociadas: el nombre de la persona, su fecha de nacimiento y un Método que calcula la edad de la persona. A pesar de que la clase Persona se define en el ejemplo, no existe aún el objeto Persona. Deberán ser creados.

Public Class Persona
Private mstrNombre As String
Private mdtFechaNacimiento As Date

Public Function Edad() As Integer
Return DateDiff(DateInterval.Year, mdtFechaNacimiento, Now())
End Function
End Class


Una clase es un tipo definido por el usuario en contraposición a un tipo proporcionado por el sistema. Al definir una clase, en realidad crea un nuevo tipo en su aplicación. Los elementos o propiedades más importantes de este modelo son: (1) Abstracción. (2) Encapsulamiento. (3) Modularidad. (4) Jerarquía. (5) Polimorfismo. Como sugiere Booch, si alguno de estos elementos no existe se dice que el modelo no es orientado a objetos.

3.2. Abstracción
La abstracción es uno de los medios más importantes, mediante el cual las personas se enfrentan con la complejidad inherente al software. La abstracción es la propiedad que permite representar las características esenciales de un objeto, sin preocuparse de las restantes características, no esenciales. Abstracción es la técnica de quitarle a una idea o a un objeto todos los acompañamientos innecesarios hasta que los deja en una forma esencial y mínima. Una buena abstracción elimina todos los detalles poco importantes y le permite enfocarse y concentrarse en los detalles importantes.

Una abstracción se centra en la vista externa de un objeto, de modo que sirva para separar el comportamiento esencial de un objeto de su implementación. Definir una abstracción significa describir una entidad del mundo real, no importa lo compleja que pueda ser y, a continuación, utilizar esta descripción en un programa.

El elemento clave de la programación orientada a objetos es la clase. Una clase se puede definir como una descripción abstracta de un grupo de objetos, cada uno de los cuales se diferencia por su estado específico y por la posibilidad de realizar una serie de operaciones. Por ejemplo, una pluma estilográfica es un objeto que tiene un estado, llena de tinta o vacía, y sobre la cual se pueden realizar algunas operaciones: escribir, poner o quitar la tapa, llenar de tinta si está vacía, etc.

La idea de escribir programas definiendo una serie de abstracciones no es nueva, pero el uso de clases para gestionar dichas abstracciones en lenguajes de programación ha facilitado considerablemente su aplicación.

La abstracción es un principio de software importante. Una clase bien diseñada expone un conjunto mínimo de métodos cuidadosamente considerados que proporcionan el comportamiento esencial de una clase en una forma fácil de usar. Crear buenas abstracciones de software no es fácil. Encontrar buenas abstracciones generalmente requiere de un entendimiento muy claro del problema y de su contexto, gran claridad de pensamiento y amplia experiencia.

Existe un principio muy importante relacionado con la abstracción, y esta es, la Dependencia mínima. Las mejores abstracciones de software hacen que las cosas complejas sean simples. Logran esto al ocultar por completo los aspectos no esenciales de una clase. Estos aspectos no esenciales, una vez que han sido debidamente ocultados, no se pueden ver, ni usar, ni depender de ellos. Este principio de dependencia mínima es lo que hace que la abstracción sea tan importante. El cambio es normal en el desarrollo de software. Lo mejor que puede hacer es minimizar el impacto de un cambio cuando éste sucede. Y cuanto menos dependa de algo, menos se verá afectado cuando cambie.

3.3. Encapsulamiento
El encapsulamiento o encapsulación es la propiedad que permite asegurar que el contenido de la información de un objeto está oculta al mundo exterior: el objeto A no conoce lo que hace el objeto B, y viceversa. La encapsulación, conocida también como ocultación de la información, en esencia, es el proceso de ocultar todos los secretos de un objeto que no contribuyen a sus características esenciales.

La encapsulación permite la división de un programa en módulos. Estos módulos se implementan mediante clases, de forma que una clase representa la encapsulación de una abstracción. En la práctica, esto significa que cada clase debe tener dos partes: una interfaz y una implementación. La interfaz de una clase captura sólo su vista externa y la implementación contiene la representación de la abstracción, así como los mecanismos que realizan el comportamiento adecuado.

Encapsulación es la capacidad de contener y controlar el acceso a un grupo de elementos asociados. Las clases proporcionan una de las formas más comunes para encapsular elementos. En el siguiente ejemplo, la clase BankAccount encapsula los métodos, campos y propiedades que se describen en una cuenta bancaria. Sin una encapsulación, se necesitaría declarar procedimientos y variables por separado para almacenar y administrar información para la cuenta bancaria, y sería difícil trabajar con más de una cuenta bancaria a la vez. La encapsulación le permite utilizar los datos y procedimientos en la clase BankAccount como una unidad. Se puede trabajar con varias cuentas bancarias al mismo tiempo sin confusión, debido a que cada cuenta está representada por una instancia única de la clase.

La encapsulación también le permite controlar la forma en que se utilizan los datos y los procedimientos. Puede utilizar modificadores de acceso, como Private o Protected, para evitar que los procedimientos externos ejecuten métodos de clase o lean y modifiquen datos en propiedades y campos. Usted debe declarar los detalles internos de una clase como Private para evitar que sean utilizados fuera de su clase; a esta técnica se le llama ocultamiento de datos. En la clase BankAccount, la información del cliente, como el saldo de la cuenta, se protege de esta forma. Una de las reglas básicas de la encapsulación es que los datos de la clase sólo se pueden modificar o recuperar a través de los procedimientos o métodos Property. Ocultar los detalles de implementación de sus clases evita que se usen de maneras no deseadas, y le permite modificar esos elementos posteriormente sin riesgo de tener problemas de compatibilidad. Por ejemplo, versiones posteriores de la clase BankAccount enlistadas más adelante, podrían cambiar el tipo de datos del campo AccountBalance sin peligro de dañar la aplicación que depende de que este campo tenga un tipo de dato específico.

Class BankAccount
Private AccountNumber As String
Private AccountBalance As Decimal
Private HoldOnAccount As Boolean = False
Public Sub PostInterest()
' Add code to calculate the interest for this account.
End Sub
ReadOnly Property Balance() As Decimal
Get
Return AccountBalance 'Returns the available balance.
End Get
End Property
End Class


3.4. Modularidad
La modularidad es la propiedad que permite subdividir una aplicación en partes más pequeñas, llamadas módulos, cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes.

La modularización consiste en dividir un programa en módulos que se puedan compilar por separado, pero que tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la modularidad de diversas formas.

La modularidad es la propiedad de un sistema que permite su descomposición en un conjunto de módulos cohesivos y débilmente acoplados. Por supuesto no todos los módulos son iguales: tomar un programa monolítico y separarlo de forma aleatoria en archivos no es óptimo. Se debe tener en cuenta los conceptos asociados de dependencia, acoplamiento, cohesión, interfaz, encapsulación y abstracción. Una vez identificado lo que es un buen módulo, se puede contemplar la reutilización de un buen módulo como componente.

El módulo A depende del módulo B si cualquier cambio en el módulo B implica que el módulo A también tenga que ser modificado. A veces se dice que el módulo A es un cliente del módulo B, o que el módulo B actúa como servidor del módulo A. En general, es normal que un mismo módulo sea tanto cliente como servidor. Esto significa, que depende de algunos módulos, mientras que otros módulos dependen de él. Incluso es posible que un par de módulos se tengan uno al otro de cliente; sin embargo, éste es un ejemplo de dependencia circular, que debe evitarse cuando sea posible debido a que impide la reutilización.

La dependencia a veces se conoce como acoplamiento. Un sistema con muchas dependencias tiene fuerte acoplamiento. Los buenos sistemas tienen débil acoplamiento, porque en ese caso los cambios en una parte del sistema son menos probables de propagarse a través del sistema.

Los módulos correctos a menudo tienen la propiedad de que sus interfaces proporcionan una abstracción de algún elemento conocido de manera intuitiva que puede, no obstante, ser difícil de implementar. Este tipo de módulos se dice que tienen una fuerte cohesión. El módulo realiza un conjunto coherente de cosas, pero dentro de lo posible el desarrollador del cliente está protegido de la información irrelevante relativa a cómo el módulo hace lo que hace.

Resumiendo se puede decir que la abstracción se produce cuando el cliente de un módulo no necesita saber más de lo que hay en la interfaz. Encapsulación es cuando un cliente de un módulo no es capaz de saber más de lo que hay en la interfaz. Si un módulo, de cualquier tamaño y complejidad, es una buena abstracción, tiene fuerte cohesión y débil acoplamiento, puede ser factible reutilizarlo en sistemas posteriores, o sustituirlo en el sistema existente.

3.5. Jerarquía
La jerarquía es una propiedad que permite la ordenación de las abstracciones. Las dos jerarquías más importantes de un sistema complejo son: estructura de clases (jerarquía “es-un” (is-a): generalización/especialización) y estructura de objetos (jerarquía “parte-de” (part-of): agregación).

Las jerarquías de generalización/especialización se conocen como herencia. Básicamente, la herencia define una relación entre clases, en donde una clase comparte la estructura o comportamiento definido en una o más clases, herencia simple y herencia múltiple, respectivamente.

La agregación es el concepto que permite el agrupamiento físico de estructuras relacionadas lógicamente. Así, un camión se compone de ruedas, motor, sistema de transmisión y chasis; en consecuencia, camión es una agregación, y ruedas, motor, transmisión y chasis son agregados de camión.

3.6. Polimorfismo
La quinta propiedad significativa de la orientación a objetos es el polimorfismo. Es la propiedad que indica, literalmente, la posibilidad de que una entidad tome muchas formas. En términos prácticos, el polimorfismo permite referirse a objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma operación de diferentes formas, según sea el objeto que se referencia en ese momento.

Por ejemplo, cuando se describe la clase mamíferos se puede observar que la operación comer es una operación fundamental en la vida de los mamíferos, de modo que cada tipo de mamífero debe poder realizar la operación o función comer. Por otra parte, una cabra o una vaca que pastan en un campo, un niño que se come un caramelo y un león que devora a otro animal, son diferentes formas que utilizan diferentes mamíferos para realizar la misma función comer.

El polimorfismo adquiere su máxima expresión en la derivación o extensión de clases, es decir, cuando se obtiene una clase a partir de una clase ya existente, mediante la propiedad de derivación de clases o herencia.

El polimorfismo requiere ligadura tardía o postergada, también llamada dinámica, y esto sólo se puede producir en lenguajes de programación orientados a objetos. Los lenguajes no orientados a objetos soportan ligadura temprana o anterior, también llamada estática, esto significa que el compilador genera una llamada a un nombre específico de función y el enlazador (linker) resuelve la llamada a la dirección absoluta del código que se ha de ejecutar. En la orientación a objetos, el programa no puede determinar la dirección del código hasta el momento de la ejecución. Cuando se envía un mensaje a un objeto, el código que se llama no se determina hasta el momento de la ejecución. El compilador asegura que la función existe y realiza verificación de tipos de los argumentos y del valor de retorno, pero no conoce el código exacto a ejecutar.

La orientación a objetos beneficia a los desarrolladores debido a que: (1) Los programas son fáciles de diseñar debido a que los objetos reflejan elementos del mundo real. (2) Las aplicaciones son más sencillas para los usuarios debido a que los datos innecesarios están ocultos. (3) Los objetos son unidades autocontenidas. (4) La productividad se incrementa debido a que puede reutilizar el código. (5) Los sistemas son fáciles de mantener y se adaptan a las cambiantes necesidades de negocios. (6) Es más fácil crear nuevos tipos de objetos a partir de los ya existentes. (6) Simplifica los datos complejos. (7) Reduce la complejidad de la transacción. (8) Confiabilidad. (9) Robustez. (10) Capacidad de ampliación.

3.7. Otras propiedades
El modelo objeto ideal no sólo tiene las propiedades anteriormente citadas sino que es conveniente que soporte, además, estas otras propiedades:
a) Concurrencia (multitarea). El lenguaje soporta la creación de procesos paralelos independientes del sistema operativo. Esta propiedad simplificará la transportabilidad de un sistema de tiempo real de una plataforma a otra.
b) Persistencia. Los objetos deben poder ser persistentes; es decir, los objetos han de permanecer después de la ejecución del programa.
c) Genericidad. Las clases parametrizadas, mediante plantillas o unidades genéricas, sirven para soportar un alto grado de reutilización. Estos elementos genéricos se diseñan con parámetros formales, que se instanciarán con parámetros reales, para crear instancias de módulos que se compilan y enlazan, y ejecutan posteriormente.
d) Manejo de Excepciones. Se deben detectar, informar y manejar condiciones excepcionales utilizando construcciones del lenguaje. Esta propiedad añadida al soporte de tolerancia a fallos del software permitirá una estrategia de diseño eficiente.

4. TAXONOMÍA DE LENGUAJES ORIENTADOS A OBJETOS
Una taxonomía de lenguajes de programación con propiedades de orientación a objetos fue creada por Wegner. La clasificación incluye los siguientes grupos: (1) Basado en objetos. Un lenguaje de programación es basado en objetos si su sintaxis y semántica soportan la creación de objetos que tienen las propiedades descritas en el punto anterior. Por ejemplo: Ada-83, Clipper 5.2, Visual Basic 4/5/6. (2) Basado en clases. Si un lenguaje de programación es basado en objetos y soporta además la creación de clases, se considera basado en clases. Por ejemplo: Clu. (3) Orientación a objetos. Un lenguaje de programación orientado a objetos es un lenguaje basado en clases que soporta también herencia. Por ejemplo: Visual Basic .NET, C# .NET, C++, Java, Delphi, Eiffel, Simula.

5. CONCEPTOS ORIENTADOS A OBJETOS
Coad y Yourdon definen el término orientación a objetos de la siguiente forma:
Orientación a Objetos = objetos + clasificación + herencia + comunicación

5.1. Clases y Objetos
Un modelo orientado a objetos de software de computadora debe exhibir abstracciones de datos y procedimientos que conducen a una modularidad eficaz. Una clase es un concepto orientado a objetos que encapsula las abstracciones de datos y procedimientos que se requieren para describir el contenido y comportamiento de alguna entidad del mundo real.

Las abstracciones de datos, especialmente los atributos, que describen la clase están encerradas por una “muralla” de abstracciones procedimentales llamadas operaciones, métodos o servicios, capaces de manipular los datos de alguna manera. La única forma de alcanzar los atributos y operar sobre ellos, es ir a través de alguno de los métodos que forman la muralla. Por lo tanto, la clase encapsula datos, al interior de la muralla, y el proceso que manipula los datos, los métodos que componen la muralla. Esto posibilita la ocultación de información y reduce el impacto de efectos colaterales asociados a cambios.

5.2. Atributos
Los atributos están asociados a clases y objetos, y describen la clase o el objeto de alguna manera. Las entidades de la vida real están a menudo descritas con palabras que indican características estables. La mayoría de los objetos físicos tienen características tales como forma, peso, color y tipo de material. Las personas tienen características como fecha de nacimiento, padres, nombre y color de los ojos. Una característica puede verse como una relación binaria entre una clase y cierto dominio.

La “relación” binaria implica que un atributo puede tomar un valor definido por un dominio enumerado. En la mayoría de los casos, un dominio es simplemente un conjunto de valores específicos. Por ejemplo, suponga que una clase Coche tiene un atributo color. El dominio de valores de color es blanco, negro, plata, gris, azul, rojo, amarillo, verde.

Las características, o valores del dominio, pueden aumentarse asignando un valor por defecto, o característica, a un atributo. Por ejemplo, el atributo color tiene el valor por defecto negro. Los valores asignados a los atributos de un objeto hacen a ese objeto ser único.

5.3. Operaciones, métodos y servicios
Un objeto encapsula datos, representados como una colección de atributos, y los algoritmos que procesan estos datos. Estos algoritmos son llamados operaciones, métodos o servicios y pueden ser vistos como módulos en un sentido convencional.

Cada uno de los métodos encapsulados por un objeto proporciona una representación de uno de los comportamientos del objeto. Por ejemplo, el método DeterminarColor para el objeto Coche extraerá el color almacenado en el atributo color. La consecuencia de la existencia de ese método es que la clase coche ha sido diseñada para recibir un estímulo, mensaje, que requiere el color de una instancia particular de una clase. Cada vez que un objeto recibe un estímulo, éste inicia un cierto comportamiento, que puede ser tan simple como determinar el color del coche o tan complejo como la iniciación de una cadena de estímulos que se pasan entre una variedad e objetos diferentes. Siempre que un objeto es estimulado por un mensaje, inicia algún comportamiento ejecutando un método.

5.4. Mensajes
Los mensajes son el medio a través del cual interactúan los objetos. Un mensaje estimula la ocurrencia de cierto comportamiento en el objeto receptor. El comportamiento se realiza cuando se ejecuta un método.

Una operación dentro de un objeto emisor genera un mensaje de la forma:
destino.operación (parámetros)
donde destino define al objeto receptor el cual es estimulado por el mensaje, operación se refiere al método que recibe el mensaje y parámetros proporciona información requerida para el éxito de la operación.

Los mensajes proporcionan una visión interna del comportamiento de objetos individuales, y del sistema orientado a objetos como un todo. El paso de mensajes mantiene comunicado un sistema orientado a objetos.

miércoles, 9 de noviembre de 2011

Taler 11

“En lo tocante a la ciencia, la autoridad de un millar no es superior al humilde razonamiento de una sola persona.” Galileo Galilei.

1. Todo sistema exitoso está destinado a sufrir cambios en su tiempo de vida útil. Las categorías de cambios más importantes que se pueden producir son, comúnmente: a) Cambios en la representación de los datos que el sistema manipula. b) Cambios en los algoritmos de procesamiento en busca de mejorar la performance, o debido a la imposición de nuevas fórmulas para calcular un concepto. c) Cambios en la Interfaz con el Usuario. d) Portabilidad del sistema a otras plataformas (hardware, sistema operativo y software de base). e) Adaptación y Extensión para hacerlo más general, en busca de Reusabilidad de componentes (módulos) entre diferentes desarrollos. Discuta cuáles criterios debieran considerarse en cada caso para minimizar, en el futuro, el impacto de tales cambios en un diseño.

2. Aplique el diseño modular a la tienda de compra y venta de teléfonos celulares “Androide”, considerando el conjunto de documentos generados en talleres anteriores. Seleccione al menos una tarea interactiva y al menos una tarea en lotes (batch), y derive los diagramas estructurados correspondientes aplicando análisis de transacción ó transformación según corresponda.

3. Considere un programa que debe emitir los recibos de sueldo de los empleados de una empresa. El sueldo neto de cada empleado se calcula sumando al sueldo básico, las bonificaciones que percibe y descontándole las retenciones obligatorias. El sueldo básico es una función exclusivamente del cargo y la categoría del empleado, mientras que tanto las bonificaciones como las retenciones representan un porcentaje del sueldo básico. En el caso de las retenciones (Seguro de Vida Obligatorio, Jubilación, Obra Social) estos porcentajes son fijos para todos los empleados. En el caso de las bonificaciones por antigüedad, el porcentaje a aplicar depende de la categoría del empleado y su antigüedad. Mientras que en el caso de las bonificaciones por escolaridad, el porcentaje depende del número de hijos en edad escolar que el empleado tenga. Cada recibo contiene un encabezado con el nro. de recibo correspondiente, el nombre de la empresa y su nro. de NIT, el periodo que se abona y la fecha de emisión. Además, se listan los datos del empleado: apellido y nombres, nro. de legajo, carnet, NIT, cargo y categoría del empleado, junto con la fecha de ingreso del mismo. Luego se lista el sueldo básico, y en renglones aparte el detalle de las bonificaciones y retenciones con sus respectivos totales. Finalmente, se lista el sueldo neto. Con lo mencionado construya un Diagrama de Estructura para modelar un programa que emita los recibos de sueldos..

NOTA
Las respuestas a este taller deben ser enviadas en formato .doc a la dirección de correo electrónico: saguicas@yahoo.com.mx, en el asunto debe indicar Taller 11 ADS, en el cuerpo debe incluirse los nombres, apellidos, número de cedula de identidad y dirección de mail de cada uno de los integrantes de grupo. El documento de respuestas debe acompañarse como documento adjunto.

Trabajo semestral

10. TRABAJO PRÁCTICO SEMESTRAL
El objetivo del proyecto semestral es aplicar, en un producto software, los conceptos y principios del análisis y diseño de sistemas a problemas de interés en el área. Cada alumno tiene asignado un proyecto de grado desarrollado en la Carrera de Informática, con dicho proyecto se solicita realizar las siguientes actividades: (a) Planificar el proyecto de sistemas de acuerdo a los antecedentes y problemática descritos en el proyecto de grado seleccionado. (b) Con base en un modelo de procesos y un ciclo de vida realizar el proceso de ingeniería de requerimientos y el análisis del sistema. (c) Obtener el diseño de las entradas, salidas efectivas, base de datos e interfaces del sistema. (d) Efectuar el proceso de codificación en un lenguaje de programación adecuado. (e) Realizar el proceso de pruebas siguiendo de preferencia la estrategia general de prueba de sistemas. (f) Realizar el proceso de aseguramiento de calidad del proyecto de sistemas utilizando las métricas adecuadas. (g) Realizar un informe final del proyecto asociado al sistema obtenido, este informe debe contener un análisis comparativo donde se resalten las ventajas y desventajas del producto obtenido respecto al proyecto de grado utilizado como base de las actividades realizadas. (h) Obtener los manuales de usuario y del sistema.

10.1. Problemas propuestos

10.1.1. Sistema de información para seguimiento y control de inventarios
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Valle Quispe Jesús Hermógenes (2009) Sistema de control y seguimiento de Inventario de Fármacos. Caso: Clínica San Damián. En línea: http://bibliotecadigital.umsa.bo:8080/rddu/bitstream/123456789/879/1/T-1840.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1840.

10.1.2. Sistema de información integrado para control administrativo financiero
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Miranda Huayhua Felix (2008) Sistema de Información Integrado Control Administrativo, Financiero y Proyectos. Caso: Empresa Constructora “ELEKTROPACHA”. En línea: http://bibliotecadigital.umsa.bo:8080/rddu/bitstream/123456789/969/3/T-1704.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1704.

10.1.3. Sistema de información para la gestión de trámites
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Cancari Guarachi Renan (2009) Sistema de Información de Seguimiento de Tramites vía Web, Gobierno Municipal de El Alto. En línea: http://bibliotecadigital.umsa.bo:8080/rddu/bitstream/123456789/973/3/T-1740.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1740.

10.1.4. Sistema de información para proyectos de investigación
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Vargas Poma Rocío Jacqueline (2008) Sistema Web para proyectos de investigación de la UMSA aplicando MD5 caso: IICCA. En línea: http://bibliotecadigital.umsa.bo:8080/rddu/bitstream/123456789/896/3/T-1757.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1757.

10.1.5. Sistema de información para la administración de planillas de pagos
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Rodríguez Carhuani Rogelio (2009) Sistema de Control de Personal y Planillas de Pago. En línea: http://bibliotecadigital.umsa.bo:8080/rddu/bitstream/123456789/938/3/T-1718.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1718.

10.1.6. Sistema de información integrado de administración y gestión
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Machicado Surculento Maribel Feliza (2007) Sistema integrado de Administración y Gestión Creatrónica S.R.L. En línea: http://200.7.160.61:8080/rddu/bitstream/123456789/287/3/T-1481.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1481.

10.1.7. Sistema de información biométrico para control de personal
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Julieta Verónica Llanque Poma (2009) Sistema biométrico dactilar para el control de personal y planillas de pago. En línea: http://bibliotecadigital.umsa.bo:8080/rddu/bitstream/123456789/868/3/T-1826.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1826.

10.1.8. Sistema de información para el control de almacenes
Se debe tomar como documento base el siguiente proyecto de grado de la Carrera de Informática: Mamani Mamani Julia (2010) Sistema de información vía Web para el control de almacenes. Fábrica de Fideos Santa Rosa. En línea: http://bibliotecadigital.umsa.bo:8080/rddu/bitstream/123456789/882/3/T-1843.pdf [Acceso: Agosto 2011]. Código de préstamo en biblioteca: T-1843.

10. 2. Lista de proyectos asignados
N° PATERNO MATERNO NOMBRES Numero Proyecto Código de Préstamo
1 Aguilar Calle Mauricio Anibal 10.1.1. T-1840.
2 Amoraga Mamani Whilly Edgar 10.1.2. T-1704.
3 Cachaga Villegas Edwin 10.1.3. T-1740.
4 Campero Pérez Jose Luis 10.1.4. T-1757.
5 Canaviri López Victor 10.1.5. T-1718.
6 Casillo Cussi Fernando 10.1.6. T-1481.
7 Castro Rocabado Ismael 10.1.7. T-1826.
8 Céspedes Mamani Oscar 10.1.8. T-1843.
9 Chambilla Rengel Joel 10.1.1. T-1840.
10 Chirico Rodriguez Yamil 10.1.2. T-1704.
11 Choque Valeriano Obed 10.1.3. T-1740.
12 Condori Caviña Juan Carlos 10.1.4. T-1757.
13 Coronel Lazo Reynaldo 10.1.5. T-1718.
14 Fernández Rojas Jorge 10.1.6. T-1481.
15 Flores Alconini Diego 10.1.7. T-1826.
16 Flores Bernal Hugo Alberto 10.1.8. T-1843.
17 Gutiérrez Brenda Lily 10.1.1. T-1840.
18 Hinojosa Ticona Maritza 10.1.2. T-1704.
19 Huanca Aro Soledad Sintia 10.1.3. T-1740.
20 Huchani Machicado Alison 10.1.4. T-1757.
21 Lima Sirpa Angela Ninoska 10.1.5. T-1718.
22 López Chuquimia Ivette 10.1.6. T-1481.
23 Mamani Licoña Elizabeth 10.1.7. T-1826.
24 Mamani Poma Nancy 10.1.8. T-1843.
25 Mamani Quisbert Celia 10.1.1. T-1840.
26 Mamani Quispe Carmen 10.1.2. T-1704.
27 Mamani Quispe Edu Alvaro 10.1.3. T-1740.
28 Ortiz Valencia Eynar 10.1.4. T-1757.
29 Paredes Mendoza Diego 10.1.5. T-1718.
30 Paye Tipone Arnold Dario 10.1.6. T-1481.
31 Peña Tarqui Elizabeth 10.1.7. T-1826.
32 Poma Perez Vladimir 10.1.8. T-1843.
33 Quicaña Miranda Mikaela Nathaly 10.1.1. T-1840.
34 Quiroga Rada Wendy Milenka 10.1.2. T-1704.
35 Quispe Coronel Delia 10.1.3. T-1740.
36 Quispe Quisbert Elizabeth 10.1.4. T-1757.
37 Quisucala Valverde Erick 10.1.5. T-1718.
38 Ramos Condori Laura Fabiola 10.1.6. T-1481.
39 Ramos Huarachi Liz Andrea 10.1.7. T-1826.
40 Rodríguez Yujra José 10.1.8. T-1843.
41 Salvatierra Lopez Ariel 10.1.1. T-1840.
42 Siñani Terraza Veronica 10.1.2. T-1704.
43 Ugarte Tejerina Sidney 10.1.3. T-1740.
44 Vicente Portugal Arnold 10.1.4. T-1757.
45 Vichini Condori José Antonio 10.1.5. T-1718.
46 Vila Mamani Erlinda 10.1.6. T-1481.
47 Yana Mollericona Abraham 10.1.7. T-1826.
48 Yujra Ali Adalid Irvin 10.1.8. T-1843.

10.3. Contenido del proyecto
El proyecto debe contener, al menos, los siguientes elementos: (1) Introducción al tema. (2) Problemas. (3) Objetivos. (4) Marco conceptual. (5) Cuerpo de solución. (6) Conclusiones.

10.4. Fecha de entrega y evaluación
Se establece como fecha de entrega del proyecto el día lunes 5 de diciembre de 2011, a horas 16:00. Se defenderán los trabajos semestrales, que no cuenten con las características mínimas, de manera grupal ante un tribunal conformado por especialistas en análisis y diseño de sistemas.

Análisis y diseño estructurado

DEFINICIONES

Análisis
El análisis estructurado, como todos los demás métodos de análisis de requisitos, es una actividad de construcción de modelos. Mediante una notación que es única de este método, se crean modelos que reflejan el flujo y el contenido de la información (datos y control); se parte el sistema funcionalmente y, según los distintos comportamientos, se establece la esencia de lo que se debe construir.
La tarea del análisis de sistemas, conlleva más que sólo realizar análisis de requisitos, pero es en eso donde se focalizará la discusión.
Una de las principales labores del analista es descubrir detalles y documentar la política de un negocio que pudiera existir sólo en forma implícita, "transmitidas de generación en generación" por los usuarios, nunca documentadas formalmente. El analista debe distinguir entre síntomas, problemas del usuario y causas. Con sus conocimientos de la tecnología de los computadores, el analista debe ayudar al usuario a explorar aplicaciones novedosas y más útiles de éstos así como nuevas formas de hacer negocios. Aunque muchos de los sistemas antiguos sólo se limitaban a perpetuar el negocio original del usuario, pero a velocidades electrónicas, hoy en día los analistas se enfrentan al desafío de ayudar al usuario a encontrar productos y mercados radicalmente innovadores, con la ayuda del computador.

Diseño
El diseño de software es un proceso mediante el que se traducen los requisitos en una representación del software. Inicialmente, la representación describe una visión holística del software. Posteriores refinamientos conducen a una representación de diseño que se acerca mucho al código fuente.

En el diseño se realizan dos pasos. El diseño preliminar se centra en la transformación de los requisitos en los datos y arquitectura del software. El diseño detallado se ocupa del refinamiento de la representación arquitectónica que lleva a una estructura de datos detallada y a las representaciones algorítmicas del software.

Dentro del contexto de los diseños preliminar y detallado, se llevan a cabo varias actividades de diseño diferentes. Además del diseño de datos, del diseño arquitectónico y del diseño procedimental, muchas aplicaciones requieren de un diseño de la interfaz. El diseño de la interfaz establece la disposición y los mecanismos para la interacción hombre máquina (no cubierto por las herramientas del diseño estructurado).

FUNDAMENTOS DEL ANALISIS Y DISEÑO

Abstracción
Cuando se considera una solución modular para cualquier problema, pueden formularse muchos niveles de abstracción. En el nivel superior de abstracción, se establece una solución en términos amplios, usando el lenguaje del entorno del problema. En los niveles inferiores de abstracción se toma una orientación más procedimental. La terminología orientada al problema se acompaña con una terminología orientada a la implantación, en un esfuerzo para establecer una solución. Por último, en el nivel más bajo de abstracción, se establece la solución de forma que pueda implementarse directamente.

Refinamiento
El refinamiento sucesivo es una primera estrategia de diseño descendente (propuesta por Niklaus Wirth). Un programa se desarrolla en niveles sucesivos de refinamiento de los detalles procedimentales. Se desarrolla una jerarquía descomponiendo una declaración macroscópica de una función en forma sucesiva hasta que se llega a las sentencias del lenguaje de programación. Cada paso de refinamiento implica algunas decisiones de diseño. Es importante que el programador sea consciente de sus decisiones y de la existencia de soluciones alternativas.

Modularidad
Se ha dicho que modularidad es el atributo individual del software que permite a un programa ser intelectualmente manejable. El software monolítico (compuesto por sólo un módulo) no puede ser fácilmente abarcado por un lector. El número de caminos de control, la expansión de referencias, el número de variables y la complejidad global podrían hacer imposible su correcta comprensión. La modularidad se deriva naturalmente de un principio elemental para manejar la complejidad: divide y vencerás.

Diseño Modular Efectivo
La calidad del diseño debe ser una meta para el diseñador. El diseño estructurado ofrece guías para apoyar al diseñador a determinar módulos, y sus interconexiones, que mejor realizarán los requerimientos especificados por el analista. Las dos reglas más importantes son las referentes al acoplamiento y la cohesión.

Cohesión
Grado en el cuál los componentes de un módulo (típicamente las instrucciones individuales que lo conforman) son necesarios y suficientes para llevar a cabo una sola función bien definida. En la práctica, esto significa que el diseñador debe asegurarse de no fragmentar los procesos esenciales en módulos, y también debe asegurarse de no juntar procesos no relacionados en módulos sin sentido. Los mejores módulos son aquellos que son funcionalmente cohesivos (es decir, módulos en los cuales cada instrucción es necesaria para poder llevar a cabo una tarea bien definida). Los peores módulos son los que son coincidentalmente cohesivos (es decir, donde sus instrucciones no tienen una relación significativa entre uno y otro).

Los grados de cohesión, de menor a mayor son:
a) Cohesión Coincidental. No existe una relación significativa entre los elementos del módulo.
b) Cohesión Lógica. La relación entre los elementos del módulo está basada en obtener ventajas en el procesamiento, por ejemplo, todos manipulan el mismo dato. Normalmente esto implica tener un código truculento o compartido, que degrada los propósitos de un buen diseño.
c) Cohesión Temporal. Los elementos del módulo constituyen un conjunto que se ejecuta secuencialmente en un punto fijo en el tiempo. Aunque tiende, a veces, a confundirse con la cohesión lógica, la diferencia está en que este tipo de módulo s más simple y se ejecuta sin la intervención de otras aplicaciones.
d) Cohesión Comunicacional. Los elementos del módulo hacen referencia al mismo conjunto de datos. Aquí se presenta un grado "aceptable" de cohesión.
e) Cohesión Secuencial. Implica que la salida de un elemento es la entrada para el próximo.
f) Cohesión Funcional. Aquí, todos los elementos del módulo están orientados a la realización de una función única.

Acoplamiento
Grado en el cuál los módulos se interconectan o se relacionan entre ellos. Entre más fuerte sea el acoplamiento entre módulos en un sistema, más difícil es implantarlo y mantenerlo, pues entonces se necesitará un estudio cuidadoso para la modificación de algún módulo o módulos. En la práctica, esto significa que cada módulo debe tener interfaces sencillas y limpias con otros, y que se debe compartir un número mínimo de datos entre módulos. También significa que un módulo dado no debe modificar la lógica interna o los datos de algún otro módulo; lo que se conoce como una conexión patológica.

Tamaño del módulo
De ser posible, cada módulo debe ser lo suficientemente pequeño como para caber en una sola página ( o para que se pueda desplegar en una sola pantalla). Desde luego, a veces no es posible determinar qué tan grande va a ser un módulo hasta haberlo escrito, pero las actividades iniciales de diseño a menudo darán al diseñador una buena pista de que el módulo será grande o complejo. Si es así, debe subdividirse en uno o más niveles de submódulos.

Alcance del control
El número de subordinados inmediatos que un módulo administrador puede llamar se conoce como el alcance del control. Un módulo no debe poder llamar a más de una media docena de módulos de nivel inferior. La razón es evitar la complejidad: si el módulo tuviera, por ejemplo, que llamar a 25 módulos de nivel inferior, entonces seguramente contendrá tanta lógica compleja que nadie lo entenderá (un sin fin de if-then anidados). La solución es introducir un nivel intermedio de módulos administradores, como haría un administrador de una organización humana.

Alcance del efecto/alcance del control
Esta regla sugiere que cualquier módulo afectado por el resultado de alguna decisión debe ser subordinado (aunque no necesariamente un subordinado inmediato) del módulo que toma la decisión. Es un tanto análogo a la regla de administración que dice que cualquier empleado afectado por los resultados de la decisión de algún administrador (es decir, dentro del alcance de efecto de la decisión), debe estar dentro del alcance de control del administrador (es decir trabajando entre la jerarquía de personas que se reportan con el administrador). Violar esta regla en un ambiente de diseño estructurado usualmente lleva a un paso innecesario de banderas y condiciones (lo cual incrementa el acoplamiento entre módulos), la toma redundante de decisiones o (en el peor de los casos) conexiones patológicas entre módulos.

Parsimonia
Se refiere a la economía de recursos que se emplean para la obtención de un resultado. Esto es, sólo se debe realizar lo que se pide. Mientras mayor la parsimonia, mejor el diseño.

Manejo Autónomo de Errores
Los módulos deben tener la capacidad de manejar sus propias condiciones de error, tanto en la detección como en la corrección de los mismos. De no ser así, el manejo de banderas (flags) de control y la transmisión de datos erróneos a otros módulos aumentarán considerablemente el acoplamiento.

DIAGRAMAS DE ESTRUCTURA
A través de los diagramas de estructura se puede modelar el control del sistema, así como la descomposición de las funciones en forma jerárquica.

En un diagrama de estructura, los módulos son representados por rectángulos. Se representa la dependencia (jerárquica) entre módulos, las instancias de repetición y decisión así como el flujo de los datos de control y otros a través de las funciones. Los módulos del diagrama de estructura son los mismos que los que aparecen en los distintos niveles del DFD, vistos en otra dimensión.

Aunque el módulo padre de un diagrama de estructura o módulo raíz puede tener dos o n hijos en su segundo nivel de descomposición, se recomienda descomponer este módulo en 3 hijos, cada uno de ellos dará origen a una rama en el diagrama de estructura, es decir, cada uno de ellos a su vez podrá tener otros módulos hijos. Estas ramas son:
a) rama aferente: su objetivo es capturar u obtener la información proveniente generalmente del usuario.
b) rama de proceso: transforma la información capturada, es decir las entradas, en las salidas del sistema. rama eferente: su objetivo es entregar las salidas del sistema al usuario o al terminador que corresponda.
c) rama eferente: su objetivo es entregar las salidas del sistema al usuario o al terminador que corresponda.

ESTRATEGIAS DE DISEÑO
Ya se sabe cómo se puede representar la estructura modular del sistema, ahora se muestra como realizar esta representación utilizando como punto de partida los gráficos obtenidos mediante las técnicas de la fase de análisis. Esto significa que se debe hacer una especie de traducción entre diagramas. El paso de los Diagramas de Flujo de Datos (DFD) a los Diagramas de Estructura (DE) puede hacerse a partir de las siguientes estrategias:
· Análisis de transformación. A partir de un DFD con características de transformación (Flujo de Entrada, Centro de la transformación, Flujo de Salida).
· Análisis de transacción. Cuando en un DFD un dato determina la elección de uno o más flujos de información.

Se presenta a continuación de manera detallada cada una de estas estrategias, se debe tener en cuenta que se trata de estrategias y no de algoritmos, por lo tanto los resultados pueden no ser perfectos en una primera aproximación.

Análisis de transformación
Para el análisis de transformación se deben realizar los siguientes pasos:
1. Aislar el centro de transformación. Es la parte del DFD que contiene las funciones esenciales del sistema y es independiente de las características particulares de la entrada/salida. Los límites de flujo de llegada y salida están abiertos a interpretación.
2. Realizar el primer nivel de factorización. La estructura del programa debe representar una distribución descendente del control características particulares de la Entrada/Salida. Aparecerán tres módulos subordinados al módulo de control: (a) Módulo controlador del proceso de la información de llegada. (b) Módulo controlador del centro de transformación. (c) Módulo controlador del proceso de la información de salida.
3. Elaborar el segundo nivel de factorización. Se realiza mediante la conversión de las transformaciones de cada proceso de un DFD en los módulos correspondientes del diagrama de estructura. Se comienza en el centro de transformación y se va hacia afuera a lo largo de los caminos de llegada y salida.
4. Refinar la estructura del sistema utilizando medidas y heurísticas de diseño.

Análisis de transacción
El análisis de transacción se aplica cuando un DFD toma una forma en la que un dato determina la elección de uno o más flujos de información. Los pasos a seguir son:
1. Identificar el centro de transacción. Será el origen de una serie de caminos que fluyen radialmente. Cada camino, tanto de llegada como los de acción, debe evaluarse en función de sus características individuales.
2. Transformar el DFD en la estructura adecuada al proceso de transacciones. El flujo de transacciones se convierte en una estructura de programa formada por una bifurcación de entrada y una de salida.
3. Factorizar la estructura de cada camino de acción. La estructura de la bifurcación de entrada se desarrolla de la misma forma que el análisis de transformación. Cada camino del flujo de acción se convierte en una estructura que se corresponde con las características específicas del flujo (transformación, transacción). Cada camino de acción estudiado usa los pasos de diseño vistos anteriormente.
4. Refinar la estructura del sistema utilizando medidas y heurísticas de diseño.

EVALUACIÓN DEL DISEÑO
Para estimar si el diseño del sistema es todo lo correcto que se precisa para su funcionamiento, se utilizan dos unidades complementarias de medida:
· Acoplamiento, es el grado de interdependencia entre los módulos, depende del número de parámetros que se intercambian para su comunicación.
· Cohesión, es el grado en el que los componentes de un módulo son necesarios y suficientes para realizar una sola función bien definida.

Acoplamiento
En módulos con acoplamiento alto se debe considerar un módulo cuando se modifica el otro. El objetivo es conseguir un diseño con bajo acoplamiento. Interesa que la interdependencia entre módulos sea lo más baja posible, para conseguir que los problemas de cualquier módulo afecten lo menos posible al resto del sistema, esto redunda en un mejor funcionamiento del sistema, más fácil mantenimiento y reutilización.

Los principales factores que afectan al acoplamiento son:
· Conexión de información entre módulos.
· Información que pasa de un módulo a otro.
· Entrada y salida al módulo.
· Complejidad de la información que se transmite.

Existen varios niveles de acoplamiento, de mejor a peor:
· Acoplamiento Normal. En este acoplamiento se diferencian los siguientes tipos: (a) De datos, entre el módulo que llama y el llamado, debe establecerse al menos una comunicación básica. (b) Por estampado, si se pasan datos entre módulos con estructura de registro, no es deseable si el módulo que recibe el registro sólo necesita parte de los datos. (c) De control, cuando los datos de comunicación son flags de control, supone una ruptura en el principio de caja negra, ya que el módulo inferior tiene detalles de funcionamiento del superior, esto es malo si se cambia el módulo inferior.
· Acoplamiento Común. Se produce cuando más de dos módulos hacen referencia a un área común de datos. Puede dar problemas si los módulos acceden sin demasiado control a esa área común.
· Acoplamiento de contenido. Se da cuando un módulo cualquiera, accede a parte del código de otro rompiendo la jerarquía.

Cohesión
Es la medida de la fuerza o relación funcional de los elementos de un módulo, entendiendo por elementos a la sentencia o grupo de sentencias que lo componen, a las definiciones de datos o llamadas a otros módulos. Un módulo coherente sólo debe hacer (idealmente) una cosa. El objetivo es conseguir una alta cohesión, donde cada instrucción es necesaria para llevar a cabo una sola tarea.

Los distintos niveles de cohesión son de mejor a peor:
· Funcional. Un módulo con cohesión funcional contiene elementos que contribuyen a la realización de una, y sólo una, tarea funcional.
· Secuencial. Un módulo realiza varias tareas en secuencia, de modo que las entradas de cada tarea son las salidas de la anterior.
· Comunicacional. Un módulo realiza actividades paralelas usando los mismos datos de entrada y salida.
· Procedimental. Igual que la secuencial, pero con paso de controles.
· Temporal. Las actividades que realiza tienen un matiz temporal.
· Lógica. El módulo tiene algo así como partes dentro de sí mismo.
· Coincidente. El módulo que llama tiene conocimiento de la estructura interna del módulo al que llama.

Esta evaluación del diseño permite efectuar cambios importantes en el diseño, si se descubre errores de cierta importancia, es el momento de realizar un ajuste fino en el mismo.
Heurísticas del diseño
Son recomendaciones para mejorar la estructura del diseño y mejorar la modularidad. Se consideran las siguientes características:
· Tamaño del módulo, entre 10 y 100 sentencias.
· Ámbito de control, el ámbito de control de un módulo es todos los módulos que hay por debajo de él.
· Ámbito de efecto, cualquier módulo afectado por una decisión, debe ser subordinado del módulo que toma la decisión.

Corrección del diseño
Las reglas de oro para realizar un buen diseño son las siguientes:
· No utilizar variables globales.
· Evitar pasar parámetros, a menos que sea necesario.
· Reducir el número de parámetros que intercambian al máximo.
· No agrupar las líneas de código aleatoriamente, sino que deben ser agrupadas por funciones.
· Un módulo de un nivel inferior no debe llamar a otro de nivel superior de la misma rama del diagrama, puede dar lugar a bucles sin salida.

Definición de programas
Para la definición de programas deben agruparse todos los módulos que se han definido de manera funcional, para el efecto existen dos posturas dos posturas diferentes:
· Construir un programa por cada módulo.
· Agrupar los módulos en un programa, asociando cada uno de ellos a un párrafo.

miércoles, 2 de noviembre de 2011

Prueba 2

Uno de los principales medios que tienen las personas para adquirir información y conocimiento es tener acceso a las biblioteca, con el fin de recopilar información referente a libros, revistas, tesis, proyectos, etc. Por otro lado las bibliotecas tienen la función potencializar las capacidades de ampliar y difundir conocimiento a los lectores. La incorporación de nuevas tecnologías de la información y las comunicaciones a todos los ámbitos de la sociedad realizan transformaciones que afectan al modo de vivir de las personas. Las nuevas formas de acceso a la información permiten llegar de manera más rápida y confiable a la información, utilizando herramientas de catalogación, clasificación y métodos. Razón por la cual el administrador de la biblioteca solicita un producto software para la carrera de informática de la Universidad Mayor de San Andrés que cuenta con una biblioteca especializada con una cantidad considerable de documentos empastados relacionados con las tesis y los proyectos de grado que permiten otorgar la licencia profesional a los egresados de la misma. El administrador de la biblioteca solicita un producto software que sea capaz de dar solución a los siguientes problemas:

1. La acumulación física de dichos documentos en los estantes de la biblioteca, a través de un código adecuado, que por gestión es de aproximadamente 150 a 200 ejemplares relacionados con los profesionales que obtienen su licenciatura. El código debe ser utilizado también para el registro y catalogación de los medios magnéticos de respaldo de los productos software que acompañan las tesis y los proyectos de grado.
2. El registro y exposición de los borradores finales de las tesis y proyectos de grado en los ambientes de la biblioteca, 30 días antes de la defensa pública del documento. El registro de observaciones por parte de los lectores de los documentos expuestos. Las observaciones pueden ser por plagio, copia de capítulos, copia del producto software, etc.
3. Las consultas sobre las tesis y los proyectos de grado por diferentes atributos: titulo gestión, autor, tutor, revisor, presidente de tribunal, nota, fecha de defensa, etc.
4. Cada tesis o proyecto de grado debe incluir consultas acerca del resumen, palabras clave, prototipo de la tesis, producto software, nombre de la entidad avaladora, representante de la entidad avaladora, etc.

Con lo mencionado desarrolle la propuesta de sistemas para la administración de las tesis y proyectos de grado de la Biblioteca Especializada de la Carrera de Informática, que incluya la solución a los problemas especificados. La propuesta de sistemas debe incorporar elementos preliminares del análisis y diseño de sistemas como son el proceso de muestreo, el diseño de encuestas, los requerimientos del sistema, los diagramas de flujo de datos, el diccionario de datos y la especificación de los procesos asociados al sistema con la técnica adecuada. Además para complementar lo anterior se solicita la propuesta del sistema, el diseño de entradas y salidas efectivas, el diseño de la base de datos y el diseño de las interfaces de usuario.

NOTA
Las respuestas a esta prueba deben ser enviadas en formato .doc a la dirección de correo electrónico: saguicas@yahoo.com.mx, hasta horas 18:00 del día miércoles 02 de noviembre del año en curso, en el asunto debe indicar Prueba 2 ADS, en el cuerpo debe incluirse el nombre, apellidos, número de cedula de identidad y dirección de correo electrónico del estudiante. Los documentos de respuesta deben acompañarse como documento adjunto.

Taller 10

La ciencia humana consiste más en destruir errores que en descubrir verdades.” Sócrates

1. Elaborar las pruebas de caja blanca y caja negra para un programa que analiza la validez de una palabra clave. Una clave es válida cuando cumple los siguientes requisitos: (a) Está formada por más de 7 y menos de 13 caracteres. (b) Los caracteres permitidos son: Las letras a – z, A – Z. Los dígitos 0 – 9. El carácter especial. (c) Contiene al menos dos letras. (d) Contiene al menos un carácter que no es letra. (e) El primer y el último carácter son letras. (f) No aparece en un diccionario de palabras prohibidas (user %10a,user %aa, . . . ).

2. Aplique la estrategia general de prueba a la tienda de compra y venta de teléfonos celulares “Androide”, considerando el conjunto de documentos generados en talleres anteriores.

3. Escriba un resumen comentado, utilizando un mapa mental, del siguiente texto: “El investigador Rice, el año 2002, enumera y explica los diez retos más importantes en la automatización del proceso de pruebas. De acuerdo con este autor, éstos son los siguientes: (1) Falta de herramientas, debida fundamentalmente a su elevado precio o a que las existentes no se ajusten al propósito o entorno para el que se necesitan. La primera razón parece deberse a la no mucha importancia que habitualmente se le da a la fase de pruebas, y eso que el costo de corregir un error puede, en muchos casos, superar al de la licencia de uso. Sería conveniente evaluar el costo de corrección de defectos del software entregado y compararlo con el de la licencia de la herramienta de pruebas. (2) Falta de compatibilidad e interoperabilidad entre herramientas. (3) Falta de proceso de gestión de la configuración. Igual que las diferentes versiones del código fuente, las pruebas, especialmente las de regresión, deben someterse a un control de versiones. Recuérdese que el proceso de Gestión de la Configuración es uno de los procesos de soporte del estándar ISO/IEC 12207 (ISO/IEC 1995), que debería utilizarse en la ejecución de los procesos principales, y muy especialmente en los de Desarrollo y Mantenimiento. (4) Falta de un proceso básico de pruebas y de conocimiento de qué es lo que se debe probar. (5) Falta de uso de las herramientas de prueba que ya se poseen, bien por su dificultad de uso, por falta de tiempo para aprender a manejarla, por falta de soporte técnico, obsolescencia, etc. (6) Formación inadecuada en el uso de la herramienta. (7) La herramienta no cubre todos los tipos de prueba que se desean (corrección, fiabilidad, seguridad, rendimiento, etc.). Obviamente, a la hora de elegir la herramienta, deberían tenerse priorizados los tipos de pruebas, y entonces hacer la elección de la herramienta basados en esto. A veces también es necesario utilizar no una, sino varias herramientas de prueba, así como tener en cuenta que es imposible automatizar el 100% de las pruebas. (8) Falta de soporte o comprensión por parte de los jefes, debido otra vez a la escasa importancia que habitualmente se le da a la fase de pruebas. (9) Organización inadecuada del equipo de pruebas. (10) Adquisición de una herramienta inadecuada.“

NOTA
Las respuestas a este taller deben ser enviadas en formato .doc a la dirección de correo electrónico: saguicas@yahoo.com.mx, en el asunto debe indicar Taller 10 ADS, en el cuerpo debe incluirse los nombres, apellidos, número de cedula de identidad y dirección de mail de cada uno de los integrantes de grupo. El documento de respuestas debe acompañarse como documento adjunto.

Calidad del producto software

Uno de los problemas que se afrontan actualmente en la esfera de la computación es la calidad del software. Desde la década del 70, este tema ha sido motivo de preocupación para especialistas, ingenieros, investigadores y comercializadores de software, los cuales han realizado gran cantidad de investigaciones al respecto con dos objetivos fundamentales:
1. ¿Cómo obtener un software con calidad?
2. ¿Cómo evaluar la calidad del software?

Ambas interrogantes conllevan amplias respuestas, pero están estrechamente ligadas al concepto de la calidad del software, que es el resultado de la primera y la fuente de la segunda.

CALIDAD DEL SOFTWARE
La calidad del software es el conjunto de cualidades que lo caracterizan y que determinan su utilidad y existencia. La calidad es sinónimo de eficiencia, flexibilidad, corrección, confiabilidad, mantenibilidad, portabilidad, usabilidad, seguridad e integridad.

La calidad del software es medible y varía de un sistema a otro o de un programa a otro. Un software elaborado para el control de naves espaciales debe ser confiable al nivel de "cero fallas"; un software hecho para ejecutarse una sola vez no requiere el mismo nivel de calidad; mientras que un producto de software para ser explotado durante un largo período (10 años o más), necesita ser confiable, mantenible y flexible para disminuir los costos de mantenimiento y perfeccionamiento durante el tiempo de explotación.

La calidad del software puede medirse después de elaborado el producto. Pero esto puede resultar muy costoso si se detectan problemas deriva dos de imperfecciones en el diseño, por lo que es imprescindible tener en cuenta tanto la obtención de la calidad como su control durante todas las etapas del ciclo de vida del software.

SOFTWARE DE CALIDAD
La obtención de un software con calidad implica la utilización de metodologías o procedimientos estándar para el análisis, diseño, programación y prueba del software que permitan uniformar la filosofía de trabajo, en aras de lograr una mayor confiabilidad, mantenibilidad y facilidad de prueba, a la vez que eleven la productividad, tanto para la labor de desarrollo como para el control de la calidad del software.

La política establecida debe estar sustentada sobre tres principios básicos: tecnológico, administrativo y ergonómico.
1. El principio tecnológico define las técnicas a utilizar en el proceso de desarrollo del software.
2. El principio administrativo contempla las funciones de planificación y control del desarrollo del software, así como la organización del ambiente o centro de ingeniería de software.
3. El principio ergonómico define la interfaz entre el usuario y el ambiente automatizado.

La adopción de una buena política contribuye en gran medida a lograr la calidad del software, pero no la asegura. Para el aseguramiento de la calidad es necesario su control o evaluación.

CONTROL DE CALIDAD DEL SOFTWARE
Para controlar la calidad del software es necesario, ante todo, definir los parámetros, indicadores o criterios de medición, ya que, como bien plantea Tom De Marco, "usted no puede controlar lo que no se puede medir".

Las cualidades para medir la calidad del software son definidas por innumerables autores, los cuales las denominan y agrupan de formas diferentes. Por ejemplo, John Wiley define métricas de calidad y criterios, donde cada métrica se obtiene a partir de combinaciones de los diferentes criterios. La Metodología para la evaluación de la calidad de los medios de programas de la CIC, de Rusia, define indicadores de calidad estructurados en cuatro niveles jerárquicos: factor, criterio, métrica, elemento de evaluación, donde cada nivel inferior contiene los indicadores que conforman el nivel precedente. Otros autores identifican la calidad con el nivel de complejidad del software y definen dos categorías de métricas: de complejidad de programa o código, y de complejidad de sistema o estructura.

Todos los autores coinciden en que el software posee determinados índices medibles que son las bases para la calidad, el control y el perfeccionamiento de la productividad.

Una vez seleccionados los índices de calidad, se debe establecer el proceso de control, que requiere los siguientes pasos:
1. Definir el software que va a ser controlado: clasificación por tipo, esfera de aplicación, complejidad, etc., de acuerdo con los estándares establecidos para el desarrollo del software.
2. Seleccionar una medida que pueda ser aplicada al objeto de control. Para cada clase de software es necesario definir los indicadores y sus magnitudes.
3. Crear o determinar los métodos de valoración de los indicadores: métodos manuales como cuestionarios o encuestas estándares para la medición de criterios periciales y herramientas automatizadas para medir los criterios de cálculo.
4. Definir las regulaciones organizativas para realizar el control: quiénes participan en el control de la calidad, cuándo se realiza, qué documentos deben ser revisados y elaborados, etc.

A partir del análisis de todo lo anterior, nuestro Centro se encuentra enfrascado en un proyecto para el Aseguramiento de la Calidad del Software (ACS), válido para cualquier entidad que se dedique a la investigación, producción y comercialización del software, el cual incluye la elaboración de un Sistema de Indicadores de la Calidad del Software, la confección de una Metodología para el Aseguramiento de la Calidad del Software y el desarrollo de herramientas manuales y automatizadas de apoyo para la aplicación de las técnicas y procedimientos del ACS, de forma tal que se conforme un Sistema de Aseguramiento de la Calidad del Software.

ASEGURAMIENTO DE LA CALIDAD DEL SOFTWARE
Desde el punto de vista de la evidencia, la IEEE define el aseguramiento de la calidad como “Una guía planificada y sistemática de todas las acciones necesarias para proveer la evidencia adecuada de que un producto cumple los requerimientos técnicos establecidos. Un conjunto de actividades diseñadas para evaluar el proceso por el cual un producto es desarrollado o construido.”

La función de aseguramiento de la calidad tiene como finalidad primaria el determinar si las necesidades de los usuarios están siendo satisfechas adecuadamente. Otra de sus funciones es la de determinar los costos que puede causar el añadir ciertas características al producto, ya que tarde o temprano, la economía resulta ser un factor decisivo para obtener un producto de calidad. Para determinar si las necesidades de los usuarios están siendo satisfechas, se deben de evaluar tres áreas:
1. Objetivos: Los objetivos de la organización son primero, luego vienen los requerimientos del usuario. Los objetivos de cualquier usuario deben de estar en armonía con los objetivos de la organización,
2. Métodos: Deben de utilizarse métodos que contengan u observen las políticas, procedimientos y estándares de la organización,
3. Ejecución: Optimización del uso de hardware y software al implementar los productos de software.
Para evaluar las áreas expuestas, es necesario que se cuente con un programa de aseguramiento de calidad que sea efectivo y que tenga un impacto dentro del desarrollo y prueba del producto de software final.

PRUEBA DEL SOFTWARE
La fase de pruebas es una de las más costosas del ciclo de vida software. En sentido estricto, deben realizarse pruebas de todos los artefactos generados durante la construcción de un producto, lo que incluye especificaciones de requisitos, casos de uso, diagramas de diversos tipos y, por supuesto, el código fuente y el resto de productos que forman parte de la aplicación (p.ej., la base de datos). Obviamente, se aplican diferentes técnicas de prueba a cada tipo de producto software.

Proceso de pruebas en el ciclo de vida
El estándar ISO/IEC 12207 (ISO/IEC 1995) identifica tres grupos de procesos en el ciclo de vida del software:
· Procesos principales, grupo en el que incluye los procesos de Adquisición, Suministro, Desarrollo, Operación y Mantenimiento.
· Procesos de la organización, en donde se encuentran los procesos de Gestión, Mejora, Infraestructura y Formación.
· Procesos de soporte o auxiliares, en donde están los procesos de Documentación, Gestión de la Configuración, Auditoría, Resolución de Problemas, Revisión Conjunta, Aseguramiento de la Calidad, Verificación, Validación,

No define, como se observa, un proceso de pruebas como tal, sino que aconseja, durante la ejecución de los procesos principales o de la organización, utilizar los procesos de soporte. Entre éstos se encuentran los procesos de Validación y de Verificación:
· El proceso de Validación tiene como objetivo determinar si los requisitos y el sistema final cumplen los objetivos para los que se construyó el producto, respondiendo así a la pregunta ¿el producto es correcto?
· El proceso de Verificación intenta determinar si los productos software de una actividad se ajustan a los requisitos o a las condiciones impuestas en actividades anteriores. De este modo, la pregunta a la que responde este proceso es ¿se está construyendo el producto correctamente?

Del proceso de Verificación se observa la importancia de verificar cada uno de los productos que se van construyendo, bajo la asunción de que si lo que se va construyendo es todo ello correcto, también lo será el producto final. Igualmente, se observa que el proceso de Validación resalta la importancia de comprobar el cumplimiento de los objetivos de los requisitos y del sistema final, de suerte que podría construirse un Plan de pruebas de aceptación desde el momento mismo de tener los requisitos, que sería comprobado al finalizar el proyecto. Si tras la fase de requisitos viniese una segunda de diseño a alto nivel del sistema, también podría prepararse un Plan de pruebas de integración, que sería comprobado tras tener codificados los diferentes módulos del sistema. Esta correspondencia entre fases del desarrollo y tipos de pruebas produce el llamado “modelo en V”.

Pruebas de requisitos
La prueba de requisitos pretende comprobar los tres principales atributos de calidad de los requisitos, con el fin de detectar tantos errores como sea posible y cuanto antes: corrección (carencia de ambigüedad), compleción (especificación completa y clara del problema) y consistencia (que no haya requisitos contradictorios).

Pruebas del diseño
La fase de diseño tiene como objetivo generar un conjunto de especificaciones completas del sistema que se va a implementar, transformando los requisitos en un Plan de implementación.
La prueba del diseño debe comprobar su consistencia, compleción, corrección, factibilidad (es decir, que el diseño sea realizable) y trazabilidad (es decir, que se pueda “navegar” desde un requisito hasta el fragmento del diseño en que éste se encuentra).

Revisiones e inspecciones del código fuente
Las revisiones e inspecciones de código fuente son una técnica para la detección manual de errores en el código. Se trabaja bajo el principio de que “cuatro ojos ven más que dos”, de tal manera que el método de trabajo consistirá, básicamente, en pasar el código escrito por un programador a un tercero o grupo de terceros, que tratará de encontrar posibles errores, faltas de adecuación al estilo de codificación utilizado por la organización, etc. Para ello suelen utilizarse listas de comprobación (checklists), que enumeran defectos y en los que el revisor anota su presencia o ausencia.

miércoles, 26 de octubre de 2011

Taller 9

En lo tocante a la ciencia, la autoridad de un millar no es superior al humilde razonamiento de una sola persona.” Galileo Galilei

1. Realice un diseño de interfaces asociado al siguiente enunciado: Se tienen CLIENTES de los que se guarda un número de cliente, nombre, apellidos, lista de teléfonos, fax y correo electrónico. Los clientes realizan PEDIDOS. Un pedido no puede ser realizado por dos clientes de manera simultánea. Cada pedido tiene un número de pedido, una fecha asociada y una persona de contacto. Cada pedido aglutina varias LÍNEAS DE DETALLE, cada línea con una cantidad y una referencia a un artículo. Los ARTÍCULOS tienen un descriptor, un identificador de familia y un identificador de modelo. Varias líneas de detalle correspondientes a uno o varios pedidos, las cuales bien en su totalidad o bien en parte, constituyen una nota de ENTREGA. Las notas de entrega contienen una fecha de entrega, una dirección de entrega y el nombre y apellido del receptor. Varias líneas de detalle correspondientes a una o varias notas de entrega, bien en su totalidad o bien en parte, constituyen una FACTURA, la cual contiene un número de factura, un numero de NIT, una fecha de cobro y un modo de pago.

2. Realice el diseño de interfaces para la tienda de compra y venta de teléfonos celulares “Androide”, considerando el conjunto de documentos generados en talleres anteriores.

3. Escriba un resumen comentado utilizando el siguiente texto: “Según Browne, Norman y Riches, el diseño de este tipo de interfaz debería seguir una metodología que le asegure el logro de los objetivos y beneficios esperados. La misma se compone de los siguientes elementos: ANÁLISIS DE REQUERIMIENTOS. Determinar objetivos y alcance, Definir qué variabilidad (del usuario y de las tareas) serán tenidas en cuenta, Especificar la aceptabilidad (costos vs. beneficios) Estudiar la usabilidad del sistema. ANÁLISIS DE VIABILIDAD. Factibilidad de señales de adaptación, cambios de la interfaz, suposiciones que justifiquen la adaptación, Determinación de niveles de adaptatividad, Usabilidad. DISEÑO. La arquitectura debe asegurar un rendimiento aceptable, Tener en cuenta aspectos de forma, contenido y temporización entre eventos, Comportamiento adaptativo: cómo las señales determinan los cambios. CONSTRUCCIÓN. De los modelos (Dominio, Interacción y Usuario), De detectores de señales, De mecanismos de control. EVALUACIÓN POSTERIOR. Efectos de la interacción: cuáles son los beneficios, qué tan generalmente aplicables pueden ser, Operación del sistema: ¿se alcanzó el nivel de adaptatividad previsto?, ¿Fueron válidas las suposiciones establecidas? Para Benyon existen 5 fases en el diseño de sistemas adaptativos: ANÁLISIS FUNCIONAL, que debe establecer las principales funciones del sistema. ANÁLISIS DE DATOS, que se ocupa de la comprensión y representación del significado y estructura de los datos. Junto con el anterior, definen la capacidad del sistema para procesar la información. ANÁLISIS DEL CONOCIMIENTO DE LAS TAREAS, que se ocupa de las características cognitivas requeridas a los usuarios por el sistema, como por ejemplo estrategias de búsqueda, modelo mental, experiencia previa, etc. ANÁLISIS DE USUARIO, que se encarga de construir un modelo de usuario según los atributos relevantes para la aplicación. ANÁLISIS DE ENTORNO, que estudiará las características del entorno donde funcionará el sistema“

NOTA
Las respuestas a este taller deben ser enviadas en formato .doc a la dirección de correo electrónico: saguicas@yahoo.com.mx, en el asunto debe indicar Taller 9 ADS, en el cuerpo debe incluirse los nombres, apellidos, número de cedula de identidad y dirección de mail de cada uno de los integrantes de grupo. El documento de respuestas debe acompañarse como documento adjunto.

Interfaz de usuario

DEFINICIÓN
La interfaz de usuario (IU) es uno de los componentes más importantes de cualquier sistema computacional, pues funciona como el vínculo entre el humano y la máquina. La interfaz de usuario es un conjunto de protocolos y técnicas para el intercambio de información entre una aplicación computacional y el usuario. La IU es responsable de solicitar comandos al usuario, y de desplegar los resultados de la aplicación de una manera comprensible. La IU no es responsable de los cálculos de la aplicación, ni del almacenamiento, recuperación y transmisión de la información.

El éxito de un programa frecuentemente se debe a qué tan rápido puede aprender el usuario a emplear el software, de igual importancia es el que el usuario alcance sus objetivos con el programa de la manera más sencilla posible.

Es importante señalar que dentro del proceso de creación de la IU existen cuatro diferentes tipos de personas involucradas. La primera persona, y probablemente la más importante, es el usuario final o simplemente usuario. El usuario es quien va a utilizar el programa final. La segunda persona es aquella que crea la interfaz de usuario. Esta persona es conocida como diseñador o arquitecto de la interfaz de usuario. Trabajando muy cercanamente con el diseñador estará el programador de la aplicación, este será el encargado de la escritura del software del resto de la aplicación. Muy frecuentemente el diseñador utilizará herramientas especiales para la creación del software de la IU (como los toolkits), y estas herramientas son elaboradas por el creador de herramientas.

CARACTERÍSTICAS DE UNA INTERFAZ
Una interfaz debe cumplir las siguientes condiciones:
• Naturalidad. El nuevo sistema automatizado debe tender a ser lo más similar al antiguo.
• Facilidad de aprendizaje y uso, dos aspectos que no siempre van unidos.
• Consistencia. La interfaz debe mantener uniformidad en cuanto a estilo, vocabulario, etc.

Naturalidad
Una interfaz es natural, cuando provoca al usuario sentimientos de ”estar como en casa”. Todo trabajador tiene:
• Una forma de actuar
• Una forma de organizarse
• Un vocabulario propio para las tareas habituales
• Un entorno que ya domina, al que está acostumbrado y del que, tal vez, le sea difícil de salir.

Facilidad de aprendizaje y uso
Proporcionar al usuario un sistema de ayuda potente. Pero, ¡cuidado! El sistema de ayuda puede ser un obstáculo una vez que se domine el producto (esta ayuda no debe ser automática). Para disfrutar de esta característica, la interfaz debe incorporar:
• Administración de perfiles de usuario. Según el grado de perfil, la interfaz ejecutarla unas acciones u otras.
• Mecanismos de realimentación que proporcione al usuario información sobre la ejecución actual del trabajo.
• Mecanismos de prevención de desastres.
• Sistemas de ayuda: Tratan de evitar que el usuario tenga que acceder a los manuales para resolver una duda puntual. Los mejores sistemas de ayuda son los que se denominan “sensibles al contexto”. Es capaz de determinar la circunstancia que origina la petición de ayuda y proporcionar un auxilio muy concreto sobre la materia que interesa.

Consistencia
Debe mantenerse una uniformidad a lo largo de toda la extensión de la interfaz: modo de operación, diseño, etc. Si cada componente actúa con distinta filosofía, obliga al usuario a cambiar la mentalidad de trabajo.

TIPOS DE INTERFAZ
Al iniciar cualquier sistema operativo, el usuario ve e interactúa con un conjunto de elementos en la pantalla que constituyen lo que se denomina la interfaz del usuario. La interfaz de usuario constituye la manera en que el usuario interactúa con la computadora. En los sistemas operativos actuales es común el uso de una interfaz gráfica de usuario: una colección de objetos sobre un fondo coloreado (basada en la metáfora del escritorio) con iconos, ventanas redimensionables, menús y cuadros de diálogo.

En general las aplicaciones diseñadas para correr o ser ejecutadas en un particular sistema operativo utilizan los mismos elementos de interfaz, de modo que los usuarios permanecen bajo una interfaz coherente y familiar.

Interfaz de línea de comandos
Requiere que el usuario introduzca la instrucción o comando por medio del teclado. El usuario teclea o escribe los comandos, carácter a carácter ante un indicador, usando la sintaxis y nomenclatura correctas y luego oprime para ejecutarlo. Los usuarios experimentados en esta interfaz afirman que es más simple, más rápida y que proporcionan mejor información que las interfaces gráficas.










Interfaz controlada por menús
Esta interfaz proporciona menús para seleccionar opciones del programa, así el usuario no tiene que memorizar comandos. En lugar de esto los comandos son seleccionados del menú presentado en pantalla, como cuando se escoge algún plato en un restaurante.







Interfaz gráfica del usuario
En este tipo de interfaz, los usuarios controlan el sistema señalando y haciendo clic en gráficos o iconos de la pantalla que representan las características del programa. Se basa en el hecho de que la gente reconoce con más rapidez y facilidad las representaciones gráficas que las palabras o frases que lee. Se le asocia generalmente a otras características, como el uso de una interfaz de ratón activo con menús de despliegue descendente, cajas de diálogo, cajas de verificación, botones de radio y elementos semejantes.