230 likes | 403 Views
Paradigmas e Ferramentas de Engenharia de Software. Programação Multi-Paradigma em C++. O que é programar?. Definir o objetivo de um sistema Universo, resultados esperados Observar o mundo real Formalizar o observado encontrar conceitos comuns ( comunalidade )
E N D
Paradigmas e Ferramentas de Engenharia de Software Programação Multi-Paradigma em C++
O que é programar? • Definir o objetivo de um sistema • Universo, resultados esperados • Observar o mundo real • Formalizar o observado • encontrar conceitos comuns (comunalidade) • modelar a variabilidade do universo • requer modelo mental de como o universo se organiza • e.g, programação orientada-a-objetos
O que é programar? • Bons programas são confiáveis, fáceis de compreender, modificar e manter (Veloso) • Bons programas são legíveis (Goldberg) • Bons programas são bem estruturados (Liskov) • “A diferença entre um bom e um mau programa é como a diferença entre o axé music e Tom Jobim” • durabilidade (qualidade e facilidade de adaptação)
O que é programar? • Decompor problemas por abstrações • conceitos traduzidos em módulos • subproblemas resolvíveis independentemente • Organizar a interrelacionamento de abstrações • processamento “batch” - linear • processamento WIMP e distribuido - não-linaer • espaço de estados enorme e não-modelável • Dificuldade essencial de programação • organizar, implementar e validar conceitos • software é mais complexo que outros artefatos
Motivação • O que é C++ ? • Uma melhoria da linguagem C com maior controle de tipos ? • Uma linguagem para programação orientada-a-objetos ? • Uma linguagem que incorpora avanços de engenharia de software nos anos recentes ? • Uma linguagem que suporta múltiplos estilos de programação ? • Uma linguagem que está em vistas de extinção e logo sera totalmente substituída por JAVA ? • Bjarne Stroustrup • www.research.att.com/~bs Introdução
Motivação • Evolução da linguagem C++ • múltiplos paradigmas de programação • várias alternativas para resolver o mesmo problema ( herança, templates, #ifdef, switch/case, function overloading) • como escolher o paradigma mais apropriado ? • como combinar os diferentes paradigmas ?
Motivação • Programação multi-paradigma • utilizando todo o potencial de C++ • objetivo: código mais geral e mais preparado para mudanças • Referências • “Multi-paradigm Design for C++” (Coplien) • “Design Patterns” (Gamma et al.) • “C++-3a. Edição” (Stroustroup) • “Ruminations on C++” (Koenig)
Paradigmas de Programação • Evolução da “Engenharia de Software” • Parnas: ES como engenharia (usar a técnica mais adequada para cada problema) • C++: linguagem multi-paradigma • suporta diferentes estilos de programação • programação algoritmica (“procedimental”) • programação estruturada • programação orientada-a-objetos • programação genérica Introdução
Programação Algoritmica • Paradigma: • “Decida quais subrotinas necessita; utilize o melhor algoritmo que encontar”. • Linguagens típicas: FORTRAN, C • Exemplo: • raiz quadrada • double sqrt (double arg) • { • // codigo para raiz quadrada • } Introdução
Programação Estruturada • Paradigma: • “Estabeleça o fluxo de dados; projete procedimentos que realizam operações bem-definidas sobre estes dados”. • fluxo de dados é explicito • Exemplo • Transação bancária (validação de CPF) • string CPF = ObtenhaCPF(); • long numCPF = ExtraiNumCPF ( CPF ); • int contrl = ExtraiDigito ( CPF ); • int valid = ChecaValid ( numCPF, contrl ); • linguagens típicas : CLIPPER, SQL Introdução
Programação Orientada-a-Objetos • Paradigma: • “Organize as entidades do espaço do programa em classes. Utilize herança para explicitar propriedades comuns”. • Princípios: • Abstração - classes e objetos • Herança e Encapsulamento - gerar novas abstrações a partir de classes existentes • Polimorfismo - acoplamento em tempo real. Introdução
Programação Orientada-a-Objetos • “Suas classes são coisas bastante concretas, tanto quanto int ou float” (Myers) • Ex: classe para representar datas • deve prover: construtores, funções de exame e manipulação (sem acesso aos detalhes internos). • Tipos simples podem ser re-utilizados à vontade class Date { public: // Interface publica, consistindo de funcoes // nao virtuais private: // representacao e demais detalhes de implementacao }
Reutilizando um classe concreta Opção 1 - Derivação class MyDate: public Date { // Erro! Nao fazer ..! } O que é valido para “MyDate” será válido para “Date” ? “Derivar de tipos concretos é quase sempre um erro, pois estes são entidades auto-contidas.” (B.S.) Opção 2 - Encapsulamento class DateAndTime { public: // Agora sim... Private: Date myDate_; Time myTime_; } Reuso simples e eficiente. Programação Orientada-a-Objetos
Programação Genérica • Paradigma: “Defina as estruturas e algoritmos que precisa e faça-os genéricos utilizando “templates”” • Motivação • o que é uma ordenação ? Uma classe ou um algoritmo ? Como aplicar a idéia de ordenação a diferentes tipos de dados ? • Idéia • conceitos independentes -> representados separadamente e combinados quando necessário. Introdução
Programação genérica template<class C, class E> int cnt (C& c, E& elem ) { return count (c.begin(), c.end(), elem ); } (...) vector < char* > myVect; // vetor de caracteres C++ list<float> myList; // lista de cadeais //.. int count1 = cnt ( myVect, “Miguel” ); int count2 = cnt ( myList, 23.5 );
Projeto Multi-paradigma • Definir domínio do problema (termos, conceitos) • Identificar categorias comuns • Descobrir a variabilidade • Estabelecer o domínio de solução • Mapear para implementação em C++
Exemplo • Dispositivo de saída • Aspectos comuns • capacidade de apresentação gráfica • tecnologia matricial (“bitmaps”) • Aspectos de variabilidade • tipos de display: 8,16,24 bits de profundidade • bibliotecas de suporte: MFC, Xwindow, OpenGL • meio de saída: tela, impressora
Definição do domínio • Dimensões de “comunalidade” • Estrutura de dados • Nome e comportamento • Algoritmos • Definir conceitos de forma geral • Adiar decisões de implementação • classe C++: nome, comportamento e estrutura
Domínio de Soluções em C++ • Dados • agrupa famílias de valores relacionados • Superposição (overloading) • famílias de funções relacionadas • Templates • algoritmos e estruturas de dados relacionados • Herança • classes com mesmo comportamento • Herança com funções virtuais • classes com “late binding” • Preprocessador (#ifdef) • variações em detalhe de código e dados
Dados em C++ • Mecanismos • classes intrínsecas (int, float), estruturas (structs) • Comunalidade • estrutura e comportamento • Variabilidade - estados • itens de dados variam apenas em seu estado • Ligação • tempo de execução (valor do dado mudado em tempo de execução) • Exemplos • Filtros de restauração para imagens LANDSAT, SPOT e CBERS
“Overloading” • Comunalidade • Nome, tipo de retorno, semântica • Variabilidade • algoritmo e interface (cada função tem seu conjunto de parâmetros formais) • Ligação • tempo de compilação • Exemplos • int pow (int, int) • double pow (double, double); • complex pow (double, complex); • complex pow (complex, double);