Você está na página 1de 54

#pg001#nt080#cm00#

1 Programao e Software
1.1 Cincia da computao
Muitos leitores deste livro podem estar inscritos em seu primeiro curso de cincia da
computao. Bem-vindo cincia da computao! Outros leitores podem estar querendo
aprender mais sobre assuntos de desenvolvimento de software orientado por objeto. Bem-
vindo a este excitante paradigma! (A palavra paradigma significa um conjunto estruturas,
onde todas contm um elemento em particular. Random House dictionary)
Tipicamente um primeiro curso de cincia da computao apresenta uma linguagem
de programao e enfatiza a programao. Alguns estudantes terminam tal curso com a
impresso de que cincia da computao o estudo de programao. Isso no verdadeiro.
Software o produto final de um processo de engenharia que envolve requisitos,
especificaes, anlise e projeto. Software uma entidade visvel e tangvel. um conjunto
de instrues que permite um computador digital realizar uma variedade de tarefas.
Software um produto freqentemente embrulhado em embalagem bonitinha. Software
um negocio multimilionrio.
Uma linguagem de programao proporciona uma notao onde se pode expressar
algoritmos e estruturas de informaes. O computador pode usar tal notao para realizar
tarefas teis. Mas para muitos cientistas da computao, programas representam o menos
produtivo, mais rotineiro e talvez a mais montona parte do processo de desenvolvimento
de software. De fato, alguns cientistas da computao nem mesmo programam.
#pg002#nt070#cm00#
Para outros cientistas da computao, a criao de programas tudo que a cincia
da computao representa. A teoria das linguagens de programao salienta a importncia
da programao. Mas a cincia da computao muito mais que programao.
Cincia da computao lida com arte, trabalho criativo e clculos usados em um
computador digital. Cincia da computao to terica quanto prtica, to terica quanto
aplicada. Teoria de autmatos, linguagens naturais e artificiais, aprendizado e induo,
informao, estruturas de dados, estudo de complexidade e algoritmos desempenham um
papel central e tambm servem como um reforo terico para toda a cincia da
computao. As maiores reas de aplicao de cincia da computao incluem sistemas
operacionais, design de compiladores, estruturas de dados e algoritmos, grficos, anlise
numrica, bases de dados, linguagens de programao, inteligncia artificial, aprendizado
de mquina e engenharia de software. Como um estudante de cincia da computao, voc
estar apto a ter cursos em muitas ou em todas estas reas.
A maioria das cincias requerem que seus praticantes para expressem suas idias em
uma ou mais linguagens tcnicas. Qumicos aprendem a linguagem de smbolos qumicos,
operaes e conexes que permitem escrever as equaes qumicas. Fsicos usam a
linguagem de clculos, equao diferencial e outras matemticas avanadas para expressar
seus modelos e idias. Engenheiros eltricos aprendem a linguagem de diagramas de
circuitos. Cientistas da computao tambm usam uma variedade de notaes e linguagens
para expressar seus conceitos e produzir resultados.
Um estudante de fsica precisa aprender matemtica bsica para ter uma notao
que possa ser usada para discusso e raciocnio sobre fsica. Um estudante de cincia da
computao precisa aprender uma linguagem de programao de alto nvel e tcnicas de
resoluo de problemas para ser capaz de raciocinar em cima da computao. Para um
cientista da computao, a programao no nada alm do que o clculo, para um fsico
Cientistas da computao, como seus colegas de cincias naturais e engenharia,
esto preocupados com a construo de modelos, abstraes, anlises, design, e
implementao. Um programa ou sistema de software freqentemente representa o passo
final de um processo de resoluo de problemas.
Este livro introduzir tcnicas de deduo e resoluo de problemas usando objetos.
O princpio fundamental da programao orientada por objeto ser explorado e introduzido.
Durante esta explorao muitos princpios importantes de computao sero revelados.
#pg003#nt065#cm00#
1.2 Programas de computador
Um programa consiste em uma seqncia de instrues escritas numa linguagem precisa
chamada linguagem de programao. Estas instrues so traduzidas em um compilador,
para uma linguagem de baixo nvel, a linguagem de mquina, para que o computador possa
entender.
As aplicaes de um software so definidas geralmente em duas categorias:
programas de sistemas e programas de aplicaes. Programas de sistemas visam controlar
um componente do computador, como um dispositivo de armazenamento, dispositivo de
sada, ou o prprio computador (ex.: sistema operacional). Programas de aplicaes
resolvem um problema externo ao computador como um sistema bancrio, sistema de
controle de trfego areo, sistema de processamento de textos, planilha eletrnica ou outra
rea de aplicao.
Programas de computador representam o produto final do processo de
desenvolvimento de software. Eles so entidades tangveis que podem ser liberados para o
cliente, vendidos, embalados. Programas comerciais usualmente vm acompanhados de um
guia do usurio e outros documentos de apoio escritos.
1.3 Linguagens de programao
Trs categorias principais de linguagem de programao tm sido desenvolvidas:
linguagem de mquina, linguagens assembly e linguagens de alto nvel. Os primeiros
computadores somente podiam ser programados usando linguagem de mquina. Tal
linguagem usa seqncias de zeros e uns (bits) que representam instrues precisas para
computao e acessos de dados.
Linguagens assembly usam caracteres alfabticos para representar as configuraes
de bits da linguagem de mquina. As letras usadas descrevem as operaes a serem
realizadas. Linguagens assembly representam um nvel mais alto de abstrao do que as
linguagens de mquina. Algumas linguagens assembly modernas suportam estruturas de
controle que antes eram previstas somente em linguagens de alto nvel.
Linguagens de alto nvel assemelham-se com linguagem natural. Dados e operaes
so representados por declaraes descritivas.
Um exemplo: suponha que desejamos adicionar dois nmeros e depositar a soma
em um terceiro nmero. Na maioria das linguagens de alto nvel, estas operaes so assim
simbolizadas:
c := a + b
#pg004#nt080#cm00#
Os operandos a e b representam os dois nmeros a serem adicionados e a varivel c
representa o total. O operador := o operador de atribuio. Ele significa que a soma dos
valores em a e b que ser atribudo a c
1
.
Numa tpica linguagem assembly, as instrues poderiam ser lidas:
LOAD A
ADD B
STORE C
Numa linguagem de mquina as instrues poderiam ser lidas:
00011000 00000101
00100001 00000011
00101101 11100001
Como voc pode ver, somente computadores iriam querer ler a linguagem de
mquina.
1.4 Estruturao e programao orientada por objetos
A palavra paradigma tem se tornado popular no ltimos anos. As pessoas ouvem falar a
respeito do paradigma orientado por objeto.
No mundo do desenvolvimento de software, as dcadas de 70 e 80 foram dominadas
pela abordagem de soluo de problemas (paradigma) chamada programao estruturada.
As linguagens dominantes da poca incluam FORTRAN, COBOL, ALGOL, PASCAL,
ADA e C. Considerveis investimentos foram feitos no desenvolvimento ferramentas de
software para apoiar a programao e o processo de desenvolvimento de software durante
esse perodo. Os mtodos e tcnicas para projeto e analise estruturados apresentados por
Larry Constantine, Tom DeMarco e Edward Yourdon tem influenciado de forma
significativa a maneira em que amplos e complexos sistemas de software so construdos.
Poderosas e dispendiosas ferramentas de software para auxiliar a engenharia de software
1
NT: Em portugus l-se: c recebe a mais b
apoiada por computador (CASE
2
) tm sido desenvolvidas para apoiar este paradigma da
programao estruturada.
A abordagem estruturada para resoluo de problemas decompe um problema em
funes. Essa abordagem chamada decomposio funcional uma complexa operao
dividida em operaes menores. Cada uma dessas operaes menores ainda dividida em
menores e menos complexas operaes at que cada operao seja tratvel em tamanho e
complexidade. Um sistema de software visto como um processo de transformao
processamento de dados de entrada (input) atravs de uma srie de transformaes
funcionais para produzir dados de sada (output). Os dados servem como uma entrada para
uma determinada funo ou para um processo inteiro, so processados e produzem uma
sada til. #pg005#nt070#cm00#Por vrias geraes de programadores, esta tem sido a
abordagem mais natural para soluo de problemas. E tem se tornado um meio de vida.
Em meados de 1970 uma importante, mas silenciosa pesquisa sobre um paradigma
diferente de desenvolvimento de software foi feita pela Xerox Corporation no Palo Alto
Research Center (PARC). Em 1980 este esforo culminou no lanamento comercial da
linguagem de programao orientada por objetos Smalltalk-80. Inspirado nas idias de Alan
Kay e seus scios, esta linguagem visava proporcionar ao programador, um ambiente de
desenvolvimento de software altamente individual e robusto, que de muitas maneiras se
parece com o ambiente moderno de estaes de trabalho. Um mecanismo de interface
grfica extremamente amigvel foi um subproduto deste trabalho e mais tarde levou ao
desenvolvimento do tipo de ambiente grfico tipicamente encontrado na maioria das
estaes de trabalho, assim como tambm em computadores pessoais. Em 1980 um mouse
como aparelho de interface, uma srie de janelas, menus, botes, caixas de dilogo, etc., os
quais tem se tornado agora bastante usuais, eram praticamente desconhecidos, com exceo
de alguns poucos laboratrios de pesquisa.
Mas mais significativamente, o Smalltalk exemplificou uma abordagem totalmente
nova do desenvolvimento de software e soluo de problemas - a abordagem da orientao
por objetos. Nesta abordagem, a decomposio de dados, ao invs da decomposio de
funes, tornam-se a idia central. As funes se tornam ligadas a um modelo de dados e
servem a este modelo de dados. A soluo de problemas passa a ser a descrio e
modelagem de como objetos interagem entre si.
Em meados de 1980, emergiram vrias novas linguagens orientadas por objetos de
importncia considervel. Entre elas podemos citar Objective-C, Eiffel, CLOS, e C++.
Todas estas linguagens esto ainda sendo utilizadas hoje embora seja claro que C++ tenha
se tornado a linguagem orientada por objetos mais amplamente utilizada. Das linguagens
mencionadas, somente Smalltalk e Eiffel so linguagens orientadas por objeto puras. Por
puro se entende que estas duas linguagens no so baseadas em algum substrato que no
orientado por objetos, como so C++ ou Objective-C. Nestas construes de linguagens
baseadas em C, podem coexistir tanto a programao estruturada quanto a programao
orientada por objetos. Isto freqentemente leva a um modo misto de soluo de problemas.
Somente Smalltalk e Eiffel oferecem ao programador a possibilidade para fazer
2
NT: Do ingls Computer Aided Software Engineering
programao exclusivamente orientada por objetos. O autor deste livro considera isto uma
grande vantagem do uso destas duas linguagens.
O prximo captulo explica o orientao por objetos em maiores detalhes.
Outros paradigmas de programao tem sido criados alm do estruturado e do
orientado por objetos. Programao funcional, exemplificada pela linguagem de
programao LISP e programao lgica exemplificada pela linguagem de programao
PROLOG so dois exemplos. #pg006#nt090#cm00#Programao funcional tem sido
largamente usada em aplicativos de inteligncia artificial e PROLOG em aplicativos para
aprendizagem de mquinas.
1.5 Ferramentas comuns de software
Includas entre as ferramentas comuns de software normalmente disponveis para
programadores esto editores de programa, processadores de texto, compiladores, linkers,
debuggers, profilers e browsers. Cada um destes ser descrito resumidamente.
Um editor de programa um sistema editor de textos, simplificado, que permite ao
programador entrar com o texto de um programa. Alguns editores de programa,
denominados os editores sensveis ao contexto, proporcionam uma estrutura de sintaxe que
permite ao programador usar uma palavra chave em uma determinada linguagem de
programao e o editor ento gera o resto de uma expresso automaticamente. A maioria
dos editores de programas possuem operaes semelhantes como search (localiza a palavra
no texto), search/replace (procura e altera uma palavra ou expresso), autoindent (faz a
identao do texto de um programa com um nmero especfico de espaos ou de
tabulaes baseado no contexto do programa),e goto (move o marcador ou cursor para uma
linha especifica no texto).
Um processador de texto um programa que ajuda na gerao de documentos. Ele
freqentemente permite a integrao de componentes grficos com componentes de texto.
Os processadores de texto modernos so bem poderosos e complexos.
Um compilador um programa especifico das linguagens de programao, que
traduz o texto do programa escrito em linguagem de alto nvel em linguagem de maquina.
Este um processo essencial que precisa ser cumprido para o programa poder funcionar.
Um linker um programa que integra vrias partes de um programa que foram
compiladas para um cdigo executvel compondo o aplicativo. Normalmente, compilar e
linkar so operaes executadas de maneira integrada, com a finalidade de traduzir o texto
de um programa para um cdigo executvel.
Um debugger programa que permite um aplicativo ser executado sob o controle
do programador. A execuo do programa pode ser interrompida em lugares pr-
determinados do texto de um programa ou pode ser executada passo a passo. O
programador pode ento, inspecionar valores de vrias entidades no aplicativo para
determinar se programa est executando suas funes corretamente. Geralmente os
debuggers so usados quando um problema detectado no programa.
#pg007#nt090#cm00#
Um profiler um programa executado em conjunto com um programa em
desenvolvimento. Ele calcula e informa o tempo que o programa gasta em diversas partes e
sees, permitindo ao programador determinar o local que necessita de mais eficincia para
modific-la na verso final. Essencialmente, um profiler um instrumento de anlise de
desempenho da execuo de um programa.
Um browser um programa que permite uma inspeo visual de um programa
amplo e complexo. Desta maneira, um instrumento essencial para grande projetos de
software, onde um programador precisa ser capaz de inspecionar outra parte de um
software, possivelmente desenvolvida por outros programadores; ou inspecionar o cdigo
de bibliotecas reutilizveis de software.
1.6 Programao
Um programa de computador um conjunto de instrues escritas de acordo com as regras
de sintaxe de alguma linguagem de programao. As instrues so traduzidas por outro
programa de computador chamado compilador.
O compilador gera instrues numa linguagem de baixo nvel, entendidas pela
mquina, que permitem ao seu computador executar as instrues fornecidas no seu
programa. Instrues assim so difceis de se ler, entender e possivelmente ainda mais
difceis de se escrever diretamente. Felizmente, para a maioria dos programadores, isso
raramente ser exigido, se que ser.
Um programa bem escrito deve:
Ser claro e de fcil entendimento para outro programador.
Resolver o problema especificado corretamente.
Ser fcil de se modificar caso as especificaes do problema sejam modificadas.
1.6.1 Linguagens de programao
Foram criadas centenas de linguagens de programao para ajudar na soluo de vrios
tipos de problemas. Essas linguagens tm sido agrupadas em vrias categorias baseadas nas
suas caractersticas e na abordagem que usam para resoluo de problemas. Essas
categorias so:
Linguagens Assembly - Essas linguagens so criadas para cada processador
especfico com um conjunto prprio de instrues de baixo nvel. Programas
nessa linguagem so difceis de serem escritos porque a possibilidade de se
formular abstraes nestas linguagens muito limitada. Elas so bastante
propensas a erros e no so facilmente adaptveis, caso as especificaes do
problema sofram mudanas. Entretanto, programas desenvolvidos em linguagem
assembly so muito rpidos. As linguagens de programao mais primitivas
foram as linguagens assembly.
#pg008#nt085#cm00#Linguagens procedurais Essas linguagens foram as
primeiras linguagens de alto-nvel. A primeira delas, FORTRAN, foi
desenvolvida no comeo da dcada de 50. Ela era usada principalmente para
computao matemtica e cientfica. A unidade bsica de abstrao em
FORTRAN a subrotina. Subrotinas so similares aos servios contidos numa
descrio de classe. Os dados so passados para uma subrotina atravs de seus
parmetros. Computao tipicamente realizada nesses dados e uma sada
retornada como resultado. Outras linguagens procedurais populares so C,
Pascal, Algol e PL/1.
Linguagens funcionais LISP pode ser vista como a av das linguagens
funcionais. A sigla LISP significa processamento de listas (LISt Processing).
LISP e suas linguagens derivadas so amplamente usadas na rea de inteligncia
artificial, aprendizagem de mquina e cincia cognitiva. Mesmo tendo algumas
aplicaes comerciais escritas em LISP, muitos ainda consideram essa linguagem
como uma ferramenta de pesquisa.
Linguagens Lgicas PROLOG e suas variaes proporcionam a oportunidade
de formular um conjunto de proposies lgicas e ter dedues derivadas pela
linguagem. PROLOG, assim como LISP, tem sido usada como uma ferramenta
de pesquisa na rea de inteligncia artificial e aprendizagem de mquina.
Baseadas em objetos Modula-2 e Ada so as duas linguagens baseadas em
objeto que mais se destacam. Cada uma suporta a noo de tipo abstrato de dados
(a ser explicado mais tarde nesse captulo). Essas so as primeiras linguagens
procedurais a fornecer uma separao clara entre um modelo de dados e os
servios em torno desses dados (entre a viso externa dos dados, pelo usurio, e
suas representaes internas). Nenhuma dessas linguagens suporta herana.
Linguagens orientadas por objetos Simula, desenvolvida na Noruega no fim da
dcada de 60 a primeira linguagem de programao orientada por objeto. Na
dcada de 70 o Centro de Pesquisa da Xerox, em Palo Alto, fez algumas
pesquisas inovadoras no modelo de objeto que levou ao desenvolvimento da
linguagem de programao Smalltalk. Essa linguagem foi lanada
comercialmente em 1980. Foi logo seguida por C++, Objetctive-C, CLOS
(Common Lisp Object System), assim como Eiffel e uma sria de outras
linguagens orientadas por objeto menos conhecidas. As duas linguagens
orientadas por objeto mais populares usadas hoje so C++ e Smalltalk. Eiffel est
ganhando popularidade rapidamente mas fica atrs dessas duas no momento da
escrita deste livro.
1.7 Objetivos desse livro
Este livro visa propiciar ao leitor uma base slida nos princpios fundamentais de
programao (nesse caso programao orientada por objeto) e na resoluo de problemas.
#pg009#nt---#cm00#
A perspectiva orientada por objeto vista neste livro representa uma nova evoluo
numa tendncia de enfatizar abstraes na resoluo de problemas usando o computador e
o uso do tipo abstrato de dados em particular (que ser definido e discutido no prximo
captulo). Este livro introduz a modelagem de objetos. O autor deste livro acredita que um
aluno iniciante vai se beneficiar altamente ao aprender logo cedo que o processo de
desenvolvimento de software no comea escrevendo-se o cdigo de um programa. Na
verdade, um processo sistemtico de anlise e planejamento vem primeiro. importante
que o leitor aprenda que a programao apenas uma parte do processo intelectual
associado construo de software e cincia da computao.
Atravs de uma abordagem orientada por objetos, voc leitor ser apresentado
noo simples e atrativa de que um sistema de software composto de objetos interagindo
de maneira harmoniosa que se comunicam entre si atravs de mensagens. Essas mensagens
so definidas com preciso numa descrio de uma classe.
Como muitos programadores esto descobrindo, a perspectiva orientada por objetos
bastante distinta da abordagem antiga, onde se comea de baixo para cima (aprendendo
primeiramente sobre tipos numricos, variveis, operaes de atribuio, operaes de
comparao, controle de fluxo e repetio, e muito mais tarde, sobre o conceito de
funes).
Apesar da abordagem usada neste livro ser audaciosa, ela no radical. A noo de
funo apresentada desde o incio (no captulo 2) and usada em todo o resto do livro. O
princpio do encapsulamento que une um modelo de dados com uma abstrao funcional
forma a parte principal do captulo 2. Apesar de no enfocar em detalhes de programao
at o captulo 4, o leitor ser apresentado ao processo de resoluo de problemas orientado
por objetos nos captulos 2 e 3.
Eiffel foi escolhida para apoiar este esforo por causa de sua sintaxe relativamente
simples, sua consistncia, e seu suporte rico e direto programao com objetos. Entre as
vrias linguagens orientadas por objetos desenvolvidas nos ltimos 10 anos, ela a mais
elegante e talvez a mais poderosa.
Para os leitores que no esto usando este livro numa disciplina inicial em cincia
da computao, deixem-me dizer porque C++ no foi escolhida para este livro. Apesar de
reconhecer a enorme popularidade de C++ e a possibilidade de que o leitor tenha que
acabar se acostumando rapidamente com esta linguagem, eu acredito que a complexidade
de C++, que de certa maneira uma sintaxe misteriosa, sua falta de segurana, seu apoio
continuado em artefatos de baixo nvel com ponteiros e referncias, distraem do objetivo de
aprender a resolver problemas usando objetos. C++ no encoraja nem desencoraja a
soluo de problemas de maneira orientada por objetos. #pg010#nt075#cm00#C++ uma
linguagem hbrida que culturalmente embutida em ideologia do C. Apesar desta
ideologia ter demonstrado ser extremamente produtiva, ela no leva ao aprendizado de um
novo conjunto de mecanismos para soluo de problemas.
Na minha opinio, esta importante primeiro tornar-se eficiente no processo de
soluo de problemas orientada por objetos, antes de iniciar o desafio de dominar uma
linguagem mais complexa. O ++ em C++ no um pequeno incremento da linguagem
C.
E acredito que vocs acharo, como eu acho, que Eiffel no somente uma notvel
linguagem para se aprender princpios bsicos de construo de programas orientados por
objetos, mas tambm uma rica e potente linguagem para usar na soluo de problemas
reais aps voc ter dominado os princpios da programao orientada por objetos.
minha inteno que este livro inspire em vocs interesse e entusiasmo na soluo
orientada por objetos de problemas e proporcione a vocs com uma base slida em alguns
princpios bsicos de cincia da computao.
1.8 Exerccios
Cite vrias maneiras nas quais computadores tm influenciado sua vida.(Por
favor restrinja-se no uso de palavras tolas).
Cite algumas profisses que envolvem um computador.
Explique os principais componentes de um computador.
Qual a vantagem no uso de uma linguagem de alto nvel sobre uma linguagem de
mquina?
Quais so os passos tradicionais no ciclo de vida de um sistema de software?
Por que voc est interessado por computadores ou pela cincia da computao?
Voc pode manter sua resposta para esta questo em um lugar seguro por alguns
anos e reler sua resposta em 3 anos.
#pg011#nt085#cm00#
2 Uma Abordagem Orientada Por Objetos para Resolver
Problemas
Este captulo sobre objetos e classes e como cada um usado na construo de um
programa. Quando voc terminar este captulo, voc ter aprendido: (palavras tcnicas
importantes so mostradas em negrito):
Um objeto uma instncia de uma classe.
Um objeto tem dados e comportamento.
Um objeto pode utilizar comandos ou consultas de outros objetos.
Um comando permite modificar os dados mantidos pela instncia de uma classe
(pelo objeto).
Uma consulta permite verificar o valor dos dados mantidos pela instncia de uma
classe.
O estado de um objeto pode ser verificado atravs das consultas ao objeto (ao
valor de seus dados).
Classes podem ser relacionadas entre si de trs maneiras diferentes: herana,
associao e uso.
Algumas classes so abstratas j outras so concretas.
Objetos so criados dentro de um programa e interagem com outros objetos
medida que o programa executa.
#pg012#nt095#cm00#
2.1 Objeto, objetos em todos os lugares
2.1.1 Objetos ordinrios
O que um objeto? Um objeto ordinrio caracterizado tanto por seu comportamento
quanto pelo seu estado interno. Para objetos ordinrios, h uma linha que separa o interior
do objeto do lado de fora deste. Dentre as caractersticas que definem objetos ordinrios
esto includas textura, cor, cheiro, som, ou custo.
Uma criana no incio de sua vida capaz de distinguir objetos que esto ao seu
redor. Isto inclui seus pais e as pessoas que tomam conta dela e os objetos prximos ou
sobre seu bero. Isto quer dizer que os seres humanos so criaturas orientadas por objetos.
medida que ns envelhecemos ns aprendemos tambm a caracterizar objetos baseando
no seu aspecto e comportamento. Nossa orientao por objetos fortalecida pela a
observao do mundo a nossa volta e, mais tarde, por um processo formal de educao. Por
exemplo, em Qumica ns aprendemos, a compreender um tomo em particular baseados
em sua classificao numa Tabela Peridica de Elementos. Em Biologia, ns aprendemos, a
classificar as vrias espcies de organismos vivosbaseados em uma elaborada classificao
hierrquica de espcies.
Quando jovens, ns observamos os objetos a nossa volta, ns freqentemente
distinguimos ou classificamos objetos por suas semelhanas e diferenas de aspecto e
comportamento. Mas, surpreendentemente, ns rapidamente aprendemos a classificar tipos
similares de objetos como um carro independente de seu aspecto, tamanho, cor ou textura
precisos. Uma criana pode naturalmente reconhecer um desenho mal feito de um carro no
livro, um carrinho de brinquedo do tamanho de uma caixinha de fsforos, e um carro real
bem como sendo diferentes exemplos, encarnaes, ou instncias da classificao
CARRO. Muitas crianas podem distinguir mais tarde um carro de um caminho baseando-
se no apenas em sua forma precisa, tamanho, cor, ou outro dado "significativo" de um
caminho, mas ao invs, baseando-se em algumas das propriedades visuais abstratas de
carros e caminhes. Parece uma caracterstica dos seres humanos a habilidade natural de
classificar objetos.Ns chamaremos estas classificaes de classes.
A palavra instncia ser usada para significar um membro particular de uma classe.
Por exemplo, um carro vermelho do tamanho de uma caixa de fsforo que seja o brinquedo
favorito de uma criana uma instncia da classe CARRO (sero usadas letras maisculas
para classes) da mesma maneira que o esboo mal feito de um carro no livro de uma
criana ou o automvel real na garagem so outras instncias de CARRO.
Muitas crianas desenvolvem um nvel alto de entusiasmo para carros de brinquedo,
caminhes, avies, barcos, e trens. Esta fascinao parece estar baseada na habilidade
comum de todos estes objetos moverem-se de um local a outro e, a mais importante, a
habilidade que a criana tem de controlar este movimento. Cedo, as crianas so hbeis em
obter uma entendimento abstrato de um VECULO. #pg013#nt050#cm00#Esta abstrao
representa os traos comuns a todos os veculos incluindo carros, caminhes, avies, barcos
e trens (e outros tipos de veculos conhecidos mais tarde, no momento em que sua
experincia de vida e poder aquisitivo aumentam). Uma criana parece apta para fazer esta
generalizao antes de aprender a palavra veculo. Como humanos parecemos ser capazes
de desempenhar essa tais generalizaes de maneira natural. Esta abordagem de
classificao serve como base para uma abordagem orienta por objetos para soluo de
problemas.
A classe VECULO, seja formalmente definida ou entendida informalmente,
considerada como sendo uma classe abstrata em contraste com uma classe concreta, tal
como CARRO, CAMINHO, AVIO, BARCO, E TREM. Raramente uma criana pede
para seu pai: Por favor, traga-me o veculo vermelho do meu quarto. Uma classe abstrata
(como veculo) aquela que no possui instncias de verdade, mas pode ser usada para
produzir instncias de classes concretas (como CARRO, CAMINHO, AVIO, BARCO,
ou TREM). Ela uma generalizao de uma classe concreta.
A abstrao da classe VECULO contm caractersticas comuns de CARRO,
CAMINHO, AVIO, BARCO e TREM, formando a base para a noo de herana. A
classe concreta adquire (herda) caractersticas de sua classe pai (a classe abstrata). Cada
caracterstica herdada da classe abstrata achada em instncias na classe concreta.
Em nossa percepo dos objetos ordinrios, difcil ou quase impossvel, definir
precisamente as caractersticas de cada classe concreta. Ns podemos rapidamente
desenvolver a habilidade de identificar um carro com exatido. Ns podemos nunca
desenvolver a habilidade de definir a classe CARRO com preciso. Nossas habilidades de
reconhecimento de padres so baseadas em fenmenos complexos que no podem ser
modelados facilmente. Quando ns modelamos uma classe CARRO, ns tentamos extrair
caractersticas essenciais, ignorando os detalhes no essenciais. Entretanto, confortante
saber que embora no possamos modelar um carro com preciso, podemos ao menos gui-
lo.
2.1.2 Objetos como abstrao
Quando comeamos a pensar, escrever ou falar sobre carros, ns desenvolvemos uma
abstrao desta entidade. Esta no uma atividade que vem facilmente ou cedo na vida.
Tanto artistas quanto engenheiros precisam desenvolver tal abstrao quando tentam
representar um carro. Cada um far isto de maneira diferente. O artista ir enfatizar o
contorno, a textura e a cor ao passo que o engenheiro ir enfatizar o formato e o
comportamento do carro. O engenheiro, em particular, se preocupa com a relao entre
formato e comportamento. O modelo abstrato de um carro desenvolvido por um engenheiro
deve unificar formato e comportamento. Esta unificao chamada de encapsulamento.
#pg014#nt095#cm00#
Os aspectos referentes forma, textura e cor devem ser considerados como os
dados do carro. Alm desses dados, o engenheiro se preocupa com questes como a
capacidade de fazer curvas do carro, sua capacidade de frear, sua acelerao, etc. Estes
fenmenos envolvem a reao do veculo a vrios estmulos (por exemplo, pisar no pedal
do acelerador, pisar no pedal do freio, virar o volante, etc.). O comportamento de um carro
fortemente influenciado por esses dados. Um carro grande e pesado geralmente requer
muito mais potncia para ter uma determinada capacidade de acelerao que um carro
pequeno e leve. Ele geralmente menos manobrvel que um carro leve.
Para entender as caractersticas de acelerao de um carro, os nicos dados (daqui
em diante chamados de atributos) que podem ser relevantes so a massa do carro, torque,
frico dos pneus e coeficiente aerodinmico. Essas variveis constituem o estado interno
ou atributos da classe CARRO. Outros atributos como sua cor, marca ou preo so
irrelevantes. Aspectos como a velocidade do carro podem ser calculados atravs do
conhecimento desses atributos.
Se algum est desenvolvendo uma abstrao onde o carro um produto comercial,
ento os atributos que ns devemos usar para representar o estado interno do carro incluem
o valor de emprstimo, a taxa de juros do emprstimo, o nmero de meses do emprstimo,
o nmero de pagamentos j feitos, e o preo de tabela do carro. Por esses atributos, o
comportamento do carro como produto comercial pode ser totalmente descrito.
A modelagem de objetos similar modelagem de quaisquer entidades da cincia.
O nvel de detalhes definidos no modelo depende das metas do problema. Se desejado
estudar as propriedades termodinmicas da combusto de 4 tempos, associada a um motor
de combusto interna, ento um modelo que inclui os mnimos detalhes apropriado. Isso
incluiria informaes sobre a geometria de cada cilindro e a geometria de cada pisto.
Portanto, a descrio de um objeto, a abstrao do objeto, baseada no problema
onde o objeto existe. Aspectos do objeto que exercem um papel essencial na descoberta de
uma soluo para o problema dado devem ser representados no modelo de objeto (a classe)
e os aspectos que no so essenciais so ignorados. Uma abstrao representa uma
descrio simplificada da realidade. O Dicionrio Oxford (1966) sugere o seguinte sobre
abstraes: O princpio de ignorar aqueles aspectos de um assunto que no so relevantes
para o problema a fim de se concentrar mais naqueles que so.
#pg015#nt085#cm00#
2.2 O modelo de objetos
Coad e Yourdon [1] definem um objeto como uma abstrao de algo no contexto de um
problema, refletindo a capacidade do sistema em manter informaes sobre ele ou interagir
com ele; um encapsulamento de valores caractersticos e seus servios exclusivos.
Visto que o contexto de um problema pode se referir a quase qualquer coisa, os
conceitos chave na definio dada acima, so abstraes, informaes, interao com,
valores e servios exclusivos.
Abstrao, como mencionado acima, envolve uma separao das caractersticas
essenciais das no essenciais. Na definio de abstrao, as caractersticas essenciais (e
consequentemente as caractersticas no essncias) so relativas ao problema que est
sendo resolvido. Isto foi ilustrado na seo 2.1.2 com dois modelos de carro, um modelo
fsico e um modelo de comrcio.
O conceito de informao e atributos da definio de objetos acima, implica em
armazenamento de dados. Cada atributo representa um componente distinto do modelo
geral de armazenamento de dados. Isto foi ilustrado na seo 2.1.2 com as caractersticas de
um carro como massa, aderncia dos pneus, torque e coeficiente de aerodinmica. As
consultas na seo externa da classe (a parte da classe que publicamente disponvel)
permitem que os valores de alguns atributos sejam obtidos.
O conceito de interao com e servios exclusivos na definio acima sugere
ao e comportamento. Os servios associados com um objeto descrevem o que pode ser
feito com o objeto ou para o objeto. Este o comportamento do objeto. Os comandos na
seo externa da classe detalham precisamente quais servios so acessveis para os objetos
da classe.
O modelo de objetos envolve dois componentes principais: um modelo de dados e
um modelo de comportamento. Estes modelos esto contidos na descrio do objeto na
classe. O modelo de dados fornece uma especificao precisa do tipo de informao que
armazenada em cada objeto enquanto que o modelo de comportamento fornece uma
especificao precisa dos servios que podem ser executados no objeto ou pelo objeto.
Somente os servios descritos no modelo de comportamento podem ser executados pelo
objeto. Se funes adicionais forem necessrias elas devero ser acrescentadas no modelo
de comportamento da classe que define o objeto em questo.
2.2.1 Um exemplo de modelo de objeto
Vamos considerar um exemplo simples para ilustrar um modelo de objeto. Suponha que
desejamos construir um modelo de objeto para um contador(um objeto que serve para
contar coisas). Este contador pode ser usado para registrar o nmero de vezes que um
evento de contagem ocorreu. Exemplos de contagem podem incluir a contagem de
veculos que chegam numa esquina numa simulao de trfego ou a contagem do nmero
de avies que aterrizam numa pista de pouso em um determinado perodo de tempo.
#pg016#nt080#cm00#
Construiremos uma classe de nome CONTADOR para ilustrar o modelo de objeto.
O estado do objeto CONTADOR, uma instncia da classe CONTADOR,
totalmente descrito por uma consulta. O valor da consulta, resultado, retm o valor total
das vezes que o objeto citado incrementou sua conta. Esta consulta especifica a informao
contida no prprio objeto CONTADOR de maneira nica e completa.
Os comandos (servios que podem ser executados pelo ou no objeto) incluem:
criar construir um novo objeto com valor inicial igual a zero
incrementar adicionar o valor 1 ao estado atual do contador
zerar muda o valor atual para zero
A figura 2.1 mostra uma descrio grfica da classe CONTADOR.
Descrio Grfica da Classe CONTADOR
Esta notao na qual uma classe envolvida por uma nuvem pontilhada foi criada
por Grady Booch [2] e chamada de nuvem de Booch ou apenas diagrama de classe. O
nome da classe fica escrito acima da linha horizontal. Abaixo dela esto os comandos e as
consultas. O par de parnteses vazios perto de cada comando indica que estes comandos
requerem a entrada de uma informao externa.
2.2.2 A metfora do nome-verbo e nome- substantivo
Introduziremos uma notao para representar as aes que ns podemos executar em um
objeto. Continuaremos com o exemplo da classe CONTADOR, apresentado na ltima
seo. As quatro coisas que ns podemos fazer com este objeto so: criar um, aumentar o
seu valor em um, acessar o seu resultado atual e retornar o seu valor para 0. Estas so as
responsabilidades do objeto CONTADOR.
#pg017#nt085#cm00#
Suponha que deixemos a entidade contador_de_carros representar um objeto
contador que usado em um programa de simulao de trfego para manter o controle do
nmero de veculos que chegam a um posto de pedgio de uma ponte. Os comandos e a
consulta que podemos efetuar em tal objeto so:
Comandos:
contador_de_carros.criar
contador_de_carros.incrementar
contador_de_carros.zerar
Consulta:
contador_de_carros.resultado
Em cada uma dessas aes, o objeto recebendo a ao est conectado operao no
objeto por um conector ponto (.). Seria razovel dizer que a notao acima sugere que
estamos realizando aes em um objeto particular para os comandos ou obtendo
informao do objeto para a consulta..
Para os comandos, o objeto um substantivo e a ao um verbo. Para a consulta
tanto a objeto e a consulta so substantivos.
2.2.3 Estado Interno
Suponhamos que haja trs objetos CONTADOR no nosso programa simulador de trfego:
contador_de_carros, contador_de_caminhoes, e contador_de_onibus
3
. medida que
veculos chegam ao posto de pedgio da ponte, suponha que a seguinte seqncia de aes
acontece:
contador_de_carros.zerar
contador_de_caminhoes.zerar
contador_de_onibus.zerar
contador_de_carros.incrementar
contador_de_carros.incrementar
contador_de_onibus.incrementar
contador_de_carros.incrementar
contador_de_caminhoes.incrementar
contador_de_carros.incrementar
contador_de_caminhoes.incrementar
As trs primeiras aes iniciam os trs contadores em 0. Depois que as sete aes
restantes so efetuadas, os objetos tm o seguinte estado interno: contador_de_carros (4),
contador_de_caminhoes (2), contador_de_onibus (3). Os estados internos dos objetos so
diferentes uns dos outros por causa das diferentes aes incrementar efetuadas em cada um.
#pg018#nt095#cm00#
O ponto principal que, embora existam trs objetos CONTADOR distintos, cada
um caracterizado pelo mesmo modelo de objeto (descrio de classe dada na Figura 2.1), os
estados internos de cada um destes objetos evoluem dinamicamente.
3
NT: Note que os nomes no tem acentos, uma vez que devemos evitar o uso de acentos em identificadores
(nomes usados para representar algo) quando estamos escrevendo numa linguagem de programao qualquer.
2.2.4 Cenrios de objetos e mensagens
O diagrama de classe da Figura 2.1 representa um modelo esttico da classe CONTADOR.
O comportamento dinmico no mostrado. Um diagrama de cenrio de objeto pode ser
utilizado para descrever as interaes dinmicas entre os objetos.
Para cada comando dado no modelo de comportamento de uma classe (ex.: criar,
incrementar, zerar), uma mensagem correspondente a este servio pode ser enviada para
uma instncia da classe. Estas mensagens tomam a forma descrita na seo 2.2.3, onde dez
aes so citadas. Cada uma destas expresses envolvem o envio de uma mensagem para
um objeto.
O comportamento dinmico da classe CONTADOR mostrado na Figura 2.2. Esta
figura inclui objetos de outras classes que utilizam os objetos da classe CONTADOR.
Diagrama de cenrio de objeto
Na figura 2.2, quatro objetos so mostrados atravs das nuvens slidas de Booch. O
objeto simulacao uma instncia da classe SIMULACAO (detalhes no mostrados aqui).
O objeto posto_de_pedagio uma instncia da classe POSTO_DE_PEDAGIO (detalhes
no mostrados aqui). Os objetos contador_de_carros e contador_de_caminhoes so
instncias da classe CONTADOR.
Os nmeros indicam a seqncia das aes. A primeira ao est associada com o
objeto simulacao enviando a mensagem carro_chega para o objeto posto_de_pedagio. A
segunda ao est associada com o objeto posto_de_pedagio enviando a mensagem
incrementar para o objeto contador_de_carros. #pg019#nt050#cm00#A terceira ao
associada com o objeto simulacao de enviando a mensagem caminhao_chega para o objeto
posto_de_pedagio. A quarta ao associada com o objeto posto_de_pedagio emitindo a
mensagem incrementar para o objeto contador_de_caminhoes.
Deve-se enfatizar que somente mensagens que correspondem aos comandos
disponveis so permitidas. Por exemplo, pode ser ilegal para enviar para o objeto
contador_de_carros a mensagem aumentar_valor_em_tres. Tal mensagem com inteno
de aumentar o valor de resultado em trs unidades, somente seria permitida se estivesse
includa na descrio esttica da classe CONTADOR.
2.2.5 Parmetros
Suponha que fosse desejado incrementar o resultado do objeto CONTADOR em mais do
que um (ex.: muitos carros chegam em faixas diferentes na mesma cabinedepedgio ao
mesmo tempo). Um comando adicional pode ser adicionado ao modelo comportamental da
classe CONTADOR. Ns podemos especificar este comando como incrementar_em
(quantia : INTEGER). A entidade quantia : INTEGER dentro dos parnteses indica que
quantia um parmetro e INTEGER a sua descrio ou tipo. O parmetro quantia indica
qual o valor a ser adicionado resultado. Ns assumiremos que quantia deve ser um valor
positivo.
Um diagrama de classes modificado mostrado na figura 2.3 e um diagrama de
cenrio de objeto que uso o novo servio incrementar_em mostrado na figura 2.4.
Descrio modificada da classe CONTADOR
#pg020#nt070#cm00#
Diagrama modificado de cenrio de objeto
Um comando pode ter um ou mais parmetros, cada um de um tipo especfico. Eles
fornecem valores externos de entrada para o comando que ajudam a determinar a ao
executada.
Como exemplo de um comando com vrios parmetros, considere uma aplicao
que envolve a construo de uma janela no vdeo de um computador (regio geomtrica
definida por bordas em que os textos e grficos podem ser mostrados). A informao
externa requerida para construir tal janela inclui o comprimento e a largura da janela, alm
de sua coordenada superior esquerda. A especificao de tal comando em uma classe,
JANELA, pode ser:
criar (canto : PONTO; largura : INTEGER; altura : INTEGER)
O primeiro parmetro, canto, do tipo PONTO. O tipo PONTO uma classe que
inclui entre seus servios criar (x: INTEGER; y: INTEGER) para criar um objeto ponto de
coordenadas x e y.
As aes a seguir, dadas por duas mensagens, podem ser tomadas para criar um
objeto janela, cujas coordenadas do canto so (5,10), cujo comprimento 100 e cuja altura
200.
um_ponto.criar(5,10)
uma_janela.criar(um_ponto,100,200)
O primeiro comando cria e inicializa um objeto ponto (um_ponto) com coordenada
x igual a 5 e coordenada y igual a 10. Este objeto ponto usado para criar e inicializar um
objeto janela (uma_janela) com canto superior esquerdo dado por um_ponto e
comprimento de 100 e altura 200.
#pg021#nt080#cm00#
Ambas aes dadas pelas duas mensagens acima dependem da informao externa
enviada nos dois parmetros de criar da classe PONTO e os trs parmetros de criar da
classe JANELA.
Como um exemplo final que ilustra a importncia de permitir que os comandos
definidos em uma classe incluam parmetros, considere a classe VECULO. Suponha que
queremos criar um veculo com determinada cor, peso, custo e potncia. O comando criar
para a classe VECULO pode ser definido como:
criar (cor : STRING; peso : INTEGER; custo : REAL; potencia : INTEGER)
O parmetro cor do tipo STRING. Essa a classe que representa uma seqncia
de caracteres em modelo de dados (uma palavra comum). As caractersticas de tal classe
sero discutidas mais a frente no livro. Os parmetros peso e potencia so do tipo
INTEGER enquanto o parmetro custo do tipo REAL.
Embora no seja aparente, imediatamente ao leitor e de fato no parea natural,
valores numricos do tipo INTEGER tem comportamento diferente dos valores numricos
do tipo REAL. Um objeto do tipo INTEGER pode ter apenas valores inteiros. Um objeto
do tipo REAL pode ter valores fracionrios. Quando fazemos contas com valores do tipo
INTEGER, uma resposta exata computada. Por outro lado, quando fazemos contas em
valores do tipo REAL, nem sempre possvel chegar a uma resposta exata. Esse erro de
arredondamento presente nas unidades de processamento aritmtico de computadores
digitais causada pela capacidade finita de armazenamento para cada casa decimal. Uma
quantidade como 1/3 (uma frao recorrente que requer um nmero infinito de casas
decimais) s pode ser representada com preciso finita. Isto leva introduo de um
pequeno erro em qualquer computao que envolva essa quantidade decimal.
Como nmeros do tipo INTEGER se comportam de maneira diferente de nmeros
do tipo REAL, seus comportamentos so especificados em duas classes diferentes.
2.3 Relaes entre objetos
Raramente nos preocupamos com objetos isolados. Cincia em geral e cincia da
computao em particular esto se preocupando com modelagem e compreenso de
sistemas. Sistemas orientado por objetos envolvem vrios objetos de diferentes tipos
trabalhando juntos para atingir desejada meta.
importante que examinemos os tipos de relao que objetos podem ter uns com os
outros. Vrias relaes importantes que objetos podem ter uns com os outros so baseadas
nas relaes entre suas classes. #pg022#nt095#cm00#Estas incluem herana (vista na
seo 2.3.1), associao (vista na seo 2.3.2) e relao de uso (vista na seo 2.3.3).
2.3.1 Herana
A palavra herana sugere a aquisio de caractersticas de um ou mais ancestrais. Este
precisamente o sentido no qual ns deveremos usar este termo em associao com a
soluo de problemas orientada por objetos.
Suponha que queiramos construir uma nova classe, uma subclasse, que represente
uma especializao de uma classe existente. Queremos que a subclasse possibilite o
aumento de alguns atributos aos dados da classe me, assim como adicionar alguns
comandos ou consultas. Tambm queremos que a subclasse compartilhe as caractersticas
do modelos de dados da classe me e que fornea os servios da classe me.
H um princpio importante de consistncia que deve ser satisfeito quando uma
classe uma subclasse de outra. Este princpio tem trs partes:
A subclasse deve ter uma relacionamento lgico com a me que possa ser
expresso como a subclasse um tipo de da classe me.
Os atributos da classe me devem fazer sentido como parte do estado da
subclasse.
Os servios da classe me devem fazer sentido como parte do comportamento da
subclasse.
Como um exemplo, considere a ligao entre a classe VECULO e a classe
CARRO. Claramente, classe CARRO uma especializao da classe VECULO. H
muitos tipos de veculos que no so carros, mas no h carros que no sejam veculos.
Suponha que, para os propsitos deste simples exemplo, a classe VECULO tenha
os atributos cor, peso, velocidade_maxima, e preco. A classe CARRO tem os atributos
adicionais numero_de_cilindros e cavalos_de_forca.
Agora vamos considerar a classe AVIO, uma outra subclasse da classe VECULO.
Em acrscimo aos atributos peso, velocidade_maxima e preco, herdados da classe
VECULO, ela tem o atributo adicional envergadura_da_asa.
Considere agora duas subclasses de AVIO: AVIO_A_JATO e
AVIO_A_HLICE. A classe AVIO_A_JATO apresenta o atributo impulso_maximo
(uma caracterstica de suas turbinas) e a classe AVIO_A_HLICE apresenta o atributo
volume_deslocado (o volume de cada cilindro).
Por ser apenas um simples exemplo no sero feitos esforos no sentido de modelar
os comandos e consultas de cada uma destas classes. O diagrama de Booch na figura 2.5
mostra a hierarquia de herana para estas classes bsicas de veculo. As setas esto
direcionadas das subclasses para as classes me.
#pg023#nt070#cm00#
relaes de herana para classes VECULO.
2.3.1.1 Classificao
Foi mencionado anteriormente que o processo de classificao pode ser usado para
administrar complexidade. Sempre que um grupo relacionado mas de algum modo diferente
precisa ser modelado, uma anlise cuidadosa de suas semelhanas e diferenas pode levar a
uma hierarquia de classes. Atributos que so compartilhados por vrias devem ser
colocados no topo da hierarquia. Servios que so compartilhados por muitas subclasses
devem tambm ser colocados no topo da hierarquia. A base principal para classificao
usualmente baseada na distribuio e reuso dos atributos (o modelo de dados).
Como exemplo, vamos considerar o mundo de cachorros de raa pura,. O clube
KENNEL americano classificou os cachorros em vrios subgrupos, de acordo com suas
caractersticas fsicas e comportamentais. A figura 2.6 mostra um pouco das relaes
hierrquicas das classes de cachorros de raa.
Vrias classes so marcadas com adornos triangulares com a letra A colocada no
centro do tringulo. O smbolo indica que a classe uma classe abstrata. Uma classe
abstrata jamais ter instncias Seu propsito agrupar atributos comuns assim como os
servios que so necessrios nas classes descendentes. Esses atributos no so mostrados na
figura 2.6.
#pg024#nt065#cm00#
Classificaes de Ces
Um criador de ces capaz de saber muito sobre uma raa de ces, conhecendo
onde ela fica na hierarquia canina. Do mesmo modo, um engenheiro de software capaz de
saber muito a respeito do comportamento esperado de um objeto por conhecer onde est
situado na hierarquia da classe em volta dele.
2.3.2 Associao
Os objetos a nossa volta so geralmente compostos de outros objetos. Seu computador
composto de uma unidade central de processamento, memria de acesso aleatrio, memria
cache de alta velocidade e armazenamento secundrio. Cada um destes objetos pode ser
dividido em pequeno objetos.Se voc continuar a subdividir os componentes, no final, voc
se encontrar no nvel molecular ou atmico. Como sempre, o problema sendo resolvido
determina o nvel apropriado de granularidade na modelagem de algum objeto como uma
associao de outros objetos.
Vamos rever novamente o modelo de objeto de um carro. Um carro composto de
um motor, uma transmisso , um chassi, um jogo de rodas e pneus, um sistema eltrico, um
sistema de suspenso, um sistema de escapamento e componentes do interior. Cada um
destes so partes essenciais do carro e podem ser modelados como classes.
#pg025#nt050#cm00#
O objeto deve ser capaz de satisfazer ao relao tem_umem respeito a cada uma
de suas partes.
A Figura 2.7 Demostra as relaes de associao de um carro.
Relaes de associao entre classes.
O crculo escuro conectando a classe Carro com seus componetes Motor,
Transmisso, Suspenso, Rodas, ComponentesInternos, Sistema_de_Escapamento, e
Sistema_Eletrico indica ao relao tem um de associao.
2.3.3 Relao de uso
Muitas vezes uma classe precisa usar os recursos de uma outra classe que pode no estar
intimamente relacionada a ela. Por exemplo, uma classe SIMULAO pode precisar
realizar operaes matemticas, incluindo seno, coseno, e raiz quadrada. Suponha que estes
servios so encontrados na classe MATEMTICA.Alm disso, a classe SIMULAO
precisa desenhar figuras geomtricas na tela. Suponha os servios para fazer isto so
encontrados na classe GRFICOS.
A figura 2.8 demostra a relao de uso entre a classe SIMULAO e as classes
MATEMTICA e GRFICOS. Os crculos claros ligados classe SIMULAO indicam
a relao de uso com as classes MATEMTICA e GRFICOS.
#pg026#nt095#cm00#
Uma relao de uso entre classes
2.4 Tipos abstratos de dados
Um tipo abstrato de dados (TAD) um modelo de dados e um conjunto de operaes
associadas que podem ser efetuadas por ou em um modelo de dados. A classe
CONTADOR definida anteriormente um exemplo perfeito de um tipo abstrato de dados.
O modelo de dados consiste em um simples inteiro,resultado. As operaes que definem o
comportamento desse modelo de dados so criar, incrementar e incrementar_em. O tipo
abstrato de dados CONTADOR pode ser entendido como um elemento unificado cujo
propsito contar eventos ou coisas. As coisas que se pode fazer para um objeto contador
so zerar seu valor, incrementar seu resultado em 1, ou incrementar seu resultado de um
valor inteiro arbitrrio no negativo. Isso tudo. No se pode adicionar, subtrair,
multiplicar ou dividir um objeto CONTADOR por outro objeto CONTADOR ou por um
inteiro qualquer. Isso porque o tipo abstrato de dados definiu propriedades singulares que
no incluem tal aritmtica.
Tipos abstratos de dados proporcionam poderosas abstraes que podem ser usadas
como base para soluo de problemas. Os detalhes de baixo nvel do modelo de dados (os
internos do TAD) se tornam sem importncia quando decidimos como os TADs interagem
entre si. Apenas as propriedades externas do TAD (definidas pelo conjunto de operaes)
so importantes na determinao de seu uso.
Tipos abstratos de dados so representados por classes numa linguagem orientada
por objetos. Nas linguagens procedurais como C e Pascal, no h sintaxe de linguagem
direta ou suporte para tipos abstratos de dados. Programao cuidadosa e disciplinada
permite ao programador simular TADs.
O termo omisso de dados (data-hiding) usado significando que o modelo de
dados (estado interno) de um TAD no pode ser modificado pelo usurio. O estado interno
pode ser modificado apenas atravs do conjunto de operaes definidas pelo TDA. No h
segredo associado com o termo omisso de dados (data-hiding), apenas
proteo.#pg027#nt080#cm00#O estado interno de um objeto (um TAD) protegido de
corrupes negligentes.
Como se pode definir um tipo abstrato de dados para um semforo?
O modelo de dados da luz deve permitir os estados internos verde, amarelo e
vermelho. Esses valores podem ser definidos tendo um tipo COR_DE_LUZ (tal modelo de
dados permitiria somente trs valores para uma instncia de COR_DE_LUZ).
Os comandos que poderiam ser efetuados na luz incluem:
muda_cor (cor: COR_DE_LUZ)
prossiga
A operao muda_cor permite ao usurio ajustar o estado interno da luz. A
operao prossiga muda a cor da luz atravs da seqncia verde, amarelo, vermelho quando
aplicada repetidamente. O comportamento do semforo completamente especificado pelas
operaes muda_cor e prossiga.
2.5 Produtores e consumidores.
Um sistema de software geralmente composto de vrios componentes individuais. Em
uma organizao orientada por objeto, esses componentes so dados pelas classes. Uma
biblioteca de classes contm uma coleo de classes unidas por seu suportes para alguma
rea de aplicao. Bibliotecas de classes tm sido construdas para apoiar interfaces
grficas de usurio dentro da programao em Windows, banco de dados para
armazenamento de informaes complexas, matemtica computacional para aplicaes em
engenharia e cincias, estruturas de dados para representao de tipos abstratos de dados,
operaes de entrada e sada e outras reas de aplicaes.
Um produtor um programador cujo objetivo principal a construo de
bibliotecas de classes para serem usadas por outros programadores ou por outras partes de
uma aplicao. Um consumidor um programador que faz uso da biblioteca de classes
para aplicaes especficas. Muitas vezes um programador faz o papel dos dois, produtor e
consumidor, produzindo algumas classes para depois serem usadas por outras ou na prpria
aplicao, usando classes j existentes.
geralmente aconselhvel usar recursos disponveis de uma biblioteca existente
para desenvolver uma nova aplicao a menos que voc deseje desenvolver novas
aplicaes a partir de seus princpios bsicos (por exemplo reinventar a roda). Um
programador instrudo pode ser capaz de construir aplicaes de software atravs do uso de
componentes de software existentes que so conectados junto com uma pequena poro de
cdigo novo. Esta seria uma atividade de consumidor.
#pg028#nt070#cm00#
Como exemplo, considere, uma tpica aplicao inicial de programao. Ns
desejamos escrever um programa que mostra seu nome na tela de seu computador.
Muitas linguagens de programao so apoiadas por uma ou mais bibliotecas para
fazer entrada e sada de dados. Entrada de dados o processo de interao entre o usurio e
computador na qual o usurio transfere informao para o programa que voc est usando.
Sada de dados o processo de interao entre o usurio e o computador no qual um
programa transfere informao ao usurio.
O primeiro programa que ns desejamos construir envolve somente uma sada
simples. O programa dever mostrar o nome do usurio no terminal de vdeo.
A identao segue o estilo geral do Eiffel.
Um primeiro programa: Mostrando seu nome.
class PRIMEIRO_PROGRAMA
creation
inicio
feature
inicio is
do
io.putstring(Meu nome e xxx)
end;
end - class PRIMEIRO_PROGRAMA
Na listagem 2.1, a classe PRIMEIRO_PROGRAMA contm uma rotina, inicio, que
inicia a aplicao. Um arquivo de configurao chamado arquivo ACE informa ao sistema
EIFFEL que PRIMEIRO_PROGRAMA a classe de aplicao e especifica que inicio o
ponto de entrada para a aplicao. O leitor deve consultar o seu guia do usurio do sistema
EIFFEL para detalhes relacionados com a construo de um arquivo ACE.
A rotina inicio contm somente uma nica linha executvel de cdigo, io.put_string
(Meu nome e xxx) onde o usurio deve substituir o xxx com seu nome. O objeto io
definido em uma biblioteca padro de entrada e sada de dados disponvel em todos os
sitemas Eiffel. Esta biblioteca um importante componente reusvel de software. A rotina
putstring uma das muitas rotinas definidas nesta biblioteca. Ela permite ao usurio
mostrar uma string (de caracteres) no terminal de vdeo. Uma string uma seqncia
de caracteres.
#pg029#nt055#cm00#
Os detalhes formais para escrita de programas em Eiffel e o uso das bibliotecas
existentes nele esto introduzidos no captulo 3. Contudo o leitor pode querer digitar o
cdigo da listagem 2.1, compilar e execut-lo. muito emocionante quando o primeiro
programa de algum completado com sucesso.
O autor da listagem 2.1 agiu como um consumidor. O recurso que ele consumiu, ou
utilizou, foi a biblioteca padro de entrada e sada de dados. Em captulos posteriores voc
ver como inspecionar a interface das bibliotecas e como usar seus recursos. Do comeo ao
fim deste livro sero usadas rotinas importante de bibliotecas importantes do Eiffel na
construo de aplicaes especficas. Voc tambm dever ver o processo de criao de
rotinas para uso por outras pessoas.
Deve-se tornar um consumidor competente antes de se tornar um produtor
competente. Vrios captulos posteriores enfatizam as responsabilidades do produtor.
2.6 Modelagem de objetos
Modelagem de objetos envolve anlise e design. Por causa da natureza introdutria deste
livro, somente os conceitos fundamentais de design e anlise de objetos sero explorados
nesta sesso.
2.6.1 Anlise
Anlise de software, tanto orientado por objeto ou no, envolve entendimento e modelagem
do problema. Os principais elementos do problema so mapeados em componentes de
software. A arquitetura inicial destes componentes de software construda de maneira
precisa, descrevendo as conexes que existem entre vrias entidades do problema. No
contexto da orientao por objeto essas entidades so objetos, cada um uma instncia de
classe particular.
A anlises orientada por objetos envolve a descoberta de classes importantes e suas
conexes com outras classes importantes. Como discutido anteriormente, cada classe
encapsula um modelo de dados e um conjunto de servios associados. Estes servios
representam o modelo de comportamento das classes. Muito do trabalho de anlise
orientada por objeto envolve determinar o modelo de dados e comportamento de cada
classe.
A arquitetura esttica, desenvolvida no nvel de anlise, dada pelas associaes
entre classes. Essas associaes incluem relaes de associao (todo / parte essencial)
relao de uso e relaes de generalizao / especializao (herana). Essas relaes so
discutidas e ilustradas a seguir.
#pg030#nt095#cm00#
2.6.1.1 Relao de associao
Uma relao de associao uma relao todo / parte essencial ou intrnseca. O objeto
inteiro composto da parte. Essa parte deve ser essencial para a integridade do todo.
A relao de associao um tipo natural de associao. Muitos dos objetos ao seu
redor so compostos de partes constituintes. Por exemplo, seu monitor composto por uma
capa de plstico, um tubo de vdeo e botes de controle ou teclas. Cada uma dessas partes
constituintes so essenciais para o funcionamento do monitor.
O motor em um carro pode ser considerado a ser uma parte essencial do carro.
Embora podendo certamente ser argumentado que o motor tem uma identidade prpria (at
o seu prprio nmero de srie), pode ser produzido em local separado e pode ser colocado
dentro e fora de carros, pela maioria das aplicaes o carro associado com um motor
particular que no ser mudado. Alm disso, o funcionamento do carro totalmente
dependente da presena de um motor. A partir desse ponto de vista, a identidade de um
carro (o objeto inteiro) no separado do motor (a parte constituinte e essencial). O sistema
de transmisso do carro poderia tambm ser considerado uma parte essencial do carro.
Algum poderia, portanto, dizer que o carro (o todo) tem uma relao de associao com o
motor e a transmisso (as partes). H, claro, muitos outros componentes essenciais do
carro que no foram citados.
Num anel de diamante, justo argumentar que o anel (o objeto todo) tem uma
relao de associao com suas partes essenciais, um aro de ouro e uma pedra de diamante.
Embora cada uma possa ser produzida separadamente, de um ponto de vista de modelo a
identidade d aro de ouro e da pedra de diamante no crtica. O que crtico a identidade
de todo o objeto, o anel.
A notao de Booch para uma relao de associao mostrada na figura 2.9. A
classe com o retngulo escuro a parte e a classe com o crculo escuro o todo.
Relao de associao
#pg031#nt095#cm00#
2.6.1.2 Relao de Uso
Como exemplo de uma relao de uso, tomemos uma sala, algumas mesas e cadeiras. A
sala tem uma identidade sem suas mesas e cadeiras. A sala ainda existe mesmo quando est
vazia. As mesas e cadeiras podem ser mudadas, rearranjadas, trocadas, ou facilmente
removidas.
A notao de Booch para uma relao de uso mostrada na figura 2.10. Aqui uma
sala mostrada tendo um relacionamento de uso para zero ou mais cadeiras e zero ou mais
mesas.
Relao de Uso
2.6.1.3 Relao de Herana
Herana um contexto de programa orientado por objeto que implica em especializao.
Uma classe pai define atributos gerais e comportamento que so compartilhadas pelas suas
crianas. Cada classe criana contm atributos ou comportamento (servios) mais
especializados que no esto presentes no pai.
Por exemplo, um carro pode ser considerado outro tipo especial de veculo. Um
carro e um avio podem compartilhar certos atributos (cor, peso, preo) mas tm atributos
separados (nmero de pistes para um carro, envergadura de asa para um avio).
A notao de Booch para herana mostrada na Figura 2.11 usando as classes
VEICULO, CARRO e AVIAO. As setas apontam da criana ao pai (na direo da
generalizao).
Relao de Herana
#pg032#nt095#cm00#
2.6.2 Anlise de um elevador
Discutiremos alguns elementos simples da anlise orientada por objeto de um elevador em
um prdio comercial.
Quais so os aspectos relevantes para o problema? Existe, claro, um elevador.
Existe um conjunto de botes, cada um com um nmero indicando um andar em particular
do prdio comercial. O elevador pintado com uma certa cor. Mas isto certamente no
relevante para o funcionamento de um elevador e no ser includo no modelo de anlise.
Finalmente, existe um usurio, um ser humano que entra no elevador e deseja ser
transportado para outro andar, tanto superior quanto inferior, no prdio comercial.
Baseado na descrio do problema, existe uma relao todo/parte entre o elevador e
seus botes. Cada elevador tem um conjunto de botes que contm todos os locais onde o
elevador pode ir. Estas so as partes essenciais de um elevador.
Na Figura 2.12, um simples diagrama de classe exibindo a classe ELEVADOR e a
classe BOTO, mostrado.
Diagrama de classe para elevador
Cada nuvem pontilhada representa uma classe. O nome de classe dado dentro da
nuvem. Como indicado anteriormente, a reta com um ponto em seu comeo, que une a
classe ELEVADOR classe BOTAO, indica uma relao todo/parte ou uma relao de
associao. A classe com o ponto tem ou composta da classe que no tem o ponto.
A notao, 1..n, no final da linha indica que existe um ou mais botes que so partes
do elevador. O quadrado no final desta linha indica que a classe ELEVADOR contm um
conjunto de botes (eles no so compartilhados por quaisquer outros objetos).
Quando uma pessoa entra em um elevador, ele ou ela aperta um boto. Esta ao
mostrada no diagrama de cenrio de objeto dado na Figura 2.13.
Cada nuvem slida representa um objeto especifico com um nome dado dentro da
nuvem. Os nmeros seguidos de dois pontos representam a seqncia das aes. Os trs
eventos que so mostrados na Figura 2.13 so: (1) uma pessoa entra no elevador, (2) a
pessoa escolhe um dos vrios botes, e (3) a pessoa aperta este boto escolhido.
#pg033#nt085#cm00#
Diagrama de cenrio de objetos para uma pessoa entrando no elevador.
O primeiro evento, uma pessoa entrando no elevador, descrito na figura 2.13 pelo
objeto uma_pessoa mandando a mensagem entrar para o objeto um_elevador.
O segundo evento na figura 2.13 exibido pelo objeto uma_pessoa mandando a
mensagem selecionar_boto para uma coleo de objetos botes, mostrado por trs
nuvens. O boto selecionado mostrado com o nome botao_selecionado.
O terceiro evento exibido o objeto uma_pessoa enviando a mensagem apertar
para o objeto botao_selecionado.
2.6.3 Projeto
Se algum olha para o problema ao fazer uma anlise, deve olhar para a soluo quando faz
o projeto. A soluo um sistema de software contendo vrios objetos que interagem uns
com os outros. Cada objeto tipicamente definido por uma classe. Durante o projeto,
identifica-se precisamente classes adicionais que interagem com classes principais
identificadas na anlise para completar uma soluo para o problema.
A natureza preliminar deste livro o faz imprprio para detalhar a fase de projeto.
#pg034#nt090#cm00#
2.7 Sumrio
Objetos ordinrios so caracterizados por seus comportamentos assim como seus
atributos.
Parece que os seres humanos possuem uma habilidade natural de classificar
objetos. Ns chamaremos essas classificaes de classes.
A palavra instncia ser usada para significar um objeto cujas propriedades so
descritas numa classe.
A descrio de um objeto, a abstrao do objeto, baseada no domnio do
problema no qual o objeto existe.
Uma abstrao representa uma descrio simplificada da realidade.
As caractersticas do objeto que so essenciais para se achar uma soluo do
problema dado deve ser representada no modelo do objeto (a classe) assim como
caractersticas que no so essenciais devem ser ignoradas.
Coad e Yourdon definem um objeto como uma abstrao de algo no domnio de
um problema, refletindo a capacidade de um sistema de manter informao sobre
ou interagir com ele; um encapsulamento de atributos e seus servios exclusivos.
O modelo de dados fornece uma precisa especificao de qual informao
mantida em cada objeto.
O modelo de comportamento fornece uma precisa especificao dos comandos
que podem ser realizados no objeto.
Um objeto recebendo uma ao conectado operao nesse objeto usando um
conector ponto (.).
Um diagrama de classe usado para descrever a arquitetura esttica do sistema
de software.
Um diagrama de cenrio de objeto usado para descrever as interaes
dinmicas entre objetos.
Um servio especfico pode ter um ou mais parmetros, cada um de tipo
especfico. Isso fornece uma entrada externa ao servio que ajuda a determinar a
ao realizada pelo servio.
Cincia em geral e cincia da computao em particular envolve modelagem e
compreenso de sistemas.
#pg035#nt065#cm00#
Sistemas orientados por objetos envolvem muitos objetos de tipos diferentes
trabalhando juntos para alcanar, de alguma maneira, um objetivo desejado.
O processo de classificao pode ser usado para gerenciar complexidade.
Sempre que um grupo de objetos diferentes, mas relacionados de alguma
maneira, precisarem ser modelados, uma cuidadosa considerao de suas
semelhanas e diferenas pode levar a uma hierarquia de classes.
Atributos que so compartilhados por muitas subclasses devem ser postos em
classes no topo da hierarquia.
A base fundamental para classificao geralmente baseada na distribuio e
reunio de atributos (isto , um modelo de dados)
A subclasse deve ter um relacionamento lgico com sua classe me, que possa
ser expressa como a subclasse um tipo de da classe me.
Os atributos da classe me devem todos fazer sentido como parte do estado da
subclasse.
Todos servios da classe me devem fazer sentido como parte do comportamento
da subclasse.
Os objetos em nossa volta geralmente so feitos a partir de outros objetos mais
simples.
Um tipo abstrato de dados (TAD) um modelo de dados e um conjunto
associado de operaes que podem ser feitas no modelo de dados.
Os tipos abstratos de dados fornecem poderosas abstraes que podem ser usadas
como base para resolver problemas.
Torna-se sem importncia o interior dos TADs quando decidimos como eles vo
interagir entre si. Somente as propriedades externas do TAD (definidas por um
conjunto de operaes) so importantes na determinao de seu uso.
Os tipos abstratos de dados so representados por classes em linguagens
orientadas por objetos.
O termo omisso de dados usado para dizer que o modelo de dados (estado
interno) de um TAD no pode ser acessado diretamente pelo usurio. O estado
interno s pode ser modificado atravs de um conjunto de operaes pr-
definidas.
Um produtor um programador cujo objetivo principal a construo de uma
biblioteca de classes para outros programadores ou outras partes de um
aplicativo.
#pg036#nt000#cm00#
#pg037#nt085#cm00#
Desenhe um diagrama de Booch de uma hierarquia de veculos. A classe raiz
nesta hierarquia dever ser a classe VEICULO. Indique os atributos associados a
cada classe na sua hierarquia de veculos. Os dois primeiros elementos do
princpio de consistncia esto satisfeitos na sua hierarquia? Explique em
detalhes.
Acrescente alguns mtodos (comportamento) para cada classe em sua hierarquia
veculo do problema anterior. O terceiro elemento do princpio de consistncia
foi satisfeito para sua hierarquia?
Desenhe um diagrama de Booch que descreve as classes que modelam uma sala
de aula universitria. Inclua os estudantes, professor, monitor, e qualquer outra
coisa que voc puder pensar. Mostre as relaes que estes objetos tm um com o
outro em seu diagrama de classe.
Ilustre o princpio de composio construindo uma classe que composta de
outros objetos. Desenhe um diagrama de Booch de sua classe.
Descreva os passos fundamentais envolvendo o ato de escrever um cheque
pessoal usando um diagrama de cenrio de objeto de Booch. Mostre todos os
objetos envolvidos em seu cenrio e a sucesso de mensagens enviadas a cada
objeto. Descreva com suas prprias palavras o significado de seu diagrama.
Mostre as associaes apropriadas entre as classes que descrevem as entidades
seguintes: tulipa, rosa, flor, ptala, abelha, vaso de flor.
Mostre as associaes apropriadas entre as classes que descrevem as entidades
seguintes: motocicleta, bicicleta, carro, barco, hidroavio, avio, avio a jato,
planador e mobilete.
Mostre as associaes apropriadas entre as classes que descrevem as entidades
seguintes: biblioteca, livros, fichrio, estantes, sees de estantes, e usurios.
Mostre as associaes apropriadas entre as classes que descrevem as entidades
seguintes: universidade, salas de aula, estudantes, professores, quadro-negro,
escrivaninhas, terminais de computador, cadeiras, cadernos, e cursos. Se voc
desejar acrescentar algumas entidades adicionais para enriquecer sua modelagem
de objetos, sinta-se livre para fazer isto. Indique para toda classe adicional seu
propsito e mostre sua associao com as classes especificadas acima.
#pg038#ntnnn#cm00#
#pg039#nt085#cm00#
3 Os Elementos Bsicos de Programas de Eiffel
3.1 Programando
Ns comearemos a programar neste captulo.
Um sistema de software uma coleo interconectada de unidades algumas vezes
chamadas mdulos. Cada mdulo contm um conjunto logicamente coerente de operaes
e um modelo de dados subjacente (que est por trs das operaes). Em um contexto de
orientao por objetos, um mdulo o mesmo que uma classe: uma unificao de um
modelo de dados e comportamento consistindo em um conjunto de funes chamadas
consultas e comandos que podem acessar e manipular as informaes contidas no modelo
de dados. A princpio cada mdulo representa um pedao potencialmente reutilizvel de
cdigo.
Um ponto de vista de "sistemas" bem diferente do ponto de vista de um
"programa" monoltico mais tradicional. Usando a abordagem do "programa", todo o
comportamento desejado do software deve ser embutido e considerado para a nica
entidade (seu programa). Usando a abordagem de "sistemas", cada mdulo responsvel
por apenas uma pequena, mas bem enfocada poro do comportamento desejado do
software.
Linguagens de programao mais modernas, inclusive Eiffel, favorecem uma
abordagem de "sistemas" para construo de software. Esta a abordagem que ns
tomaremos desde o comeo. Usando esta abordagem, nosso primeiro programa de Eiffel
que se denomina "Meu primeiro programa" dado na listagem 3.1.
Para se ajustar com o mais recente padro de formatao Eiffel, todos os caracteres
so escritos em itlico e em adio, palavras reservadas na linguagem so escritas em tipo
negrito.#pg040#nt075#cm00# A indentao tambm segue o padro de formatao Eiffel.
Primeiro programa em Eiffel
class APLICAO
creation
comece
feature
comece is
do
io.put_string("meu primeiro programa")
io.new_line
end
end --class APLICAO
Os dois comandos de sada, put_string e new_line quando enviados para o objeto
padro de entrada e sada (o objeto io) fazem com que a string meu primeiro programa,
seja exibida na sada padro (seu monitor de vdeo) com a posio do cursor movida para a
prxima linha. Como a sada e entrada de dados so necessrias e so padro, o objeto io
no precisa ser declarado explicitamente. Sua existncia ocorre por padro, em todas as
aplicaes em Eiffell.
Mesmo para ser capaz de escrever este simples programa, o programador deve ter
algum conhecimento dos servios de sada de dados na classe STANDARD_FILES. Um
resumo destes servios pode ser obtido usando uma ferramenta chamada short. Esta
ferramenta retira todos os detalhes de implementao e revela somente a informao de
interface que poderia ser relevante para o uso desta classe. A listagem 3.2 mostra parte
destes detalhes de interface usando o resultado da aplicao do short na classe. Somente as
rotinas de sada de dados contidas nesta classe so mostradas, Elas proporcionam meios
para que o programador possa imprimir caracteres, inteiros, fraes decimais (nmeros do
tipo ponto flutuante), strings e valores booleanos.
Partes da interface da classe STANDARD_FILES.
class interface STANDARD_FILES
feature specification
-- rotinas de sada
#pg041#nt090#cm vrios erros de formatao#
put_char (c : CHARACTER)
--Escreve c no fim da sada default.
put_string (s : STRING)
--Escreve s no fim da sada default.
put_real (r : REAL)
--Escreve r no fim da sada default.
put_double (d : DOUBLE)
--Escreve d no fim da sada default.
put_int (i : INTEGER)
--Escreve i no fim da sada default.
put_bool (b : BOOLEAN)
--Escreve b no fim da sada default.
new_line
--Escreve mudana de linha no fim da sada default.
--Muitas rotinas no exibidas.
end interface classe STANDARD_FILES
A classe APLICAO na Listagem 3.1 serve para iniciar a execuo do software.
Ela a classe raiz da aplicao. Todos os softwares Eiffel devem estar acompanhados de
um arquivo Ace que especifica onde esto os arquivo das bibliotecas padro, os arquivos
gerados pelo programador que constituem a aplicao dada, o nome da classe raiz, e o
nome da rotina de criao dentro da classe raiz. O arquivo Ace que controla a aplicao
dada na Listagem 3.1 mostrado na Listagem 3.3.
Arquivo Ace para Listagem 3.1 (Usando sistema ISE Eiffel 3)
system test
root aplication (ROOT_CLUSTER): comece
default
assertion (all);
precompiled ($EIFFEL3/precomp/spec/$PLATFORM/base)
cluster
ROOT_CLUSTER: /disk2/EIFFELWORK3/WORK;
end
#pg042#nt085#cm erro no layout#
O Leitor pode querer consultar o manual de instrues que vem junto com o sistema
Eiffel para maiores detalhes a respeito de arquivos Ace.
3.2 A linguagem Eiffel
A linguagem nasceu no final dos anos 80. uma linguagem totalmente orientada por
objeto. Isto implica que as funes podem ser chamadas somente atravs de objetos e no
sozinhas, como entidades lgicas auto-suficientes. O que um contraste evidente para a
popular, mas complexa linguagem orientada por objetos C++ que admite uma mistura de
programao orientada por objetos e estruturada na mesma aplicao, sendo denominada
linguagem hbrida.
Como uma linguagem totalmente orientada por objeto, a classe em Eiffel a
unidade bsica lgica do encapsulamento bem como a unidade bsica fsica, um mdulo.
Um programa em Eiffel organizado como um conjunto de classes interligadas e
cooperando entre si.
Nas diversas sees seguintes os elementos bsicos da programao em Eiffel sero
apresentados. Muitos desses elementos so similares aos de outras linguagens. O projetista
do Eiffel, Bertrand Meyer, tem sido um grande estudioso da tecnologia de linguagens de
programao e projetou uma sintaxe que utiliza algumas das melhores caractersticas
encontradas nas outras linguagens. Acredito que voc ir achar a sintaxe do Eiffel coerente,
lgica e legvel.
3.3 Criando e destruindo objetos
Programas so constitudos de classe que criam objetos. Estes objetos so criados, realizam
suas tarefas, e so normalmente destrudos. Quando um objeto criado, um espao na
memria reservado para seu armazenamento. Quando o mesmo destrudo o espao
reservado liberado e poder ser reutilizado por outros objetos criados depois.
Um objeto em Eiffel, e nas outras linguagens orientadas por objetos, uma instncia
de uma classe. Seus atributos so dados por um modelo de dados de sua classe. Os
comandos que ele pode responder (as rotinas que se pode solicitar atravs dele) so
especificados por um conjunto de rotinas dadas na descrio da classe.
Antes de um objeto ser criado no Eiffel, ele deve ser declarado para se tornar uma
varivel de um certo tipo. Este tipo o nome da classe da qual o objeto ser uma instncia
(depois de criado). Quando uma declarao de tipo em Eiffel como, meu_carro : CARRO,
dada, o compilador verifica se a classe referida foi definida. Normalmente o arquivo que
define a classe deve estar no mesmo subdiretrio da classe na qual a declarao existe.
#pg043#nt070#cm vrios erros de identao na listagem#
A declarao meu_carro: CARRO no cria uma instncia da classe CARRO.
Nenhuma memria reservada para o objeto meu_carro, como em qualquer outro objeto
que foi apenas declarado, assumindo o valor Void(que significa vazio). Neste estado, o
objeto no pode receber qualquer comando ou efetuar nenhuma tarefa proveitosa.
Normalmente, para meu_carro se tornar uma instncia da classe CARRO e ter um
regio de memria corretamente alocada para si, uma rotina de criao ou um operador de
criao deve ser usado.
Considere o caso onde a classe CARRO no tem nenhuma rotina de criao
especificada. O que poderia fazer o objeto meu_carro existir (ou seja, reservar um local de
armazenamento para ele) poderia ser usar o seguinte operador de criao: !!meu_carro. O
resultado desta expresso a criao de um local para armazenar meu_carro, mas sem
providenciar qualquer inicializao dos atributos que podem ser definidos na classe
CARRO. Desta maneira, alguns atributos, como aqueles declarados como sendo do tipo
INTEGER, REAL, BOOLEAN ou CHARACTER, assumem inicialmente valores padro
(nulos).
Considere outro caso onde a classe CARRO providencie trs rotinas de criao:
criar, montar e construir. Uma parte da classe CARRO a seguinte:
class CARRO
creation
criar, montar, construir
feature
criar(cor: STRING; preo: REAL; peso: INTEGER) is
-- Detalhes no mostrados
end -- criar
montar(cor: STRING; preo: REAL; peso: INTEGER;
potencia: INTEGER) is
-- Detalhes no mostrados
end -- montar
construir(cor: STRING) is
-- Detalhes no mostrados
end -- construir
Algumas expresses que poderiam criar o objeto meu_carro incluem:
!!meu_carro.criar(Branco, 25600, 3100)
!!meu_carro.montar(Vermelho, 12000, 3500, 125)
!!meu_carro.construir(Azul)
#pg044#nt095#cm00#
Em todas as trs expresses acima, o objeto meu_carro criado e inicializado com
os valores dados como parmetros nas vrias rotinas de criao. No primeiro caso dado
acima (!!meu_carro) meu_carro criado mas os atributos assumem seus valores padro.
Deveria ficar claro nessa discusso que objetos devem ser explicitamente criados ou
usando o operador de criao (!!) na frente do objeto que voc deseja criar ou usando uma
rotina de criao especfica em conjunto com o operador de criao, como mostrado nos
trs exemplos acima.
Como os objetos de Eiffel so destrudos? Os sistemas Eiffel proporcionam coleta
automtica de lixo (garbage collection). medida que um aplicativo Eiffel roda, um
processo de coleta de lixo est rodando em segundo plano e detectando quando uma regio
de memria no est mais ligada a um nome de varivel. Em um momento oportuno o
processo de coleta de lixo recicla (efetivamente destri) o armazenamento desnecessrio. O
seguinte segmento de cdigo mostra um exemplo de um armazenamento que no mais
necessrio:
meu_carro : CARRO
!!meu_carro.construir(Azul)
!!meu_carro.construir(Vermelho)
A sentena, !!meu_carro.construir(Azul), faz com que o armazenamento de
memria seja alocado e o nome do objeto meu_carro anexado a esse armazenamento. A
terceira sentena, !!meu_carro.construir(Vermelho), faz com que novo armazenamento
de memria seja alocado e o nome do objeto meu_carro anexado a esse novo
armazenamento, deixando o antigo desanexado de qualquer outro nome de objeto.
A seqncia de aes mostrada na Figura 3.1.
#pg045#nt090#cm00#
Produo de Lixo.
A seo de memria destacada que contm Azul pode ser recuperada pelo coletor
automtico de lixo (garbage collector) enquanto o programa est rodando. No da
responsabilidade do programador de Eiffel fazer isto.
3.4 Tipos bsicos, valores default e atribuies
Existem vrios tipos bsicos de objetos que no exigem uma criao definida para serem
usados. Os importantes so: INTEGER, CHARACTER, REAL e BOOLEAN. Considere as
seguintes declaraes:
um_inteiro : INTEGER
um_caracter : CHARACTER
um_real : REAL
um_boolean : BOOLEAN
Cada um desses objetos de tipos bsicos recebe um valor default que no Void.
Objetos do tipo INTEGER tm um valor default de 0. Objetos do tipo
CHARACTER tm um valor default do caracter NULL (valor ASCII 0). Objetos do tipo
REAL tm um valor default de 0.0. Finalmente, objetos do tipo BOOLEAN tm um valor
default de false.
#pg046#nt030#cm00#
Os tipos bsicos apresentados na seo anterior tm significado de valores. Isto
implica que a declarao de tais objetos causam alocao automatica de memria e
atribuio de valores default para eles.
Quando um tipo bsico de objeto (objeto de origem), atribudo para outro tipo
bsico de objeto (objeto de destino), este reside numa regio de memria diferente de onde
est o objeto de origem. O operador de atribuio do Eiffel :=.
O comando a := b deve ser lido como a recebe b.
A figura 3.2 mostra a atribuio entre dois objetos do tipo inteiro.
Atribuio de objetos de tipos bsicos
3.5 Tipos de objetos ordinrios ou de referncia.
Objetos ordinrios (objetos no bsicos) tem semntica de referncia. Isso implica que o
programador responsvel pela alocao de memria atravs de um operador de criao,
possivelmente junto com uma rotina de criao como foi discutido na seo 3.3. O valor
default de um objeto ordinrio Void. Aps o programador alocar um espao na memria
para um objeto, o nome do objeto anexado quela regio de memria (ver figura 3.1)
O que significa atribuir um objeto ordinrio a outro?
Considere o segmento de cdigo abaixo:
#pg047#nt050#cm00#
meu_carro: CARRO
seu_carro: CARRO
!!meu_carro.criar (verde,1000,2000)
seu_carro:=meu_carro
A figura 3.3 representa a semntica do segmento de cdigo acima.
Atribuio de objetos de tipos de referncia
Depois da atribuio de meu_carro para seu_carro, ambos nomes dos objetos, so
ligados mesma regio de memria. Isto implica que se um dos atributos de meu_carro for
modificado, atravs do envio de um comando tal, como meu_carro.mudar_peso(2500), o
atributo peso de seu_carro tambm ser modificado para 2500. No h dois objetos
independentes, mas dois nomes diferentes para o mesmo objeto na memria (s um objeto
existe na memria do computador).
3.6 Copiando Objetos
Supondo que nos desejssemos que o objeto seu_carro da seo anterior tivesse os mesmos
valores de atributos de meu_carro, sendo um objeto independente que no ligado
mesma regio de memria de meu_carro. Suponha que meu_carro tivesse sido criado e
inicializado. Isto pode ser feito assim: (1) Crie o objeto seu_carro e (2) Use a rotina copy
que disponvel para todos objetos em Eiffel.
seu_carro.copy(meu_carro) --assume que seu_carro foi criado
#pg048#nt050#cm00#
essencial que o objeto seu_carro j tenha sido associado uma regio de memria
para a rotina copy trabalhar. Um erro de tempo de execuo ser criada e um erro ser
relatado se voc invocar a rotina copy sobre um objeto vazio (com o valor Void).
A semntica da rotina copy mostrada na figura 3.4.
Figura 3.4. Semntica da cpia.
3.7 Clonagem
Suponha que voc deseja alocar memria para seu_carro e ao mesmo tempo voc pretende
copiar os valores dos atributos de meu_carro para seu_carro. Isto pode ser realizado
usando a rotina clone disponvel para todos objetos Eiffel. Isto pode ser feito da seguinte
maneira:
seu_carro:=clone(meu_carro)
A semntica da rotina clone est mostrada na figura 3.5.
#pg049#nt090#cm00#
Semntica da clonagem
3.8 Operadores bsicos com exemplos
Operador de igualdade (=): Dois objetos so iguais se eles esto ligados uma mesma
seo de memria. Se algum quiser testar se os objetos x e y so iguais, uma expresso do
tipo x=y poderia ser usada.
Exemplo:
meu_valor,seu_valor : REAL
if meu_valor=seu_valor then - se os valores so os mesmos tome
alguma atitude
-- alguma atitude
end
Operador de desigualdade(/=): Para testar se os objetos x e y no so iguais, uma
expresso do tipo if x/=y poderia ser usada.
Exemplo:
meu_valor,seu_valor : INTEGER
if meu_valor/=seu_valor then - se os valores no so iguais tome
alguma atitude
-- alguma atitude
end
#pg050#ntnnn#cm00#
#pg051#nt090#cm00#
\\ (Operador binrio para resto)
Exemplo:
a,b,c : INTEGER
b :=11
c :=4
a :=b\\c --valor 3
< (Operador binrio para menor que)
Exemplo:
b,c : INTEGER
b :=10
c :=4
if b<c then --realiza alguma ao apenas se b menor que c
--alguma ao
end
<= (Operador binrio para menor ou igual)
> (Operador binrio para maior que)
>= (Operador binrio para maior ou igual)
Operadores do tipo REAL:
+ (Operador binrio para adio)
- (Operador binrio para subtrao)
* (Operador binrio para multiplicao)
/ (Operador binrio para diviso)
^ (Operador binrio para exponenciao)
< (Operador binrio para menor que)
<= (Operador binrio para menor ou igual)
> (Operador binrio para maior que)
>= (Operador binrio para maior ou igual)
Operadores do tipo BOOLEAN:
not (operador unrio para negao lgica)
Exemplo:
b,c : INTEGER
b:=10
c:=4
if not (b<c) then -- realiza alguma ao apenas se c
-- menor ou igual a b
--alguma ao
end
#pg052#nt065#cm layout errado#
or (operador lgico binrio ou)
Exemplo:
b,c: INTEGER
b:=10
c:=4
if b>0 or c>2 then -- toma a ao abaixo se b positivo ou c
maior que 2.
-- alguma ao
end
and (operador lgico e)
Exemplo:
b,c: INTEGER
b:= 10
c:= 4
if b>0 and c>2 then -- toma a ao abaixo se b positivo e c
maior que 2.
-- alguma ao
end
implies (usada em assertivas)
or else (operador lgico binrio para ou em curto-circuito)
Exemplo:
b,c: INTEGER
a:=12
b:= 10
c:= 40
if b=0 or else c//b > 2 then
-- toma a ao abaixo se b zero ou c//b maior que 2
-- avalia a expresso c//b apenas se b no igual a 0
-- alguma ao
end
and then (operador lgico binrio para e em curto-circuito)
Exemplo:
b,c: INTEGER
a:=12
b:=10
c:=40
#pg053#nt090#cm00#
if b>0 and then c//b>2 then
--execute a ao apenas se b positivo e c//b maior que 2
--calcule a expresso c//b apenas se b positivo
--alguma ao
end
Os ltimos dois operadores, or else e and then, s vezes so chamados
operadores de curto circuito. Para o operador "or else", se a primeira expresso verdade, a
segunda expresso nunca calculada. Para o operador "and then" , se a primeira expresso
falsa, a segunda expresso nunca calculada.
3.9 Ramificao
O tipo mais simples de ramificao a clusula if. Esta estrutura de controle usada
quando a execuo de uma ou mais linhas de um cdigo, um bloco de cdigo, baseada no
resultado de um teste lgico que executado antes de entrar no bloco de cdigo. O teste
lgico requer a avaliao de uma expresso do tipo boolean. Tal expresso pode ser
verdadeira (TRUE)ou falsa (FALSE). A forma desta estrutura :
if uma_expresso_booleana then
comando(s)
end
Exemplo:
if velocidade_no_solo > 160 then
--o avio decola
end
Outra estrutura simples de controle a estrutura if-then-else. usada quando uma
escolha deve ser feita entre dois blocos de cdigo. A escolha est baseada na avaliao de
uma expresso do tipo boolean. Esta estrutura de controle construda como segue:
if expresso_booleana then
bloco_1
else
bloco_2
end
Aqui, bloco_1 e bloco_2 representam uma ou mais linhas de cdigo.
#pg054#nt040#cm00#
Exemplo:
if velocidade_em_terra > 160 then
-- o avio decola
else
-- o avio para e a decolagem interrompida
end
O comando if-then-else podem ser aninhado. Considere o segmento de cdigo
seguinte:
if expresso1 then
comando1
else
if expresso2 then
comando2
else
comando3
end
end
Se expresso1 for verdadeira, ento comando1 ser executado. Caso contrrio, se
expresso2 for verdadeira ser executado o comando2; caso contrrio ser executado o
comando3.
Suponha que um entre vrios ramos devesse ser executado baseado na avaliao
de expresses que podem ser falsas ou verdadeiras. O comando if-elseif-else pode ser
adequado.
Esta construo a seguinte:
if expresso1 then
comando1
elseif expresso2 then
comando2
elseif expresso3 then
comando3
else
comando4
end
A expresso else na construo acima opcional. No existe um limite para o
nmero de expresses de elseif.
Exemplo:
if velocidade_em_terra > 220 then
-- diminuir a velocidade
#pg055#nt000#cm00#
#pg056#nt050#cm layout errado#
3.10 Iterao (loop)
Iterao ou loop uma operao lgica fundamental da computao. Um nico comando
ou, mais tipicamente, um bloco de comandos so executados repetidamente, at que alguma
condio de parada seja satisfeita. Se a condio de parada nunca for satisfeita, a execuo
das declaraes dentro do loop continuar indefinidamente e o programa tipicamente
parece travar (jargo que significa que o programa parece no estar fazendo qualquer
coisa de til uma vez que ele no exibe resultados).
Num loop corretamente construdo, a condio de parada eventualmente
encontrada.
A forma geral das construes de iterao :
From
instrues_de_inicializao
Until
condies_de_sada_do_loop
loop
corpo_do_loop
end
O comando (ou comandos) que compreendem as instrues_de_inicializao so
executados exatamente uma vez. As condies_de_sada_do_loop so testadas antes de
cada execuo do loop. Se a expresso for avaliada como falsa, o loop executado; de
outra maneira o loop terminado e o controle transferido para a linha abaixo da
declarao end. Claramente, algumas aes so encontradas no corpo do loop (os comandos
entre palavras loop e end) que eventualmente tornaro as condies_de_sada_do_loop
verdadeiras.
Por exemplo, imagine que queremos mostrar todos os inteiros que so potncia de 2
at 65536. O segmento do cdigo que realiza isto usando o comando loop assim
construdo:
from index:=1
until index=65536
loop
index:=index * 2
io.put_int(index)
io.new_line
end
A instruo index:=1 representa as instrues_de_inicializao. Ela faz com que
index assuma o valor inicial de 1. A declarao index=65536 representa as
condies_de_sada_do_loop e as trs linhas do cdigo logo abaixo de loop representam o
corpo_do_loop.#pg057#nt090#cm00# O comando index := index * 2 substitui o valor
antigo de index por um valor duas vezes maior. O comando deve ser lido assim:
index recebe index vezes 2.
Ns examinaremos outros exemplos para ilustrar o uso do loop.
No prximo exemplo suponha que ns queiramos computar a soma de uma
srie.
1+2+3+4+5+6+....+1,000,000
Um segmento de cdigo do Eiffel para computar essa soma dado abaixo. As
vrias partes da construo do loop so mostradas e comentadas.
indice, soma : INTEGER
from
-- comandos de inicializao do loop
soma:=0
indice:=0
until indice=1000000 -- condio que encerra o loop
loop
-- corpo do loop
indice:=indice+1
soma:=soma+indice
end
io.put_string(Soma = )
io.put_int(soma)
io.new_line
A instruo indice:=indice+1 lida como ndice recebe ndice mais 1
As instrues de inicializao, soma:=0 e indice:=0, correta porm
desnecessria. Ambos os objetos assumem o valor 0 em virtude de sua declarao.
Incidentalmente, para aqueles que esto interessados, a soma mostrada na tela
1784293664.
Em uma outra aplicao vamos aproximar a bem conhecida srie geomtrica:
1 + 1/2 + 1/4 + 1/8 + ... + (1/2)
n
cujo valor terico equivale a 2. Ns queremos
continuar adicionando nmeros at que o prximo nmero da srie seja equivalente
ou menor que 10
-9
. O segmento de cdigo a seguir usa uma construo de loop para
aproximar a soma.
proximo_termo, soma : REAL
from
soma:=1.0
#pg058#nt080#cm layout errado#
proximo_termo:=0.5
until proximo_termo < 0.000000001
loop
soma:=soma + proximo_termo
proximo_termo:=proximo_termo/2.0
end
A parte de inicializao do loop altera o valor de soma para 1.0 e proximo_termo
para 0,5. No corpo do loop, soma aumentada pelo valor corrente de proximo_termo. A
seguir, o valor de proximo_termo alterado para metade de seu valor anterior.
A soma realizada pelo cdigo acima igual a 2.
Muitos exemplos adicionais de construes com loop aparecero mais tarde em
listagens de programa.
3.11 Rotinas
Rotinas existem em duas formas: comandos e consultas. Rotinas so utilizadas quando um
objeto recebe um comando ou consulta. Por exemplo, o comando
meu_ponto.alterar_coordenada_x(50) troca o atributo x de meu_ponto para um valor igual
a 50. A consulta meu_ponto.angulo computa a coordenada polar do angulo de meu_ponto.
Comandos tipicamente mudam o estado interno do objeto que eles esto utilizando.
Consultas nunca mudam o estado interno do objeto que eles esto utilizando. Uma consulta
corretamente construda retorna informaes do objeto, sem modificar seu estado. Embora
a linguagem Eiffel permita algum definir uma rotina que mude o estado interno e tambm
retorne as informaes de um objeto, esta prtica totalmente desaconselhvel.
Comandos e consultas so especificados em uma seo de caractersticas de uma
classe (feature). Tanto a informao de interface quanto os detalhes de implementao so
dados. O usurio de uma classe (consumidor) precisa acessar somente a parte de interface
da rotina. O criador da classe precisa acessar os detalhes de implementao quando realiza
manuteno de rotina. (Manuteno uma atividade que ocorre quando (1) erros so
apresentados e corrigidos, (2) melhoramentos em capacidade so desejados, (3) melhorias
em eficincia so procuradas).
Ns consideraremos somente a mais simples estrutura para uma rotina neste
captulo. Em captulos mais avanados outros componentes de uma rotina, como pr e ps-
condies, sero discutidos.#pg059#nt075#cm layout errado# A estrutura de sintaxe de
uma simples rotina a seguinte:
nome_rotina [(lista_opcional_de_parmetros)]
[:tipo_opcional_de_retorno] is
local
declarao_de_objetos
do
-- corpo da rotina
end - nome_rotina
O nome da rotina (o mesmo nome_rotina) deve ser cuidadosamente escolhido. Ele
deve descrever o propsito da rotina. Para uma rotina comando, deve ser usado um verbo.
Para uma rotina consulta, deve-se usar um substantivo que descreve aquilo que retornado.
Por exemplo: uma rotina comando para alterar o peso de um carro pode ter o nome
mudar_peso. Se outra rotina tem como funo calcular o volume de um carro, seu nome
pode ser volume.
A lista de parmetros, se presente, contem as informaes que deve ser colocadas
para usar esta rotina.
O tipo de retorno, se presente, indica o tipo de informao que computada e
retornada para quem chamou a rotina (a rotina que chamou a funo).
A declarao de objetos, uma lista de nomes de objetos seguidos de seus
respectivos tipos de classe. Lembre-se que a criao ou inicializao de um objeto no
resulta de sua declarao (exceto para seus tipos bsicos INTEGER, CHARACTER, REAL
e BOOLEAN). Cada objeto assume um valor padro de Void at que o objeto seja criado
explicitamente por um programador a no ser que seja de um tipo bsico.
As instrues contidas entre os delimitadores do e end representam o corpo ou
detalhes de implementao da rotina.
Para ilustrar o conceito de comando e consulta, ns construiremos uma classe
simplificada IMPOSTO cujos detalhes so mostrados na listagem 3.4.
O atributo renda_dedutivel pode ser consultado mas no modificado. Ele tem
semntica read-only. Se algum quiser mudar o valor deste atributo, somente o comando
criar pode ser usado para este propsito.
Listagem 3.4 Classe IMPOSTO para ilustrar os comandos e constultas
class IMPOSTO
creation criar
feature
#pg060#nt080#cm00#
-- Atributo de consulta
renda_dedutivel; REAL
-- Criao e comando ordinrio
criar(quantia: REAL) is
do
renda_dedutivel := quantia
end
-- Funo consulta
imposto_devido: REAL is
-- Computao do imposto baseada no atributo renda_dedutivel
do
if renda_dedutivel<6000.0 then
Result:=0.0
elseif renda_dedutivel<22000.0 then
Result:=0.15 * renda_dedutivel
else
Result:=3300.0 + 0.28 * (renda_dedutivel-22000.0)
end
end
end --class IMPOSTO
Na funo imposto_devido, o imposto devido $0 se a renda_dedutivel menor que
$6000, 15% da renda_dedutivel se o rendimento est entre $6000 e $22000 e $3300
mais 28% do excesso de 22000 da renda_dedutivel, quando a renda ultrapassa 22000.
O comando criar pode ser usado com uma rotina de criao ou como um comando
ordinrio. O valor passado altera o valor corrente do atributo renda_dedutivel.
A listagem 3.5 exibe uma simples aplicao que exercita a classe IMPOSTO.
Programa teste simples para classe IMPOSTO.
class APLICAO
creation comece
feature
#pg061#nt080#cm00#
comece is
local
meu_imposto:IMPOSTO
do
-- use o comando criar para criar e inicializar o objeto
meu_imposto
!!meu_imposto.criar(40000.0)
io.put_string(Os impostos a pagar por $)
-- use o atributo renda_dedutivel para retornar informao
io.put_real(meus_impostos.renda_dedutivel)
io.put_string( = $)
-- use a rotina imposto_devido para retornar informao
io.put_real(meu_imposto.imposto_devido)
io.new_line
meu_imposto.make(200000.0)
io.put_string(Os impostos a pagar por $)
io.put_real(meu_imposto.renda_dedutivel)
io.put_string( = $)
io.put_real(meu_imposto.imposto_devido)
io.new_line
end
end - classe APLICAO
As duas classes IMPOSTO e APLICAO constituem uma aplicao completa. O
objeto meu_imposto criado e inicializado com o valor 40000 usando o comando de
criao criar com parmetro 40000. A renda dedutvel atual acessada diretamente usando
o atributo de consulta renda_dedutivel. Esse valor pode ser lido mas no alterado
diretamente. A funo de consulta imposto_devido usada para acessar o imposto devido
para a renda dedutvel atual.
O valor da renda dedutvel alterado para 200000 usando o comando criar com o
parmetro 200000. Ento o atributo e a funo de consulta so usados para mostrar novos
dados sobre o imposto.
3.12 Vetores (Arrays)
Vetores so usados para armazenar uma coleo de elementos similares. O significado de
similar ser mostrado brevemente. Cada elemento do vetor tem um endereo nico dito
ser seu ndice, um valor inteiro. Atravs do ndice algum pode inserir um elemento em um
local nico ou acessar um elemento de um local nico no vetor.
#pg062#nt080#cm00#
Algumas linguagens fornecem o vetor como um tipo bsico enquanto outras
linguagens, tal como Eiffel, fornecem uma biblioteca externa como suporte para vetores.
Os vetores em Eiffel so fornecidos, atravs de uma classe padro chamada ARRAY.
A figura 3.6 mostra um vetor de elementos com um ndice que varia de 1 a 5.
Um vetor de elementos.
Qual a natureza dos objetos em um vetor como o representado na figura?
No contexto, programao orientada por objeto (nosso contexto) os elementos so
objetos. Cada objeto uma instncia de uma classe base ou uma de suas classe
descendentes. Nesse sentido os objetos so semelhantes em relao seu tipo. Muitas
vezes os elementos nos vetores so do mesmo tipo.
Uma tpica declarao de um vetor :
meu_vetor: ARRAY [ALGUM_TIPO]
onde ALGUM_TIPO o tipo base ao qual pertencem todas as instncias de objetos.
O comando put da classe ARRAY, para inserir um objeto, meu_objeto, num ndice
especificado:
meu_vetor.put(meu_objeto,ndice)
Na expresso acima meu_vetor o nome do vetor onde meu_objeto inserido.
Logicamente, ndice um determinado inteiro.
A figura 3.7 retrata uma introduo do meu_ojeto como o quarto dos cinco
elementos do vetore mostrado na figura.
#pg063#nt080#cm00#
meu_vetor.put(meu_object,4)
O comando put.
A funo de consulta da classe ARRAY, item, que acessa um objeto em uma
posio especfica :
meu_vetor.item(indice)
claro que indice deve ser um valor inteiro dentro dos limites legais para um dado
vetor. O vetor na figura 3.7 tem um limite legal de 1 at 5.
A figura 3.8 mostra o elemento na posio 4 sendo acessado com a consulta item.
meu_vetor.item(4)
A consulta item.
A rotina de criao da classe ARRAY, make, para a construo de uma instncia da
classe ARRAY :
!!meu_vetor.make (limite_inferior, limite_superior)
Os valores inteiros limite_inferior e limite_superior especificam a variao legal do
ndice do vetor. Aps criar o vetor, meu_vetor, os elementos em cada posio assumem
seus valores padro (provavelmente Void).
#pg064#nt090#cm00#
Ns ilustraremos todas as idias anteriores construindo um vetor de veculos.
Haver trs tipos de veculos no vetor: CARRO, AVIO, e BARCO. Nenhum dos detalhes
das trs classes ser mostrado com exceo de que todos as trs so subclasses da classe
VECULO.
class VECULO
--Classe bsica. Nenhum detalhe mostrado.
end -- classe VECULO
class CARRO
inherit
VECULO
-- Nenhum detalhe mostrado.
end -- classe CARRO
class AVIO
inherit
VECULO
-- Nenhum detalhe mostrado.
end -- classe AVIO
class BARCO
inherit
VECULO
-- Nenhum detalhe mostrado.
end - classe BARCO
class APLICAO
creation
inicio
feature
inicio is
local
meu_vetor: ARRAY [VECULO] -- Tipo bsico VECULO
meu_carro: CARRO
meu_barco: BARCO
meu_avio: AVIO
do
!!meu_vetor.make (1,3)
!!meu_carro
#pg065#nt090#cm00#
!!meu_barco
!!meu_avio
meu_vetor.put (meu_carro, 1)
meu_vetor.put (meu_barco, 2)
meu_vetor.put (meu_avio, 3)
end
end --classe Aplicao
A figura 3.9 descreve a construo de meu_vetor contendo trs veculos.
Depois de:
!!meu_vetor.make (1,3)
Depois de:
!!meu_vetor.put(meu_avio, 3)
Vetor de trs veculos
#pg066#nt095#cm00#
Ns depois consideraremos o problema da ordenao de um vetor de nmeros
inteiros de tamanho 3. Ns retornaremos o assunto da ordenao no Captulo 4 quando ns
o apresentaremos de uma maneira mais sria e discutiremos diversos mtodos importantes
de ordenao.
Esta simples aplicao nos permitir rever o assunto das rotinas de ramificao e
seus parmetros assim como vetores.
Suponha que ns declaremos uma vetor como a seguir.
local
dados : array[INTEGER]
do
!!dados.make(1,3)
Agora ns queremos inserir valores inteiros nas posies 1, 2 e 3. Finalmente ns
queremos reordenar os nmeros no vetor colocando o menor na posio 1, o segundo
menor na posio 2 e o maior na posio 3. Este processo chamado ordenao.
A listagem 3.6 nos apresenta uma rotina de ordenao que executa esta misso.
Ordenao uma vetor de 3 nmeros inteiros.
class APLICAO_ORDENACAO
creation
comece
feature
comece is
local
dados : array[INTEGER]
do
!!dados.make(1,3)
dados.put(30,1)
dados.put(5,2)
dados.put(25,3)
ordene_3(dados)
mostre(dados)
end
ordene_3(dados : array[INTEGER]) is
require
vetor_de_tamanho_certo : dados.count=3
#pg067#nt090#cm layout errado#
local
temporrio: INTEGER
do
if dados.item(1)>dados.item(2) and dados.item(1) >
dados.item(3) then
temporrio:= dados.item (3)
dados.put (dados.item (1),3)
dados.put (temp,1)
elseif dados.item(2)>dados.item(1) and
dados.item(2)>dados.item(3) then
temporrio:= dados.item (3)
dados.put (dados.item (2),3)
dados.put (temp,2)
end
if dados.item(1) > dados.item(2) then
temporrio:= dados.item (2)
dados.put (data.item (1),2)
dados.put (temp,1)
end
end
imprimir (os_dados:ARRAY [INTEGER]) is
local
ndice: INTEGER
do
from
ndice := 0
until
ndice = os_dados.count
loop
ndice := ndice + 1
io.put_int (os_dados.item (ndice))
io.put_string ( )
end
io.new_line
end
end -- classe APLICACAO_ORDENACAO
A primeira ordem de execuo da rotina comece a criao do vetor dados com
ndice inferior igual a 1 e superior igual a 3 (ndice entre 1 e 3). A seguir, os valores 30, 5, e
25 so inseridos no vetor. A figura 3.10 descreve o vetor dados depois desse passo.
#pg068#nt095#cm00#
Vetor inicial de trs inteiros que sero ordenados.
A rotina ordene_3 a prxima a ser solicitada com dados enviado como parmetro.
A clusula require representa uma pr-condio que deve ser satisfeita no momento em que
a rotina for solicitada. Pr condies sero discutidas com mais detalhes no captulo 6.
O primeiro teste que realizado determina se, o inteiro do ndice 1 maior do que o
inteiro do ndice 2 e do ndice 3 (em outras palavras, o inteiro do ndice 1 o maior entre os
trs inteiros). Se isso ocorrer, como ocorre neste caso, o inteiro do ndice 1 e o do ndice 3
so trocados, colocando ento o maior dos trs inteiros no ndice 3. A figura 3.11 mostra
como ficou o vetor depois dessa operao de troca.
Vetor de trs inteiros depois da primeira troca.
Finalmente os inteiros do ndice 1 e do ndice 2 so comparados. Se o inteiro do
ndice 1 for maior que o inteiro do ndice 2 eles sero trocados. o que ocorre neste caso.
A figura 3.12 mostra como ficou o vetor depois dessa ltima operao de troca.
Vetor de trs inteiros depois da ltima operao de troca.
#pg069#nt085#cm layout errado#
Agora os nmeros esto sortidos. Voc pode provar que maneira deste
algoritmo(uma srie de operaes que realizam uma srie de servios) sempre
armazenaro os trs nmeros conforme as condies?
A rotina display mostra os valores dos nmeros crescentes nas posies 1, 2 e 3. A
consulta count usada para adquirir o maior nmero do array os_dados.
3.13 Cadeias de caracteres (Strings)
Em programao, uma string um vetor de caracteres, no algo com que voc amarra
seus sapatos. Estes caracteres podem ser letras maisculas ou minsculas, nmeros ou
smbolos do teclado como $, % ou &. At um espao em branco um caracter.
Por causa dos vetores baseados em caracter, as strings, serem to importante em
programao, ns os estudamos como um tipo especial de vetor. Em Eiffel a classe
STRING armazena as propriedades deste importante tipo de dados.
Em programas ns usamos strings para nomes de pessoas ou coisas. Ns,
tipicamente, tratamos uma string como uma simples entidade nica apesar dela ser
constituda de vrios caracteres. Ento, a string com a sequncia de caracteres M, a, r,
i e a geralmente ser vista como uma nica entidade Maria mais propriamente do que
os caracteres individuais. claro que os caracteres individuais de uma string podem ser
acessados usando a consulta item de array discutido na sesso anterior.
Uma string uma seqncia de caracteres delimitados por um par de aspas. Alguns
exemplos de strings so fornecidos abaixo.
Exemplos de Strings
Meu nome Richard Wiener.
Testando, testando, 1, 2, 3
!@#$%^&*()-+

