Final del 23/02/2009 (Ingeniería I)

De Cuba-Wiki
Saltar a: navegación, buscar
Back.png Volver a la página de la materia

Tomó Victor Braberman.

Fueron 5 preguntas escritas que las dictó en ese mismo momento. Más o menos las fue armando en el momento, sacándole y agregandole cosas.

Las resoluciones, salvo algún pequeño error en la transcripción de las mismas, corresponden a un examen calificado con 10.

Ejercicio 1[editar]

Enunciado[editar]

¿Que diferencia hay entre uso y extiende en la especificación de casos de uso? Explicación en base a escenarios.

Resolución[editar]

Si el caso de uso A incluye al caso de uso B, entonces el actor que inicie el caso de uso A deberá, cuando esto se indique en el detalle de A, interactuar con el sistema según describe el caso de uso B. Si pensamos en los casos de uso como conjuntos de escenarios, esto quiere decir que en cada escenario del caso de uso A deberá hallarse un escenario del caso de uso B.

Si el caso de uso B extiende al caso de uso A, entonces el actor que inicie el caso de uso A podrá realizar el caso de uso B (aunque esto no debe ocurrir necesariamente). Si pensamos en los casos de uso como conjuntos de escenarios, entonces algunos de los escenarios de A incluirán algunos de los escenarios de B.

Ejercicio 2[editar]

Enunciado[editar]

¿Por qué en el Criterio de Liskov se permite que el resultado de un método que se está derivando puede ser una especializacion del tipo de retorno del método original?

En esencia la pregunta es: ¿por qué se permite covarianza en el resultado?

Resolución[editar]

El principio de Liskov-Wing nació como una idea para permitir subtipado "sano" en lenguajes orientados a objetos. El principio se basa en un criterio de sustitución, el cual predica: "Si un objeto de un tipo A satisface una propiedad , entonces un objeto de tipo B (tipo derivado de A) deberá satisfacerla"; dicho de otro modo, no debería causar problemas reemplazar un objeto de tipo A por uno de tipo B.

En el principio de Liskov-Wing, el retorno de un método redefinido debe ser subtipo del retorno del método original. Esto se halla en línea con lo de arriba, pues al realizar el reemplazo, quienes utilicen el método estarán esperando que su retorno satisfaga lo que satisfacía el objeto del tipo base o que satisfaga aún más. En definitiva, estarán esperando que el retorno sea del mismo tipo que el tipo base o de alguno de sus subtipos (los que satisfacen aún más propiedades que el tipo base).

Ejercicio 3[editar]

Enunciado[editar]

¿Qué influencia más en las decisiones de diseño? ¿los requerimientos funcionales o los no funcionales? Explique y ejemplifique.

Resolución[editar]

Los requerimientos funcionales hablan de las funciones/servicios que debe proveer el sistema. Los no funcionales hablan de las características que deben tener estas funciones.

Sin los requerimientos funcionales no habría diseño alguno (¿qué sistema se diseñaría?). Desde ese punto de vista, los requerimientos funcionales son imprescindibles en el diseño. Sin embargo, la gran mayoría de las decisiones en diseño se orientan más al "cómo" que al "qué", por lo que los requerimientos no funcionales son los que más influencian el proceso de diseño.

Malas decisiones en diseño que no se orienten a satisfacer los requerimientos no funcionales pueden hacer obsoleto a un sistema, al punto de que este no sirva siquiera como base de otro sistema que satisfaga todos los requerimientos.

Ejercicio 4[editar]

Enunciado[editar]

¿Qué relación se le ocurre que hay entre los eventos de ports externos de un diagrama de componentes y conectores y las nociones del modelo de Jackson?

Resolución[editar]

Los diagramas de componente y conector se orientan a modelar entidades run-time del sistema y sus relaciones. En términos de Jackson, estos diagramas suelen usarse para modelar componentes de la máquina relacionados directamente con fenómenos que ocurren en la misma.

Los ports externos son aquellos que se comunican, es decir, interactúan, con el exterior del sistema. En relación con Jackson, estos ports se hallarían asociados a fenómenos de ocurrencia en la interfaz, es decir, en aquella porción compartida por la máquina y el mundo.

Ejercicio 5[editar]

Enunciado[editar]

Supongamos que se tiene una clase que implementa un árbol y tiene una operacion "balancear" que balancea el árbol. Hay que testear esta función. Alguien plantea como categoría el "grado de balance" con opciones:

  • Sesgado a la izquierda
  • Sesgado a la derecha
  • Ni sesgado, ni balanceado
  • Balanceado

Luego se plantean dos clases de particion más:

Opción a) Quedarse con la misma particion pero sin el caso balanceado

Opcion b) juntar las opciones sesgado izquierda y derecha en una sola categoría (sesgado) y mantener las demás (balanceado y ni sesgado ni balanceado)

Para las alternativa a) y b) explicar qué se pone en peligro en el criterio de testing (la completitud o la consistencia).

Resolución[editar]

Un criterio de testing para es completo si, de existir un error en , existe un conjunto de datos que satisface el criterio para el cual el test no es exitoso.

Un criterio de testing es consistente si, dados y conjuntos de datos que satisfacen el criterio, es exitoso si y sólo si lo es.

La primera opción dada elimina uno de los casos posibles (el árbol balanceado) por lo que el criterio podría dejar de ser completo. Si el único error existiera en la condición balanceada de un árbol, no habría un conjunto de datos, de los que satisfacen el criterio que no fuera exitoso. En cuanto a la consistencia, esta no se ve afectada, puesto que los conjuntos de datos seguirán teniendo un elemento en cada clase de equivalencia.

La segunda opción junta dos casos en uno. Esto sí puede afectar la consistencia. Supongamos que el único error se da cuando el árbol es sesgado a izquierda. Podrían existir y conjuntos de datos tal que el primero pruebe con el árbol sesgado a izquierda y el segundo con el árbol sesgado a derecha. Podría ocurrir entonces que no sea exitoso y sí lo fuera.

En cuanto a la completitud, esta no se vería afectada, puesto que de existir un error podría armarme un conjunto de datos que no sea exitoso. (Cada conjunto de datos del primer criterio, el de la consigna, me dará dos conjuntos asociados en el segundo criterio, el de la segunda opción. Si existía un error y el conjunto de datos del primer criterio lo demostraba, entonces lo demostrará alguno de los conjuntos de datos del último.)