Vous êtes sur la page 1sur 41

PCS 3111

Laboratrio de Programao Orientada a


Objetos para Engenharia Eltrica

Aula 4: Encapsulamento

Escola Politcnica da Universidade de So Paulo


Agenda

1. Princpios da modularizao
2. Encapsulamento
Mtodos e Atributos Pblicos e Privados
3. Coeso
4. Acoplamento
5. Mtodos Setters/Getters
6. Processo de Compilao e Ligao
7. Organizao de Arquivos: extenses .cpp e .h
8. Primitivas de Compilao: include e ifndef
PCS / EP / USP 2017 PCS 3111 Aula 4 2
Princpios da modularizao

PCS / EP / USP 2017 PCS 3111 Aula 4 3


Introduo

! Uma boa prtica no desenvolvimento de


software quebrar a soluo em mdulos
(discutido nas aulas anteriores);

! Um dos critrios (princpios) para modularizao


a ocultao da informao.

PCS / EP / USP 2017 PCS 3111 Aula 4 4


Ocultao de Informaes
! Uma soluo modular esconde detalhes do
mdulo de outros mdulos
! Especifica um mdulo do ponto de vista externo
! Separa o propsito de um mdulo de sua
implementao
! Restringe o acesso de outros mdulos a
detalhes de implementao e a qualquer
estrutura de dados do mdulo;
! Em desenvolvimento de software a ocultao de
informaes definida como Encapsulamento.

PCS / EP / USP 2017 PCS 3111 Aula 4 5


Encapsulamento

PCS / EP / USP 2017 PCS 3111 Aula 4 6


Encapsulamento
Encapsulamento em programao orientada a
objetos capacidade de ocultao de detalhes de
implementao de uma classe por parte de outras
classes que a manipulam.

! O encapsulamento esconde detalhes da classe


que no essenciais para compreender suas
caractersticas;
! O encapsulamento permite o acesso a membros
privados da classe (atributos e mtodos) atravs
de uma interface bem definida de acesso
(mtodos).

PCS / EP / USP 2017 PCS 3111 Aula 4 7


Encapsulamento
Interface de acesso (Exemplo: mtodos)

Membros da Classe
(Exemplo: atributos)

! Encapsulamento em classes de objetos


implementado em C++ utilizando-se: Private e
Public.
PCS / EP / USP 2017 PCS 3111 Aula 4 8
Private e Public em C++
class X { // Classe de nome X
public: // Membros Pblicos
// interface para acesso externo
// a Classe X.
// Mtodos e atributos.

private: // Membros privados


// detalhes de implementao da Classe,
// acessvel somente pelos membros
// dessa classe.
// Mtodos e atributos.
};

PCS / EP / USP 2017 PCS 3111 Aula 4 9


Exemplo em C++
EX01
8 class Carro {
9 private:
10 string fabricante;
11 int quilometragem;
12 public:
13 string cor;
14 void iniciaCarro (string f, string c);
15 void exibeCarro();
16 };
17
18 void Carro::iniciaCarro (string f, string c) {
19 fabricante = f;
20 cor = c;
21 quilometragem = 0;
22 }
23
24 void Carro::exibeCarro() {
25 cout << "Dados do Carro: " << endl;
26 cout << "fabricante: " << fabricante << endl;
27 cout << "cor: " << cor << endl;
28 cout << "quilometragem: " << quilometragem << endl;
29 }
PCS / EP / USP 2017 PCS 3111 Aula 4 10
Private e Public em C++
! Membros de Classes so privados por default. Ex:
class X {
int mf();
//
};
! Significa:
class X {
private:
int mf();
//
};
! Assim:
X *x; // Varivel x referencia um objeto da Classe X
x = new X;
int y = x->mf(); // erro: mf private(inacessvel fora
// da classe X)

EX02
PCS / EP / USP 2017 PCS 3111 Aula 4 11
Coeso

PCS / EP / USP 2017 PCS 3111 Aula 4 12


Coeso
! Definio: o grau em que as responsabilidades de um
nico componente formam uma unidade significativa.
(Budd, 2005)

! Coeso avalia o quanto os membros (atributos e


mtodos) de uma classe esto relacionados entre si.

! Coeso uma mtrica que pode ser classificada como


Alta (membros fortemente relacionados) ou Baixa
(membros pouco relacionados).

! Coeso Alta imprescindvel em programao modular.

! Entende-se que uma classe tem Coeso Alta quando os


