24
Técnicas 1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Embed Size (px)

Citation preview

Page 1: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 1

Paradigmas e Ferramentas de Engenharia de Software

Parte ITécnicas de Programação em C++

Page 2: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 2

INPE

Objetivo

Discutir técnicas de programação em C++ Rever as principais características da linguagem Discutir aspectos conceituais de projeto de classes

Temas apresentados Classes x objetos Forma canônica normal de uma classe Templates e Ponteiros “inteligentes” Técnicas de projeto de conjunto de classes

Page 3: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 3

INPE

Referências

Livros básicos “Effective C++”, S.Meyers “More Effective C++”, S.Meyers “Advanced C++ Programming Styles and Idioms”, J. Coplien

Referências adicionais “C++ FAQs”, M. Cline and G.Lomow “C++ Strategies and Techniques”, R. Murray “C++ Programming Style”, T. Cargill

Page 4: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Introdução 4

INPE

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 ?

Page 5: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 5

INPE

Projeto de Classes

Classe abstração - conceito fundamental em programação classe - expressão de abstração em C++ descreve as propriedades comuns dos objetos instanciados

Características “classes são tipos reais, são como “int” e “float” (Meyers)”. “projetar uma classe envolve descreve todas as situações

possíveis de seu uso.” “a interface de cada classe deve ser completa e mínima”.

Page 6: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 6

INPE

Projeto de Classes: Componentes

construtores e destrutores construtor de cópia operador = (atribuição)

funções da classe membros da classe funções “amigas” (“friends”) funções globais que utilizam a classe

parâmetros das funções referências x ponteiros

Page 7: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 7

INPE

Forma Canônica “Normal”

class Exemp {

public:

Exemp(); // construtor

virtual ~Exemp(); // virtual se classe base

protected:

// Dados que meus filhos precisam

private:

// Meus dados pessoais

Exemp (const Exemp& rhs) {} // construtor de copia

Exemp& operator= (const Exempl& rhs) {}// atribuicao

}

Page 8: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 8

INPE

Projeto de Classes

class String {

private:

char *data_;

public:

String ( const char* value )

{ if (value) {

data_ = new char[strlen(value) + 1];

strcpy ( data_, value) }

else data_ = new char[1]; *data_ = ‘\0’; }

~String() { delete [] data_;}

} quais os problemas desta classe ?

Page 9: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 9

INPE

Operadores Implícitos em C++

C++: implementação “default” do construtor de cópia e do operador= ( cópia membro-a-membro)

Exemplo:String a (“Adeus”);

String b (“Mundo Cruel”);

String c;

c = b = a; // E agora ???

a

data

Adeus MundoCruel

data

ba

data

Adeus MundoCruel

data

b

ANTESDEPOIS

Page 10: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 10

INPE

Operadores Implícitos em C++

Regra: Implemente o construtor de cópia e o operador= para todas

as classes com alocação dinâmicaString::String ( const String& rhs )

{ if ( rhs.data_ )

data_ = new char [ strlen (rhs) + 1 ];

strcpy ( data_, rhs.data_ );

else

data_ = 0;

}

Page 11: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 11

INPE

Operadores Implícitos em C++

Operador= Lembre de checar sobre auto-referência Retorne uma referência ao objeto

String&

String::operator= (const String& rhs)

{

if ( this == &rhs )

return *this;

if ( rhs.data_ )

delete [] data_;

data_ = new char [ strlen (rhs) + 1 ];

strcpy ( data_, rhs.data_ );

else data_ = 0;

return *this;

}

Page 12: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 12

INPE

Operadores Implícitos em C++

Operador = Exemplo:

string a (“Adeus Mundo Cruel”);

// Auto-referencia ( requer teste do operador = )

a = a ;

string b,c,d;

// Cadeias ( requerem retorno de referencia)

b = c = d = a;

// Compilador implementa

// b.operator= (c.operator= (d.operator = (a))));

Page 13: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 13

INPE

Funções de classe: Alternativas

membros da classe

funções amigas funções globais funções estáticas

Page 14: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 14

INPE

Referências x ponteiros

Referências em C++ nome “alternativo” para um objeto

string collor = “Fernando Collor”;

string& cassado = collor; // aponta para o mesmo endereco

Usos de referências passagem de parâmetros em métodos : evita instanciacao

void Exemp::Metodo (const C1& obj1, const C2& obj2 );

