1. Benefícios/Dificuldades da programação orientada por objectos
description
Transcript of 1. Benefícios/Dificuldades da programação orientada por objectos
1. Benefícios/Dificuldadesda programação orientada por objectos
2. Regras básicas de construção de softwareorientado por objectos
3. Introdução à Modelação(UML - Unified Modeling Language)
Uma linguagem de programação procurar seguir dois objectivos que se relacionam: 1. Deve fornecer ao programador meios de especificar as acções que devem ser executadas e 2. Deve ser um conjunto de conceitos que o programador possa utilizar quando pensa numa forma/método para resolver um problema
O primeiro aspecto idealmente requer que a linguagem “estejapróxima da máquina”.
A linguagem C foi inicialmente concebida com esta directiva
O segundo aspecto idealmente requer que a linguagem “esteja maispróxima do problema a resolver”. As facilidades adicionadas ao C
para criar o C++ tinham este objectivo
Idealmente, o projecto de um programa divide-se em três etapas:1) compreensão clara do problema2) identificação dos conceitos chave envolvidos na solução3) expressar a solução por intermédio de um programa
Eu posso apresentar um conjunto de regras que vocês devem seguirenquanto aprendem C++. Não as sigam literalmente.
Para escrever um bom programa é necessário inteligência, gosto/prazer e paciência.
1. Quando vocês programam, criam uma representação concretadas vossas ideias para a solução do problema. Vamos fazer com que a estrutura do programa reflicta essas ideias tão directamente quanto possível.
1.1. Podem considerar “isto” como uma ideia, criem uma classe.1.2. Podem considerar “isto” como uma entidade, criem um objectode uma classe.1.3. Se duas classes têm algo significativo em comum, façam essasemelhança pertencer a uma classe base.1.4. Se uma classe for um recipiente de objectos, façam-naum template
2. Quando definem uma classe que não implementa uma entidadematemática como uma matriz, um número complexo ou um tipode baixo nível, como por exemplo uma lista ligada:2.1. Não usem dados globais.2.2. Não usem funções globais (funções que não são métodosde classes).2.3. Não usem atributos públicos.2.4. Não usem friends excepto para eliminar [2.1], [2.2] ou [2.3].2.5. Não acedam directamente aos dados ou a qualquer outroobjecto.2.6. Não usem campos que identifiquem a classe: usem funçõesvirtuais.2.7. Não usem funções inline a não ser que constituam umaoptimização significativa.
A Linguagem de Modelação Unificada é uma linguagem e umanotação para especificação, construção, visualização e
documentação de modelos de sistemas de software
Introdução à Modelação(UML - Unified Modeling Language)
A UML na sua versão actual 1.4 pode ser vista como um standardda indústria. Foi desenvolvida segundo a direcção de Grady Booch,
Ivor Jacobson e James Rumbaugh da Rational Software
A UML é uma linguagem e uma notação para modelação mas não éum método, intencionalmente. UML serve de base a vários métodose fornece um conjunto bem definido de modelos de construção com
uma notação e uma semântica uniformes
História da linguagem UML
1. História da Programação Orientada por Objectos - 35 anos.
2. O primeiro livro sobre análise e desenvolvimento desta áreaapareceu em 1990 (Booch, Goad, Yourdon, Rumbaugh, etc.)
3. A partir de 1990 os métodos de Grady Booch e JamesRumbaugh são os mais conhecidos.
4. Em 1995 Booch e Rumbaugh criaram um método que sechama Unified Method (UM).
5. Em 1997 Booch, Rumbaugh e Jacobson criaram umalinguagem que se chama Unified Modeling Language (UML).
A UML inclui uma enorme quantidade de elementos edetalhes de modelos
Por exemplo, seguindo a notação UML, as classes e os objectossão representados por rectângulos. Para os diferenciar, os nomes
dos objectos foram sublinhados
class objectSe pretendermos representar a relação entre classe e objecto (relaçãode instanciação), desenhamos uma seta a tracejado a ligar o objecto
à classe, no sentido do objecto para a classe
class objectinstance of
A relação de herança é representada por uma seta a apontarsempre da classe derivada para a classe base. Este princípio é
normalmente chamado generalização ou especialização
Por exemplo, a classe forma é uma generalização da circunferênciae a circunferência é uma especialização da forma -
dependendo do ponto de vista
Isto é o caso da semântica “é um(a)” (is-a): uma circunferência “é uma” forma (a circle "is a" shape).
Os objectos das classes derivadas podem sempre ser utilizadosem vez dos objectos da sua classe(s) base (princípio da substituição)
Esta ilustração mostra a herança simples numa hierarquia deformas. Além desta iremos considerar a herança múltipla, onde
uma classe pode ter mais do que uma classe base
Existem várias alternativas para a herança, como por exemplo,delegação, agregação, programação genérica (tais como as classes
parameterizadas e templates C++), etc.
A herança não possui uso ilimitado e nalguns casos a sua utilizaçãonem é razoável
O diagrama de classes apresenta um exemplo de generalização eespecialização de formas.
Voltando ao exemplo das formas: Assume-se que todas as figuras podem ser mostradas no ecrã e podem ser apagadas e deslocadas.Como estas propriedades são aplicáveis a todas as figuras, entãodevem ser situadas na classe forma, juntamente com os atributos
que guardam a posição no ecrã e o estado de visualização
As propriedades adicionadas não podem ser generalizadas; assim,o modelo é o seguinte
shapex : inty : intvisible : Boolean
draw()rotate()setPosition(newX, newY)
Circleradius (radius>0)
setRadius(newR)
Rectanglea (a>0)b (b>0)
setA(newA)setB(newB)
Triangle
Nas classes derivadas circunferência, rectângulo e triângulo, oslados (a, b, c) ou o raio são definidos, juntamente com as restrições
a estes dados e funções para modificar os dados
Note que uma circunferência é desenhada de forma diferente deum triângulo. Isto justifica o facto de que as funções draw() erotate() da classe forma devem ser abstractas. Só dentro das
classes Circle, Rectangle, etc, é que se tornam funçõesconcretas
Rectanglea (a>0)b (b>0)
setA(newA)setB(newB)
Square
(a=b)
Neste diagrama a classe Squareé modelada como uma classe derivada
da classe Rectangle pois é um casoparticular de um rectângulo.
A classe Square é umaespecialização da classe Rectangle :
os lados a e b têm de ser iguais,o que é formulado como uma restrição.
Assim, a especificação de apenas umlado é suficiente
Um objecto deve estar apto a agir. De forma a expressarmecanismos de comunicação a UML possui ferramentas especiais
chamadas CRC (Class-Responsibility-Collaboration). Os CRCs são usados para especificar quais as classes que uma dada
classe deve cooperar
Uma pré-condição para cooperação é que as instâncias de uma classese conheçam. É o caso da relação de herança. Se não existir herança
a cooperação baseia-se na associação e na agregaçãoUma associação é uma relação entre objectos diferentes de uma oumais classes. Um exemplo simples é a relação entre uma janela e
um conjunto de formasNum caso simples, uma associação é representada por uma linha
simples entre duas classes. No entanto, normalmente as associaçõessão representadas o mais detalhadamente possível
Window Shapedisplays
As associações são também chamadas relações de utilização
Geralmente podemos diferenciar entre associação uni-direccional,bi-direccional e não-direccional. A UML, infelizmente, não
distingue as associações bi-direccionais das não-direccionais
A agregação é outro tipo de relação entre classes. Um carro,por exemplo, é uma agregação de pneus, motor, rodas motoras,
travões, etc. Estas partes, por sua vez, podem ser tambémagregações: um travão consiste num disco, pastilhas, cilindro
hidráulico, etc.
Agregações são relações de “inclusão” (has): Um carro “inclui” um motor (A car "has" an engine).
Enterpriseconsist of
Department Employeeconsist of
1 1.. 1 1..
A comunicação entre objectos é conseguida trocando mensagens.Os objectos enviam mensagens uns aos outros.
Uma mensagem é representada por um nome de uma função comargumentos entre parêntesis (quando é necessário) e uma seta
indicando o sentido da mensagem.
Enquanto o diagrama de uma classe representa as relações entreas classes, os diagramas de colaboração e sequência são usados
para mostrar uma operação ou situação específica.
Considerem a classe CircSquare cujos objectos formam um agregado(aqui, uma sobreposição gráfica) de um quadrado e uma
circunferência. CircSquare agrega uma circunferência e umrectângulo com lados iguais.
Vejamos outro exemplo de agregação:
Isto é uma composição porque os dois objectos, Circle eRectangle, que formam um CircSquare estão existencialmente
relacionados.
shapex : inty : intvisible : Boolean
draw()rotate()setPosition(newX, newY)
Circleradius (radius>0)
setRadius(newR)
Rectanglea (a>0)b (b>0)
setA(newA)setB(newB)
CircSquare
(2*c.radius =r.a = r.b)
setA(newA)draw()rotate()
resize(factor)
1 c 1 r hashas
Como um CircSquare tem de conhecer os seus objectos parciaismas os objectos não necessitam de saber quais os agregados de
que fazem parte, são representadas relações direccionais
class CircSquare : public shape{ Circle c;
Rectangle r;public:
void draw(){ c.draw(); r.draw(); } void rotate(){ c.rotate(); r.rotate(); } void setA(int newA){ c.setRadius(newA/2);
r.setA(newA);r.setB(newA); }
void resize(float factor){ setA(r.getA()*factor); }
};
O diagrama de colaboração ou sequência reflecte um cenário emostra as mensagens individuais entre os objectos que são
necessários numa dada operação.
Os seguintes dois diagramas mostram um cenário deste tipo.Um objecto da classe CircSquare recebe uma mensagem de
redimensionamento, que significa que o agregado de figuras vaiser redimensionado por um factor que é especificado
(por exemplo, 1.5).
resize(factor)
:CircSquare r:Rectangle c:Circle
getA()
a
setA(a*factor)setRadius(newRadius)
setA(newA)
setB(newA)
O diagrama de sequência
A operação de redimensionamento implica a seguinte troca demensagens:
1. O objecto CircSquare envia ao rectângulo a mensagem getA(). O rectângulo responde com o valor do comprimento actual do seu lado e CircSquare guarda-o temporariamente na variável a.
2. Posteriormente, CircSquare envia uma mensagem setA(a*factor) para ele próprio.1.2.1. Dentro da função setA(new A), o objecto CircSquare envia primeiro uma mensagem setRadius(new A/2) à circunferência.1.2.2. De seguida, é enviada a mensagem setA(new A) ao rectângulo1.2.3. Seguida da mensagem setB(new A).
Assim, se o comprimento inicial do lado é 12 e o factor deredimensionamento for 1.5, o raio será 9 e o novo comprimentodo lado é 18.
1. resize(factor)
1.1: a=getA()
1.2.2: setA(newA)
1.2.3: setB(newA)
1.2: setA(a*factor)
1.2.1: setRadius(newA/2)
CircSquare
c:Circle
r:Rectangle
O diagrama de colaboração