membros de uma classe esto relacionados a um tema
comum e tem o mesmo objetivo.
PCS / EP / USP 2017 PCS 3111 Aula 4 13
Exemplo de Coeso Alta

class Relogio { EX03


private:
int hora;
int minuto;
int segundo;
public:
void iniciaRelogio (int h, int m, int s);
void incrementaMinuto();
void exibeHora();
}

!. Observe que todos os membros da Classe


esto relacionados com Relgio.

PCS / EP / USP 2017 PCS 3111 Aula 4 14


Exemplo de Coeso Baixa
class Relogio { EX04
private:
int hora;
int minuto;
int segundo;
bool acesa;
public:
void iniciaRelogio (int h, int m, int s);
void incrementaMinuto();
void exibeHora();
void ligaLampada();
};
! Observe que os membros acesa e ligaLampada no
esto relacionados com o conceito de Relgio e sim
com Lmpada.

PCS / EP / USP 2017 PCS 3111 Aula 4 15


Exemplo de Coeso Baixa
7 class Aluno { EX05
8 private:
9 string nome;
10 int p1, p2, p3;
11
12 public:
13 void setNome (string nome);
14 string getNome();
15 void iniciaAvaliacao (int p1, int p2, int p3);
16 int calculaMedia();
17 };

! Observe que a classe Aluno inclui tambm o


conceito de notas e clculo de mdia.

PCS / EP / USP 2017 PCS 3111 Aula 4 16


Exemplo de Coeso Alta
7 class Avaliacao { EX06
8 private:
9 int p1, p2, p3;
10
11 public:
12 void iniciaAvaliacao (int p1, int p2, int
p3);
13 int calculaMedia();
14 };
15
16 class Aluno {
17 private:
18 string nome;
19 Avaliacao *avaliacao;
20
21 public:
22 void setNome (string nome);
23 string getNome();
24 void setAvaliacao (Avaliacao *nota);
25 };
! Observe que as classes Aluno e Avaliacao foram
definidas separadamente.
PCS / EP / USP 2017 PCS 3111 Aula 4 17
Acoplamento

PCS / EP / USP 2017 PCS 3111 Aula 4 18


Acoplamento
! Definio: descreve a relao entre os componentes de
software (Budd, 2005).

! Acoplamento avalia o inter-relacionamento entre as classes.

! Acoplamento uma mtrica e pode ser classificado como


Alto/Forte (alta interdependncia entre as classes) ou Baixo/
Fraco (baixa interdependncia entre as classes).

! Classes que tm um Acoplamento Baixo so mais


independentes entre si. O inverso vale para Acoplamento
Alto.

! Como regra geral deve-se minimizar sempre que possvel o


acoplamento entre classes.

PCS / EP / USP 2017 PCS 3111 Aula 4 19


Exemplo de Acoplamento
17 class Lampada { EX07
18 private:
19 bool acesa;
20 public:
21 void ligar();
22 void desligar();
23 void ligarNoite (Relogio *horaAtual);
24 };
25
26 void Lampada::ligar() { Observe os seguintes
27 acesa = true; aspectos de acoplamento:
28 } ! A classe Lampada tem
29 acesso direto ao atributo do
30 void Lampada::desligar() { objeto da classe Relogio;
31 acesa = false;
32 }
33 ! A classe Lampada utiliza
34 void Lampada::ligarNoite (Relogio *horaAtual) { diretamente um valor de
35 int hora; atributo da classe Relogio
36 hora = horaAtual->hora; para decidir se noite.
37
38 if (hora >= 18) acesa = true;
39 else acesa = false;
40 }
PCS / EP / USP 2017 PCS 3111 Aula 4 20
Exemplo de Acoplamento
7 class Relogio { EX08
! .
8 private:
9 int hora, minuto, segundo;
10 public:
11 bool ehNoite();
Soluo para diminuir o
12 // outros metodos.. Acoplamento da Classe Lampada:
13 };
14
! Remoo do cdigo que
15 class Lampada {
acessa diretamente o atributo
do objeto da classe Relogio.
16 private:
17 bool acesa; ! A classe Lampada no
18 public: necessita conhecer quais
19 void ligar();
valores especficos da hora
20 void desligar();
que determinam se noite. A
21 void ligarNoite (Relogio *horaAtual);
definio de noite ficou restrita
classe Relogio.
22 };
23
24 bool Relogio::ehNoite() {
25 return hora >= 18;
26 }
27
28 void Lampada::ligarNoite (Relogio *horaAtual) {
29 if (horaAtual->ehNoite()) acesa = true;
30 else acesa = false;
PCS / EP / USP 2017 PCS 3111 Aula 4
31 } 21
Exemplo de Acoplamento
16 class Lampada { EX09
17 private:
18 bool acesa;
19 public:
20 void ligar(); Outra soluo com
21 void desligar(); acoplamento ainda menor:
22 void ligarNoite (bool ehNoite); ! A classe Lampada no
23 bool isAcesa(); depende mais do Relogio
24 }; (nem sabe que o Relogio
... existe)
44 void Lampada::ligarNoite (bool ehNoite) {
45 acesa = ehNoite; ! Algum (o main no caso)
46 } quem passa a informao
para a Lampada
52 int main () {
53 Lampada *l = new Lampada;
54 l->desligar();
55 Relogio *r = new Relogio();
...
58 l->ligarNoite(r->ehNoite());
...
61 }
PCS / EP / USP 2017 PCS 3111 Aula 4 22


