Capítulo VI: DOO
(Parte I)
[email protected] (C-305)
DOO
AOO (describir) & DOO (solución)
Implementar las especificaciones con eficiencia y fiabilidad
Herramientas: Diagramas de interacción & DCD (en paralelo)
DOO
Aplicar principios de asignación de responsabilidades
Aplicar patrones
RequisitosDiseñoImplementaciónPruebaIntegraciónPruebas de sistemaIteración iRequisitosDiseñoImplementaciónPruebaIntegraciónPruebas de sistemaIteración i+14 semana (por ejemplo)El sistema crece encada iteracióntiempoRequisitosDiseñoImplementaciónPruebaIntegraciónPruebas de sistemaRequisitosDiseñoImplementaciónPruebaIntegraciónPruebas de sistemaIteración iRequisitosDiseñoImplementaciónPruebaIntegraciónPruebas de sistemaIteración i+14 semana (por ejemplo)El sistema crece encada iteracióntiempoProcedimiento DOO
Pasos
1.
Identificar las clases que participan en la solución del paquete
1. Primera vez en el Modelo del dominio.
1. De relaciones semánticas a asociaciones de “necesito conocer”.
Ingeniería inversa de la iteración anterior.
2.
2. Asignar las responsabilidades con los diagramas de interacción.
1. Create()
2. Acceso (setX(), getX())
3. Mensaje a multiobjetos se mandan al contenedor
3. Dibujar DCD
1.
Indicar las visibilidades y las asociaciones
Ahora se emplea toda la notación de UML
Visibilidad
Para utilizar un servicio se requiere la visibilidad del objeto
receptor (el emisor manda un mensaje al receptor)
1. De atributo: la más empleada en POO <<association>>
2. De parámetro: el receptor es pasado como un argumento
3.
<<parameter>>
Local: se declara el receptor en algún servicio del emisor
<<local>>
4. Global: el receptor es declarado global. Uso del patrón GoF
Singleton. <<global>>
Navegabilidad flujo de los datos con visibilidad
De atributo se refleja con la asociación, el resto se
representa con una relación de dependencia
Ejemplo de visibilidades
Del DOO hacia la Programación
Modelo de
Implementación:
entrada DCD y
los
diagramas de interacción.
Trabajo no trivial. Menos productivo en caso de no
utilizar el UP (guía de principio a fin).
Transformación
Definiciones de las clases desde los DCDs
Definiciones de
los métodos desde
los diagramas de
interacción.
XP (eXtreme Programming)
Código de test, luego código de producción
De la menos a la más acoplada
Ejemplo: Respuesta en frecuencia (1)
Ejemplo 2.2
Diseñar una aplicación que entregue la respuesta en frecuencia de los filtros analógicos
lineales. Una vez capturado el circuito eléctrico, se pasará a determinar cual es la
función de transferencia en el dominio de la frecuencia y se presentará la respuesta en
frecuencia en diagrama de Bode.
Ejemplo 2.4
Determinar las características para la aplicación de Respuesta en Frecuencia enunciada
en el ejemplo 2.2. Utilícese un esquema de dos niveles.
Captura del circuito
Interacción con el usuario para determinar el circuito analógico
Determinar la FDT del circuito lineal.
Análisis en frecuencia
Parámetros de la respuesta en frecuencia (Rango de frecuencia, intervalo en el
cálculo, lineal o en décadas)
Presentación gráfica del diagrama de Bode.
Ejemplo: Respuesta en frecuencia (2)
Actores: Ingeniero electrónico Descripción: El ingeniero elige el tipo de filtro lineal e introduce los valores de los componentes analógicos, luego elige los parámetros de la respuesta en frecuencia y la aplicación le devolverá la respuesta en frecuencia en un diagrama de Bode Precondiciones: El ingeniero conoce y sabe todos los parámetros del filtro lineal y de la respuesta en frecuencia. Poscondiciones: Se presentará en diagrama de Bode la respuesta en frecuencia del filtro capturado Curso normal: 1.0.El ingeniero introduce el circuito eléctrico (mirar caso de uso incluido de capturar el circuito) 2.0. La aplicación pide el rango de frecuencias y el intervalo aplicado en la determinación de la respuesta en frecuencia. Además se le solicitará si desea una presentación en decibelios o lineal. 3.0. La aplicación calcula la FDT del circuito y determina la respuesta en frecuencia. 4.0. Los resultados son presentados en un diagrama de Bode (módulo/argumento). Curso alternativo: 1.1 El circuito es capturado desde un fichero de descripción de componentes electrónicos tipo * CIR Excepciones: 3.0.E.1 Hay algún error de desbordamiento o de división por cero en el cálculo de la respuesta en frecuencia. Se le notificará del error matemático al usuario Inclusiones: Captura del circuito Prioridad: Máxima. Núcleo del sistema. Frecuencia de uso: Podría ser casi continuo. Reglas de negocio: Requerimientos especiales: Suposiciones de partida: Notas y documentos: Documento de adquisición de los circuitos Ejemplo: Respuesta en frecuencia (3)
Ejemplo: Respuesta en frecuencia (4)
Ejemplo: Respuesta en frecuencia (5)
Ejemplo: Respuesta en frecuencia (6)
Ejemplo: Respuesta en frecuencia (7) (Cód. Test)
cin >> eleccion;
void VistaFrecuenciaELAI::introducirCircuito(void){
cout << "Elegir entre:\n1.Filtro paso bajo primer orden.\n2.Filtro paso alto";
}
void VistaFrecuenciaELAI::introducirParametrosRespFr(void){
int eleccion;
elTipo = eleccion == 1 ? LF_1 : HF_1;
cout << "\nValor de la resistencia: "; cin
cout << "\nValor del condensador: "; cin >> condensador;
elCoordinador.ponerCircuito(elTipo,resistencia,condensador);
cout << "\nCual es la frecuencia inicial [Hz]: "; cin >> frecInicial;
>> resistencia;
cout << "\nCual es la frecuencia final [Hz]: "; cin >> frecFinal;
cout << "\nCual es el intervalo empleado para el cálculo [Hz]: ";
cin >> frecIntervalo;
elCoordinador.ponerParamResFr(frecInicial,frecFinal,frecIntervalo);
//Visualizar los resultados
std::vector<double> elVectorModulo;
elCoordinador.getModuloRespFr(elVectorModulo);
for (unsigned i =0; i<elVectorModulo.size(); i++)
cout << "Pulsar cualquier tecla para finalizar";
std::cout<<elVectorModulo[i]<<std::endl;
}
void main(void){
VistaFrecuenciaELAI laVista;
laVista.introducirCircuito();
laVista.introducirParametrosRespFr();
}
Ejemplo: Respuesta en frecuencia (8) (Cód. Prod.)
#include "FiltroLineal.h"
#include "RespuestaFrecuencia.h"
class CoordinadorFrecELAI
{
public:
FiltroLineal *pFiltro;
RespuestaFrecuencia *pRespFr;
};
int ponerCircuito(tipoFiltro ,float , float );
int ponerParamResFr(float,float,float);
int getModuloRespFr(std::vector<double> &);
~CoordinadorFrecELAI()
{if(pFiltro) delete pFiltro; if(pRespFr) delete pRespFr;}
pFiltro = new FiltroLineal(elTipo,resistencia,condensador);
return(0);
if (pFiltro == NULL) return (-1);
pRespFr = new RespuestaFrecuencia(frInicio,frFinal,frIntervalo,pFiltro);
return(0);
#include "../../include/Dominio/CoordinadorFrecELAI.h"
int CoordinadorFrecELAI::ponerCircuito(tipoFiltro elTipo,float resistencia, float condensador){
}
int CoordinadorFrecELAI::ponerParamResFr(float frInicio,float frFinal,float frIntervalo){
}
int CoordinadorFrecELAI::getModuloRespFr(std::vector<double> &elVectorModulo){
}
if (pRespFr == NULL) return (-1);
pRespFr->getModuloRespFr(elVectorModulo);
if(pFiltro) delete pFiltro;
if(pRespFr) delete pRespFr;
return (0);
Ejemplo: Respuesta en frecuencia (9) (Cód. Prod.)
#ifndef _POLINOMIO_INC_
#define _POLINOMIO_INC_
#include <vector>
class Polinomio
{
std::vector<double> coeficientes;
public:
Polinomio(){}
Polinomio(unsigned grado, double *pCoef){
for (unsigned i=0;i<=grado; i++)
}
double getCoeficiente(unsigned n)
{return( coeficientes[n]));}
};
#endif /*Polinomio.h*/
coeficientes.push_back(*(pCoef+i));
#ifndef _FDT_INC_
#define _FDT_INC_
#include "Polinomio.h"
class FDT
{
unsigned grado;
Polinomio numerador;
Polinomio denominador;
public:
FDT(unsigned n, double *pNum, double *pDen):
grado(n),numerador(n,pNum),denominador(n,pDen){}
unsigned getGrado(void){return grado;}
double getCoefNum(unsigned n)
{return n<=grado ? numerador.getCoeficiente(n) : 0;}
double getCoefDen(unsigned n)
{return n<=grado ? denominador.getCoeficiente(n) : 0;}
};
#endif /*FDT.h*/
Ejemplo: Respuesta en frecuencia (10) (Cód. Prod.)
tipoFiltro elTipo;
FDT *pFDT;
#include "FDT.h"
typedef enum{LF_1,HF_1} tipoFiltro;
class FiltroLineal
{
public:
};
FiltroLineal(tipoFiltro, float, float);
unsigned getGradoFiltro(void){return pFDT->getGrado();}
double getCoefNum(unsigned n)
{return pFDT != NULL ? pFDT->getCoefNum(n) : 0;}
double getCoefDen(unsigned n)
{return pFDT != NULL ? pFDT->getCoefDen(n) : 0;}
~FiltroLineal(){if(pFDT) delete pFDT;}
#include "../../include/Dominio/FiltroLineal.h"
FiltroLineal::FiltroLineal(tipoFiltro tipo, float resistencia, float condensador)
{
pFDT = new FDT(1,numerador,denominador);
}
elTipo = tipo;
double numerador[2]; double denominador[2];
if (elTipo == LF_1) {
}
else{
}
denominador[0]= 1;denominador[1]=resistencia*condensador;
numerador[0]=0; numerador[1]=resistencia*condensador;
numerador[0]=1; numerador[1]=0;
Ejemplo: Respuesta en frecuencia (11) (Cód. Prod.)
#include <vector>
#include "FiltroLineal.h"
class RespuestaFrecuencia
{
public:
};
float freInicio, freFinal, freIntervalo;
std::vector<double> modulo;
std::vector<double> argumento;
double calcularModulo(float,FiltroLineal *);
double calcularArgumento(float,FiltroLineal *);
RespuestaFrecuencia(float,float,float,FiltroLineal *);
float getFrInicio(void){return freInicio;}
float getFrFinal(void){return freFinal;}
float getFrIntervalo(void){return freIntervalo;}
void getModuloRespFr(std::vector<double> &elVectorModulo)
{elVectorModulo =
Comentarios de: Capítulo VI: DOO (Parte I) (0)
No hay comentarios