retorno de valores (e.g. dados de classe)class Aluno {

private:

string nome_;

public:

string& Nome() const

{ return nome_; }

Page 15: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 15

INPE

Referências x Ponteiros

Diferências semânticas em passagem de parâmetros Passagem por referência

mantém a “propriedade” do objeto Passagem por ponteiro

transmite o direito de “propriedade” do objeto ex:

class Aluno {

private:

string nome_;

public:

string& Nome() const { return nome_; }

char* Nome() { return nome_; }

Page 16: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 16

INPE

Referências x Ponteiros

Regras passe e retorne parâmetros por referência constante sempre que

possível retorne valores (e não referências) quando criar objetos

ex:class Complex {

private:

double real_, im_;

public:

Complex& operator + ( const Compl& lhs,

const Compl& rhs )

{ Complex result ( lhs.real_ + rhs.real_ ,

lhs.im_ + rhs.im_ );

return result;

}

Page 17: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 17

INPE

Tipos parametrizados (“templates”)

Implementam estruturas de dados e algoritmos genéricos (independentes dos tipos de objetos)

Código gerado em tempo de compilação Ferramentas extremamente poderosas de programação Definição

template <class T>

class Stack {

private:

// detalhes omitidos…

public:

Stack();

bool IsEmpty();

void Push ( const T& obj);

T Pop();

}

Page 18: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 18

INPE

Tipos parametrizados (“templates”)

Implementaçãotemplate <class T>

void

Stack::Push ( const T& obj )

{ myList_.push_front ( obj ); }

template < class T>

T

Stack::Pop ()

{ return myList_.top ( obj );

UsoStack <int> pilhaDeInteiros;

Stack <string> pilhaDeNomes;

Page 19: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 19

INPE

Tipos Parametrizados (“templates”)

STL - Standard Template Library parte do padrão C++ (aprovado em 1997) elementos da STL: componentes, iteradores e algoritmos

Componentes organizações de coleções de objetos

list, set, stack, map, multiset, multimap

Iteradores ponteiros que percorrem os componentes

Algoritmos funções que são aplicáveis aos componentes

find, erase, sort, merge, push, pop

Page 20: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 20

INPE

Tipos Parametrizados (“templates”)

“Ponteiros Inteligentes” - auto_ptr objetos projetados para funcionar como ponteiros maior funcionalidade

Controle sobre comportamento de ponteiros construção e destruição - elimina vazamento de recursos cópia e atribuição dereferenciamento - decisão sobre o acesso ao ponteiro

verdadeiro Uso:

tradicional Canvas* c = new Canvas;

inteligenteauto_ptr<Canvas> canvObj = new Canvas;

Page 21: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 21

INPE

Projeto de Classes: Alternativas

Como construir um conjunto de classes ? Alternativas de projeto de classes

Usar diferentes parâmetros nos construtores Estabelecer hierarquia de classes (“herança” ou “IS_A”) Fazer composição de classes (“HAS_A”) Parametrizar tipos (uso de “templates”)

Quando usar cada uma destas técnicas ?

Page 22: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 22

INPE

Projeto de Classes: Recomendações

Programe para uma interface, nunca para uma implementação (GoF)

Derive, sempre que possível, de classes abstratas (Myers, Struostrup)

Prefira agregação de objetos à herança (GoF)

Parametrize algoritmos e estruturas genéricas com “templates” (Stepanov)

Page 23: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 23

INPE

Classes: Herança x Composição

Herança expressar interfaces comuns e comportamento diferente classes base definem parte do comportamento das classes

derivadas definida em tempo de compilação herança quebra o princípio da modularidade solução: herdar de classes base abstratas e procurar não

estender a interface Composição

definida em tempo de execução requer o respeito a modularidade permite o uso de delegação

Page 24: Técnicas1 Paradigmas e Ferramentas de Engenharia de Software Parte I Técnicas de Programação em C++

Técnicas 24

INPEClasses: Herança x Tipos Parametrizados

Templates expressam nomes e estruturas de implementação comuns definidos em tempo de execuçãotemplate <class T>

class Image {

public:

Image ( int nlin, int ncols, const string& fileName );

~Image ();

T& operator() (int lin, int col){

return ptrMemory_ [ lin*nLines_ + col ]; }

private:

T* ptrMemory_;

int nLines_, nCols_;

string fileName_;

}