Metodología MVC
-
Upload
gtorrealba -
Category
Documents
-
view
301 -
download
1
description
Transcript of Metodología MVC
Coordinación del Área de Programación
Metodología usando MVC y POO con C++
Coordinación del Área de Programación
Estructuras de ControlEstructuras de ControlEsquemaIntroducciónAnálisisDiseñoDesarrolloPrueba
Coordinación del Área de Programación
Estructuras de ControlEstructuras de ControlIntroducción Programar es elaborar un producto (en este
caso es un software), y por tanto,
Es preciso cumplir una serie de etapas de análisis y diseño que permitan el logro de los requerimientos indicados por el cliente.
Además, en la medida que se hacen cada vez más complejos los programas, un buen diseño permitirá lograr más rápidamente la solución.
Coordinación del Área de Programación
AnálisisEntradasSalidasProceso
Para lo cual es importantísimo LEER las veces que sea necesario el planteamiento del problema y si
es posible consultar al cliente o usuario final
Coordinación del Área de Programación
Estructuras de ControlEstructuras de ControlAnálisis Entradas: Con qué datos se cuenta o qué
se conoce en el enunciado? Salidas: Cuál es el requerimiento o qué se
desea? Proceso: A groso modo cómo lograr la
salida teniendo una entrada dada (fórmulas, lógica).
Para consultar al cliente es recomendable usar datos de prueba, los cuales permitirán aclarar las dudas sobre el
planteamiento del problema
Coordinación del Área de Programación
Estructuras de ControlEstructuras de ControlAnálisis usando Tabla de Prueba En los encabezados de las columnas de
dicha tabla deben ir los identificadores de los valores de entradas, de los intermedios y de las salidas.
En las filas deben ir los valores que podrían tomar las entradas, y los resultados que producirían en las variables intermedias y de salidas.Dicha tabla es posible que sea más entendible por el
cliente que un diseño más avanzado o la programación como tal
Coordinación del Área de Programación
Estructuras de ControlEstructuras de ControlEnunciadoSe conoce de cada uno de los estudiantes de
una sección su cedula y nota final. Se desea conocer por cada estudiante su condición, sabiendo que si tiene nota mas de 80 es Excelente, entre 60 y 80 ambos inclusive es Bueno, entre 48 y 59 ambos inclusive es Suficiente, entre 30 y 48 es Deficiente y sino es Malo. Además, por la sección se quiere saber el porcentaje de aprobados y el porcentaje de aplazados.
Coordinación del Área de Programación
Estructuras de ControlEstructuras de ControlEntradas: cédula (long) y nota (float)Salidas: Por estudiante -> Condicion Por Seccion: Porc. Aprobados y Porc. AplazadosProceso: Condicion: si (nota > 80) “ Excelente ” sino si (nota >= 60) “ Bueno ”
sino si (nota >= 48) “ Suficiente ” sino si (nota > 30) “ Deficiente ” sino “ Malo ”
PorcAprob = cont_aprob * 100 / Cont_Tot PorcAplaz = cont_aplaz * 100 / Cont_Tot Cont_Tot = cont_aprob + cont_aplaz
Coordinación del Área de Programación
Estructuras de ControlEstructuras de ControlParte 2 del Análisis
Cont_Tot = cont_aprob + cont_aplazPorcAprob = 3 * 100 / 4 = 75%PorcAplaz = 1 * 100 / 4 = 25%
cedula nota Condición cont_aprob
cont_aplaz
1111 90 Excelente 12222 40 Deficiente 13333 50 Suficiente 24444 70 Bueno 3
Entradas
Salida Clase Menor
Salidas por Sección
Este análisis
permitirá que el
cliente diga si
vas bien
Valores Intermedios
Coordinación del Área de Programación
Diseño Se conoce de cada uno de los estudiantes de una sección su cedula y nota final. Se desea conocer por cada estudiante su condición, sabiendo que si tiene nota mas de 80 es Excelente, entre 60 y 80 ambos inclusive es Bueno, entre 48 y 59 ambos inclusive es Suficiente, entre 30 y 48 es Deficiente y sino es Malo. Además, por la sección se quiere saber el porcentaje de aprobados y el porcentaje de aplazados.
1- Resalta las entidades que participan, las mismas son candidatas a
clasescedula y nota serán atributos de la clase Estudiante, pues Sección no tiene esas carácterísticas
2- Los valores de entrada son propiedades o
características de un Estudiante, luego son
atributos de la clase menor
Coordinación del Área de Programación
Diseño Las salidas que se requieren tanto por el Estudiante como por la Sección, serán valores calculados y por consiguiente métodos de la clase respectiva. Así, Condición será un método de la clase Estudiante.
3- La entidad que puede dar
respuesta al requerimiento también es una
clase
if (nota >= 48) cont_aprob++else cont_aplaz++
5- Este razonamiento es una
excelente abstracción del
método Seccion.ProcesarEst
()
PorcAprob = cont_aprob * 100 / ContTotalPorcAplaz = cont_aplaz * 100 / ContTotalContTotal = cont_aprob + cont_aplaz
4- Los cálculos por la Sección
son métodos de la clase
Seccion
Coordinación del Área de Programación
Diseño
MSeccion- cont_aprob: int- cont_aplaz: int+ MSeccion()+ PorcAprob():float+ PorcAplaz(): float+ ContTotal (): int+ ProcesarEst (e: MEstudiante): void
MEstudiante- cedula : long- nota : float+ MEstudiante()+ MEstudiante(c:long,n:float)+ SetCedula (c: long): void+ SetNota (n: float) : void+ GetCedula (): long+ GetNota(): float+ Condicion(): string
6- Ahora si podemos construir el diagrama de clases. En este caso con relación de uso y aplicando el
patrón MVCComo se pide la condición del estudiante, esa es una salida por la clase menor o clase parte,
por lo tanto debe ser una relación de uso
Coordinación del Área de Programación
DiseñoEn el patrón MVC mejorado, la Vista y el Modelo no se comunican
directamente, solo a través del Controlador
VISTAMODELO
CONTROLADOR
Se encarga de las
operaciones de
entrada y salida
Se encarga
de la lógica en sí del
problema
Se encarga de controlar y
comunicar el Modelo con la
Vista
Coordinación del Área de Programación
DiseñoMEstudiante
- cedula : long- nota : float+ MEstudiante()+ SetCedula (long): void+ SetNota (n: float) : void+ GetCedula (): long+ GetNota(): float+ Condicion(): string
MSeccion- cont_aprob: int- cont_aplaz: int
+ MSeccion()+ PorcAprob():float+ PorcAplaz(): float+ ContTotal (): int+ ProcesarEst (e: MEstudiante): void
En Programación orientada a objeto, todo debe estar en función de objeto por ello, aplicaremos el
patrón MVC
En el patrón de diseño
MVC a esta parte del
diagrama de clases se le coloca una M delante
del nombre porque
corresponden al Modelo.
Coordinación del Área de Programación
DiseñoVEstudiante
+ VEstudiante()+ LeerCedula() : long+ LeerNota() : float+ ImprimirEstudiante (c: long, cond: string) : void
VSeccion
+ VSeccion()+ ImprimirSeccion(porc_aprob:float, porc_aplaz: float):void
En MVC esta parte del diagrama de clases
corresponde a la Vista por eso le pondremos
una V delante del nombre
Coordinación del Área de Programación
Controlador- mestud : MEstudiante- mseccion: MSeccion- vestud : VEstudiante- vseccion : VSeccion
+ Controlador()+ ProcesarSeccion() : void
En MVC esta parte del diagrama de
clases corresponde al
Controlador, que es quien tiene la lógica que iba en
el cuerpo principal o main
#include <iostream>#include <cstdlib>#include "Controlador.h"//Incluye la clase
Controladorusing namespace std;
int main(){ Controlador control;
control.ProcesarSeccion(); return 0;}Quedando el cuerpo principal del programa solo con la llamada al Controlador
Coordinación del Área de Programación
Diagrama de Clases CompletoMestudiante
- cedula: long- nota: float
+MEstudiante()+MEstudiante(long, float)+ SetCedula(c:long): void+ SetNota(n: float): void + GetCedula(): long+ GetNota( ):float + Condicion():string
VEstudiante
+ VEstudiante()+ LeerCedula(): long+ LeerNota(): float+ ImprimirEstudiante (c: long, cond: string): void
Controlador
- mestud: MEstudiante- vestud: VEstudiante- mseccion: MSección- vseccion: Vsección
+ Controlador()+ ProcesarSeccion(): void
VSeccion
+ VSeccion()+ ImprimirSeccion (porc_aprob: float, porc_aplaz: float): void
MSeccion
- cont_aprob: int- cont_aplaz: int
+ MSeccion()+ ProcesarEst(e: MEstudiante): void+ ContTotal(): int+ PorcAprob(): float+ PorcAplaz(): float
Coordinación del Área de Programación
//Interfaz Clase MEstudiante#ifndef MESTUDIANTE_H#define MESTUDIANTE_H#include <string>using namespace std;class MEstudiante{ private: long cedula; float nota; public: MEstudiante(); MEstudiante(long, float); void SetCedula(long); void SetNota(float); long GetCedula(); float GetNota(); string Condicion();}; #endif
//Implementación clase Mestudiante#include "MEstudiante.h"MEstudiante :: MEstudiante(){}MEstudiante :: MEstudiante(long c, float n){ cedula = c; nota = n;}void MEstudiante :: SetCedula(long c){ cedula = c;}float MEstudiante :: GetNota(){ return nota;}string MEstudiante :: Condicion(){ if (nota > 80) return " Excelente "; else if (nota >= 60) return " Bueno "; else if (nota >= 48) return " Suficiente "; else if (nota > 30) return " Deficiente "; else return " Malo ";}
void MEstudiante :: SetNota(float n){ nota = n;}long MEstudiante :: GetCedula()
{ return cedula;}
Coordinación del Área de Programación
//Interfaz clase Msección#ifndef MSECCION_H#define MSECCION_H#include "MEstudiante.h"class MSeccion { private: int cont_aprob, cont_aplaz; public: MSeccion(); void ProcesarEst(MEstudiante e); float PorcAprob(); float PorcAplaz();
int ContTotal();};#endif
//Implementación clase Msección#include "MSeccion.h"MSeccion :: MSeccion(){ cont_aprob = cont_aplaz = 0;}void MSeccion :: ProcesarEst(MEstudiante e){
if (e.GetNota() >= 48) ++cont_aprob; else ++cont_aplaz ;}float MSeccion :: PorcAprob(){ if (ContTotal() == 0) return 0; else return cont_aprob*100 / ContTotal();}float MSeccion :: PorcAplaz(){ if (ContTotal() == 0) return 0; else return cont_aplaz*100 / ContTotal();}
int MSeccion :: ContTotal(){ return cont_aprob + cont_aplaz;}
Coordinación del Área de Programación
//Interfaz Clase VEstudiante#ifndef VESTUDIANTE_H#define VESTUDIANTE_H#include <iostream>#include <cstdlib>#include <string>using namespace std;class VEstudiante{public: VEstudiante(); void ImprimirEstudiante(long,string); long LeerCedula(); float LeerNota();};#endif
//Implementación clase Vestudiante#include "VEstudiante.h"VEstudiante :: VEstudiante(){}long VEstudiante :: LeerCedula(){ long c; cout << "Cedula: "; cin >> c; return c;}float VEstudiante :: LeerNota(){ float n; cout << "Nota: " ; cin >> n; return n; }
void VEstudiante :: ImprimirEstudiante(long c, string cond){ cout << " DATOS DEL ESTUDIANTE " <<endl; cout << " Cedula: " << c << endl; cout << " Condicion: " << cond << endl; system ("PAUSE"); }
Coordinación del Área de Programación
//Implementación clase Vseccion#include "VSeccion.h"VSeccion :: VSeccion(){}void VSeccion :: ImprimirSeccion(float porc_aprob, float porc_aplaz){ cout << " ESTADISTICAS DE LA SECCION “<<endl; cout << " Porc. Aprobados: " <<setiosflags(ios::fixed)<<setprecision(2)<<porc_aprob<<endl; cout << " Porc. Aplazados: " <<setiosflags(ios::fixed)<<setprecision(2)<<porc_aplaz<<endl; system ("PAUSE"); }
//Interfaz Clase VSeccion#ifndef VSECCION_H#define VSECCION_H#include <iostream>#include <iomanip>#include <cstdlib>using namespace std;class VSeccion{public: VSeccion(); void ImprimirSeccion(float,float);}; #endif
Coordinación del Área de Programación
//Interfaz Controlador#ifndef CONTROLADOR_H#define CONTROLADOR_H#include <iostream>#include <cstdlib>#include "MEstudiante.h"#include "MSeccion.h"#include "VEstudiante.h"#include "VSeccion.h“using namespace std;class Controlador{private: MEstudiante mestud; MSeccion mseccion; VEstudiante vestud; VSeccion vseccion;public: Controlador(); void ProcesarSeccion();};#endif
//Implementación clase Controlador#include "Controlador.h“Controlador :: Controlador(){}void Controlador :: ProcesarSeccion(){// Variables para lectura de datos por teclado int resp; float n; long c; do{ system("cls");//limpia la pantalla c = vestud.LeerCedula(); n = vestud.LeerNota(); mestud.SetCedula(c); mestud.SetNota(n); vestud.ImprimirEstudiante(mestud.GetCedula(),
mestud.Condicion()); mseccion.ProcesarEst(mestud); //Procesa Estudiante cout << "Desea procesar otro estudiante? (1)Si - (2)No : "; cin >> resp; }while (resp == 1); system("cls");//vuelve a limpiar la pantalla vseccion.ImprimirSeccion(mseccion.PorcAprob(),
mseccion.PorcAplaz());}