Exemplo de Acoplamento
! Existem vrias possveis solues
Qual a melhor? Receber o relgio ou um booleano?
! ...depende se importante separar completamente Relgio
de Lmpada...

Projeto OO

PCS / EP / USP 2017 PCS 3111 Aula 4 23


Mtodos Setters/Getters

PCS / EP / USP 2017 PCS 3111 Aula 4 24


Uso de mtodos Setters/Getters
! Os mtodos Mutators (setters) e Accessors (getters)
so utilizados para alterar e acessar atributos
declarados como privados.

! Os mtodos setNome/getNome so utilizados para


encapsular a manipulao direta dos atributos de
uma classe.

! Esses mtodos permitem esconder detalhes


especficos de inicializao, validao e acesso aos
atributos.

! Em C++ os mtodos setNome/getNome podem ser


utilizados para manipular os atributos declarados
como privados.
PCS / EP / USP 2017 PCS 3111 Aula 4 25
Exemplo de uso de setNome/getNome
class Quadrado {
private:
double lado; ! Atributo local da classe
public:
bool setLado (double l);
declarado como privado.
double getLado(); ! Mtodos setLado/getLado
}; para inicializao e acesso
bool Quadrado::setLado (double l) {
ao atributo lado.
if (l <= 0) return false
else {
lado = l;
return true;
}
}
double Quadrado::getLado() {
return lado;
}
int main() {
Quadrado *square = new Quadrado;
square->setLado (6.0);
cout << Quadrado de lado: " << square->getLado();
}
PCS / EP / USP 2017 PCS 3111 Aula 4 26
Exemplo de uso de setNome/getNome
class Pessoa {
private:
string nome; ! Atributos locais da classe
int idade; declarados como privados.
public:
void setNome (string nome); ! Mtodos setNome/getNome
string getNome(); para inicializao e leitura
void setIdade (int idade);
int getIdade();
de cada atributo.
};
void Pessoa::setNome (string n) {
nome = n;
}
string Pessoa::getNome() {
return nome;
}
void Pessoa::setIdade (int i) {
idade = i;
}
int Pessoa::getIdade() {
return idade;
}
PCS / EP / USP 2017 PCS 3111 Aula 4 27
Processo de Compilao e Ligao

PCS / EP / USP 2017 PCS 3111 Aula 4 28


Compilao e Ligao
Cdigo Fonte C++
Compilador C++
Cdigo Objeto

Programa Executvel
Ligador
Biblioteca de Cdigo Objeto

! Cdigo escrito em C++ (Cdigo Fonte) legvel pelos humanos


