1 / 23

Paradigmas e Ferramentas de Engenharia de Software

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 )

carrington
Download Presentation

Paradigmas e Ferramentas de Engenharia de Software

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Paradigmas e Ferramentas de Engenharia de Software Programação Multi-Paradigma em C++

  2. 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

  3. 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)

  4. 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

  5. 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

  6. 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 ?

  7. 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)

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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 }

  13. 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

  14. 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

  15. 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 );

  16. 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++

  17. 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

  18. Análise de Variabilidade

  19. 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

  20. 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

  21. 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

  22. “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);

  23. “Templates”

More Related