O leitor pode desejar parar e considerar as operaes que poderiam ser desejveis
em uma string. Certamente as operaes mais bsicas poderiam incluir (1) criao de uma
string de um determinado tamanho um vetor de caracteres que pode suportar um nmero
pr-determinado de caracteres, (2) inserir caracteres na string em diferentes locais, (3)
preencher toda a string usando uma atribuio de outra string (uma seqncia de caracteres
limitada por aspas, como oi ou tchau), (4) acessar caracteres de uma posio especfica,
(5) copiar uma string para outra (a que vai ser copiada j deve ter sido iniciada) e (6)
retornar o tamanho de uma string o nmero de caracteres atuais da string, no o seu total.
#pg070#nt095#cm00#
Existem operaes adicionais que voc pode desejar acrescentar a essa lista
relativamente pequena? Essa a questo que o desenvolvedor da classe STRING deve se
perguntar quando est construindo esse componente de software reutilizvel.
Surpreender-te-ia saber que a classe STRING contida na biblioteca do Eiffel contm
aproximadamente 60 rotinas que definem o comportamento (comandos e consultas) de um
objeto STRING? A fim de apreciar o trabalho realizado no desenvolvimento de um
importante componente de software reutilizvel como esse, vamos examinar a
funcionalidade da classe STRING um pouco antes de olhar a sua interface formal e
demonstrar seu uso em uma aplicao.
A classe STRING dividida em vrias sees feature, cada uma contendo um
conjunto logicamente relacionado de operaes. Na tabela 3.1, as vrias sees feature so
mostradas com seus propsitos e uma lista de algumas das rotinas nas sees feature so
listadas com uma breve descrio de seus propsitos.
Tabela 3.1 Anlise da classe STRING
(1) Acesso Usado para obter vrias partes do objeto STRING
has a string inclui um caracter em particular?
index_of posio da primeira ocorrncia de um caracter
item caracter em ndice especfico
item_code cdigo numrico de caracter em ndice especfico
substring_index posio de ocorrncia de outra string contida na string dada.
operador @ caracter em ndice especfico (alternativo item)
(2) Comparao Usado para comparar duas strings
is_equal as duas strings contm a mesma seqncia de caracteres?
operador < uma string lexicograficamente menor que outra?
(3) Converso Usado para converter string de uma forma para outra
mirror inverte a ordem dos caracteres na string
mirrored teste para ver se outra string espelho da primeira
to_double converte para o tipo DOUBLE, se possvel
to_integer converte para o tipo INTEGER, se possvel
to_lower - converte todos os caracteres maisculos em minsculos
to_real converte para o tipo REAL, se possvel
to_upper converte todos os caracteres minsculos em maisculos
#pg071#nt095#cm00#
(4) Duplicao usada para copiar partes de uma string para outra
substring cpia de uma substring (string contida em uma outra string) contendo
caracteres entre um ndice e outro
(5) Mudana de elementos usada para modificar partes de uma string
append adiciona uma cpia de uma string para o final de outra
copy transfere caracteres da string fonte para a string destino
extend adiciona um caracter no fim de uma determinada string
fill_blank preenche uma string com caracteres em branco
head remove todos, menos os n primeiros caracteres
insert adiciona uma string esquerda do ndice especificado em uma
determinada string
left_adjust remove todos os espaos iniciais em uma string
precede adiciona um caracter na frente de uma determinada string
prepend adiciona uma string na frente de uma determinada string
put substitui um caracter em um ndice especificado por um determinado
caracter
replace_substring copia caracteres de uma outra string para posies
especficas da string dada
replace_substring_all substitui todas as ocorrncias de certa string por novas
right_adjust remove todos os espaos finais de uma determinada string
set imprprio para discutir aqui
share faz com que a string atual compartilhe o texto de outra string; qualquer
mudana no texto da outra string afetar o original
tail remove todos os caracteres, exceto os n ltimos de uma determinada string
(6) Inicializao usada para criar um objeto da classe STRING
make aloca espao para no mnimo n caracteres
(7) Medio usada para obter aspectos numricos de uma string
capacity espao alocado
count nmero atual de caracteres em uma string
occurrences nmero de vezes que um caracter especfico aparece em uma string
(8) Sada de dados usada para escrever uma string
out cria uma representao que pode ser impressa
(9) Remoo usada para remover partes de uma string
prune remove a primeira ocorrncia de um caracter especfico
prune_all remove todas as ocorrncias de um caracter especfico
remove remove o i-simo caracter
wipe_out remove todos os caracteres
(10) Redimensionamento usada para mudar dinamicamente o tamanho de uma string
adapt_size muda o tamanho para acomodar o nmero atual de caracteres
grow garante que a capacidade pelo menos o nmero especificado
resize realoca espao para acomodar um nmero especfico de caracteres
(11) Relato de Status usada para obter algumas caractersticas importantes de uma
string
consistent a string dada pode ser o destino de uma operao de cpia?
#pg072#nt000#cm00#
#pg073#nt070#cm00#
to_real: REAL
--valor real;
--por exemplo, quando aplicado 123.0, produzir 123.0
to_upper
--converte para letras maisculas
substring (n1, n2: INTEGER): like Current
--copia uma substring contento todos os caracteres do ndice n1
ao n2
append(s:STRING)
--junta uma cpia de s no fim.
copy (outro: like Current)
--reinicializa copiando os caracteres de outro
--(isto usado tambm pelo clone)
fill_blank
--preenche com espaos
insert(s: like Current; i:INTEGER)
--adiciona s esquerda da posio i na string atual
put(c: CHARACTER; i: INTEGER)
--Substitui um caractere da posio i por c
capacity: INTEGER
--quantidade de memria alocada
count :INTEGER
-- nmero de caracteres de uma string
occurences (c: CHARACTER):INTEGER
--numera quantas vezes que c aparece na string
wipe_out
--remove todos caracteres
end --classe STRING
O apndice 1 fornece todas as informaes que so requeridas para o uso da classe
STRING numa dada aplicao. Como parte do processo de aprendizagem para se tornar um
consumidor competente, e o leitor deve estudar cuidadosamente as informaes da interface
deste apndice.
Uma estratgia altamente recomendvel para se tornar familiar e confortvel com o
uso de uma classe tal como STRING criar um programa teste que exercite algumas destas
funes. Apesar disto poder tomar algum tempo e mesmo parecer tedioso, a recompensa
ser grande.#pg074#nt000#cm00#
#pg075#nt080#cm00#
else
io.put_string (str1/=mensagem)
end
io.new_line
--Muda o primeiro caracter da string str1 e ento compara
--str1 e mensagem novamente
str1.mirror
io.put_string (str1= )
io.put_string (str1)
io.new_line
--Inverte a seqncia de caracteres na string str1
str1.mirror
str1.to_upper
io.put_string (str1= )
io.put_string (str1)
io.new_line
--Obtm a primeira ocorrncia da letra G
io.put_string (Primeira ocorncia de G%=)
io.put_int (str1.index_of (G,1))
io.new_line
--Obtm a primeira ocorrncia da substring ING
io.put_string (Primeira ocorncia de ING%=)
io.put_int (str1.substring_index of (ING,1))
io.new_line
--Escreve o valor da string true_constant
io.put_string (str1.true_constant)
io.new_line
--Atribui a substring de str1 entre os ndices
--24 at 27 para a string str2
str2:= str1.substring (24,27)
io.put_string (str2= )
io.put_string (str2)
io.new_line
--Atribui str2 ao valor real r depois de converter a
string para real
r:= str2.to_real
io.put_string (r= )
#pg076#nt000#cm00#
#pg077#nt000#cm00#
#pg078#nt065#cm00#
Como a entrada de dados obtida no programa?
A dispositivo de entrada padro o teclado. O segmento seguinte de cdigo ilustra
como se poderia entrar com um valor real, um valor inteiro, e um valor de caracter.
meu_inteiro: INTEGER
meu_caracter: CHARACTER
meu_real: REAL
io.readint -- comando de leitura
io.readchar -- comando de leitura
io.readreal -- comando de leitura
meu_inteiro:=io.lastint -- consulta
meu_caracter:=io.lastchar -- consulta
meu_real :=io.lastreal - consulta
Os comandos de entrada usados so readint, readchar, e readreal. Cada um
transmitido atravs do objeto padro de entrada e sada (io). Os valores que de entrada
(informao datilografada no teclado) so obtidos pelas consultas lastint, lastchar e
lastreal, novamente, transmitidos pelo objeto padro de entrada e sada (io). O protocolo
rigoroso de separao entre comados e consultas observado aqui. Embora possa ser
tentador fazer readint retornar um inteiro, o ponto de vista examinado aqui que o
comando readint muda o estado da situao interna do objeto io e a consulta lastint, retorna
parte de seu estado interno.
Existem muitos comandos de entrada e sada de comandos alm de consultas
definidas na classe STD_FILES de Eiffel que padronizam as entradas e sadas. Uma poro
da interface desta classe dada na listagem 3.9.
Poro da interfase para classe STD_FILES
class interface STD_FILES
feature -- muda elemento
new_line
-- Escreve uma mudana de linha na sada padro
put_char(c: CHARACTER)
-- Escreve c no final da sada padro.
#pg079#nt095#cm00#
put_double (d: DOUBLE)
--escreve d no final da sada default
put_int (i: INTEGER)
-- escreve i no final de sada default
put_real (r:REAL)
--escreve r no final de sada default
put_string (s:STRING)
--escreve s no final de sada default
feature -- entrada de dados
next_line
--move para a prxima linha na entrada padro
readchar
--l um novo caracter da entrada padro
--Disponibiliza o resultado em lastchar
readdouble
--l um novo double da entrada padro
--Disponibiliza o resultado em lastdouble
readint
--l um novo inteiro da entrada padro
--disponibiliza o resultado em lastint
readline
--l uma linha da entrada padro
--disponibiliza o resultado em laststring
readreal
--l um novo real da entrada padro
--disponibiliza o resultado em lastreal
readstream (nb_char: INTEGER)
--l uma string de no mximo nb_char caracteres da entrada
padro
--disponibiliza o resultado em laststring
readword
--l uma nova palavra da entrada padro
--disponibiliza o resultado em laststring
feature relatrio de status