Arquivos com extenses: .cpp ou .h (headers)
! O compilador traduz o Cdigo Fonte em Cdigo Objeto (tambm
chamado de Cdigo de Mquina")
Arquivo com extenso .obj (Windows) ou .o (Unix);
! O ligador liga seu Cdigo Objeto com outras bibliotecas de Cdigos
Objetos j existentes. Exemplos: bibliotecas de entrada/sada, cdigo do
Sistema Operacional, etc.
Arquivos com extenso: .obj (Windows) ou .o (Unix) e .lib;
! O resultado um Programa Executvel
/ EP
PCS Arquivo com
/ USP 2017 extenso
PCS .exe
3111 Aula 4 (Windows) ou a.out em Unix. 29
Organizao de Arquivos:
extenses .cpp e .h

PCS / EP / USP 2017 PCS 3111 Aula 4 30


Classes e Arquivos
! C++ permite definir e implementar mais de uma
classe em um mesmo arquivo
Exemplo: sistema bancrio
class ContaCorrente {...
};
int main (int argc, char** argv) {...
}
class Agencia {...
};
void ContaCorrente::depositar (double valor) {...
}
void Agencia::adicionar (ContaCorrente c) {...
}
class Correntista {...
};
bool ContaCorrente::retirar (double valor) {
...
} / USP 2017 PCS 3111 Aula 4
PCS / EP 31

Classes e Arquivos
! Como organizar as classes em um arquivo?
! Quantas classes devem ser colocadas em cada
arquivo?

! Boa prtica
Crie um arquivo separado para cada definio e
implementao

PCS / EP / USP 2017 PCS 3111 Aula 4 32


Definio
! Arquivo de cabealho: ".h"
Exemplo: ContaCorrente.h

class ContaCorrente {
private:
double saldo = 0.0;
public:
void depositar (double valor);
bool retirar (double valor);
};

PCS / EP / USP 2017 PCS 3111 Aula 4 33


Implementao
! Arquivo .cpp
Necessrio fazer um #include do ".h"
Exemplo: ContaCorrente.cpp
#include "ContaCorrente.h" Inclui a definio
da Classe ContaCorrente
void ContaCorrente::depositar (double valor) {
saldo += valor;
}

bool ContaCorrente::retirar (double valor) {
if (saldo < valor) return false;
saldo -= valor;
return true;
}

PCS / EP / USP 2017 PCS 3111 Aula 4 34


Implementao
! Arquivo main.cpp
#include <iostream>
#include "ContaCorrente.h"
using namespace std;
int main() {
ContaCorrente *conta = new ContaCorrente();
conta->depositar(1000);
cout << conta->saldo << endl;
}

! Para compilar e ligar manualmente:


g++ -c -std=c++11 contacorrente.cpp -o contacorrente.o
g++ -c -std=c++11 main.cpp -o main.o
g++ contacorrente.o main.o -o main.exe

PCS / EP / USP 2017 PCS 3111 Aula 4 35


Primitivas de Compilao: include e
ifndef

PCS / EP / USP 2017 PCS 3111 Aula 4 36


Diretivas de Compilao
! As Diretivas de Compilao utilizadas em C++
iniciam com o smbolo #, tais como: #include e
#ifndef

! As Diretivas so utilizadas numa etapa inicial da


compilao denominada pr-processamento.

! Nessa etapa as Diretivas de Compilao so


processadas, incluindo ou removendo cdigo
fonte do arquivo compilado.

PCS / EP / USP 2017 PCS 3111 Aula 4 37


Incluso
! Indica para o compilador onde o arquivo a ser
includo est:
O arquivo pode estar em pastas diferentes;
Quando se inclui cabealhos da biblioteca padro usa-
se o "<" e ">"
! O compilador procura o arquivo onde as bibliotecas ficam

#include <iostream> Da biblioteca padro


#include "ContaCorrente.h" Do projeto

! Arquivos

de cabealho tambm podem fazer
incluses
Exemplo: Agencia.h inclui a ContaCorrente.h
PCS / EP / USP 2017 PCS 3111 Aula 4 38
Diretiva ifndef
! Problema: mltipla incluso de um cabealho
Exemplo: tanto a Agncia quanto o Correntista
incluem a ContaCorrente
Gera um erro de compilao!
! (Compiladores de outras linguagens evitam esse erro)

! Soluo: diretiva #ifndef


#ifndef CONTACORRENTE_H Se CONTACORRENTE_H no estiver
#define CONTACORRENTE_H definido, define-o

class ContaCorrente {
...
};

#endif Fim do ifndef
PCS / EP / USP 2017 PCS 3111 Aula 4 39
Classes e Arquivos
! Exemplo: arquivos de um sistema bancrio
ContaCorrente.h e ContaCorrente.cpp
Agencia.h e Agencia.cpp
Correntista.h e Correntista.cpp
main.cpp

PCS / EP / USP 2017 PCS 3111 Aula 4 40


Bibliografia
! STROUSTRUP B. Princpios e prticas em
programao com C++. Bookman. 2012.
1216p
! BUDD, T. An Introduction to Object-Oriented
Programming. 3rd Edition. Addison-Wesley.
2001.
! LARMAN, C. Applying UML and Patterns: An
Introduction to Object-Oriented Analysis and
Design and Iterative Development. 3rd Edition.
Prentice Hall Professional, 2005

PCS / EP / USP 2017 PCS 3111 Aula 4 41

Vous aimerez peut-être aussi