Desenvolvimento
orientado a objetos com frameworks, padrões e componentes
INE 660600
Atualizado em 13/03/2012 |
informações para alunos matriculados
1. Do que trata a disciplina: três abordagens de desenvolvimento de software - frameworks, padrões e
componentes
2. Formato das aulas: aulas expositivas com slides, sendo que o período final do trimestre
será ocupado pelas apresentações dos alunos (as últimas semanas)
3. Pré-requisito: a partir de
2012 a disciplina volta a não ter pré-requisito oficial, mas subentende-se que
os alunos tenham experiência em desenvolvimento orientado a objetos:
programação e modelagem com UML.
4. Avaliação:
5. Horário: quarta-feira,
08:00 às 12:00 horas (pausa no meio)
6. Do que trata a disciplina
No contexto da Engenharia de Software, diferentes
abordagens buscam melhorar a qualidade dos artefatos de software, bem como
diminuir o tempo e o esforço necessários para produzi-los. Frameworks são
estruturas de classes que constituem implementações
incompletas que, estendidas, permitem produzir diferentes artefatos de
software. A grande vantagem desta abordagem é a promoção de reuso de código e
projeto, que pode diminuir o tempo e o esforço exigidos na produção de
software. Em contrapartida, é complexo desenvolver frameworks, bem como
aprender a usá-los. A abordagem de frameworks pode se valer de padrões para a
obtenção de estruturas de classes bem organizadas e mais aptas a modificações e
extensões. O desenvolvimento orientado a componentes pretende organizar a
estrutura de um software como uma interligação de artefatos de software
independentes, os componentes. O reuso de componentes previamente
desenvolvidos, como no caso dos frameworks, permite a redução de tempo e
esforço para a obtenção de um software. Por outro lado, devido a deficiências das
formas correntes de descrição de componentes, é complexo avaliar a adequação de
um componente existente a uma situação específica. Também é complexo adaptar
componentes quando estes não estejam exatamente adequados a necessidades
específicas. Em Arquitetura de Software estudam-se formas de registrar a
experiência de organização estrutural de software. O reuso desta experiência
pode facilitar a definição da organização mais adequada dos componentes de uma
aplicação, complementando a abordagem de desenvolvimento baseado em
componentes. A presente disciplina se preocupa em tratar a integração dessas
abordagens, que têm em comum a reutilização, seja de projeto ou de código, isto
é, o aproveitamento de experiência de desenvolvimento de software.
A Engenharia de Software atua na aplicação de
abordagens sistemáticas ao desenvolvimento e manutenção de software. Os
objetivos principais da Engenharia de Software são a melhora da qualidade do
software e o aumento da produtividade da atividade de desenvolvimento de software
[FAI 86]. A reutilização de software, em contraposição ao desenvolvimento de
todas as partes de um sistema, é um fator que pode levar ao aumento da
qualidade e da produtividade da atividade de desenvolvimento de software. Isto
se baseia na perspectiva de que o reuso de artefatos de software já
desenvolvidos e depurados, reduza o tempo de desenvolvimento, de testes e as
possibilidades de introdução de erros na produção de novos artefatos. A
reutilização de artefatos de software em larga escala é um dos argumentos a
favor da abordagem de orientação a objetos. Em muitos casos
porém, constitui uma perspectiva frustrada, pois a reutilização não é
característica inerente da orientação a objetos, mas é obtida a partir do uso
de técnicas que produzam software reutilizável [JOH 88] [PRE 94].
A produção de artefatos de software reutilizáveis
se coloca como um requisito para que ocorra reutilização de software. Os
princípios que norteiam a modularidade, como a
criação de módulos com interfaces pequenas, explícitas e em pequena quantidade,
e o uso do princípio da ocultação de informação [MEY 88], têm sido ao longo dos
últimos anos o principal elemento de orientação para a produção de bibliotecas
de artefatos reutilizáveis.
A reutilização de artefatos de software pode
abranger o nível de código, como também os de análise e projeto. A reutilização
de código consiste na utilização direta de trechos de código já desenvolvidos.
A reutilização de projeto consiste no reaproveitamento de concepções
arquitetônicas de um artefato de software em outro artefato de software, não
necessariamente com a utilização da mesma implementação.
A forma mais elementar de reutilização de artefatos
de software é a reutilização de trechos de código de aplicações já
desenvolvidas. Para sistematizar esta prática são criadas bibliotecas - como
bibliotecas de funções em linguagem C, por exemplo. Um problema encontrado com
o uso de bibliotecas de artefatos de software é a dificuldade de seleção de um
artefato adequado à aplicação em desenvolvimento. Se o desenvolvedor concluir
que é mais fácil produzir um novo artefato do que buscar um em uma biblioteca,
não haverá reutilização [NEI 89].
Observa-se que a reutilização dos produtos das
etapas de análise e projeto é mais significativa que a reutilização de trechos
de código [DEU 89]. Observa-se na literatura uma convicção de que uma abordagem
voltada à reutilização só alcança resultados significativos se estiver voltada
a um domínio específico [HEN 95] [SIM 95] [NEI 89] [ARA 91]. Neighbors afirma que a informação contida em produtos das
etapas de análise e projeto é específica do domínio de aplicações tratado [NEI
89]. Verificam-se dois objetivos distintos, na reutilização no nível das
especificações de análise e projeto:
Produzir uma
aplicação utilizando o projeto de outra aplicação. Isto é o que ocorre em um
processo de Reengenharia, em que a especificação de uma aplicação é alterada,
de modo a adaptar-se a novos requisitos, e é gerada uma nova aplicação.
Produzir uma
especificação adequada a um conjunto de aplicações (um domínio) e reutilizar
esta especificação no desenvolvimento de diferentes aplicações. Esta é a
abordagem dos frameworks orientados a objetos.
Um framework é uma
estrutura de classes interrelacionadas, que
corresponde a uma implementação incompleta para um
conjunto de aplicações de um domínio. Esta estrutura de classes deve ser
adaptada para a geração de aplicações específicas [JOH 92].
A granularidade do artefato de software reutilizado
é um fator relevante em termos de aumento de produtividade no desenvolvimento
de software. Um programador que usa linguagem C, por exemplo
se utiliza de bibliotecas de funções. Isto se classifica como reutilização de
rotinas [MEY 88]. A reutilização no nível de módulo corresponde a um nível de
granularidade superior à reutilização de rotinas. A reutilização de classes em
orientação a objetos, segundo Meyer, corresponde à reutilização de módulo.
Quando uma classe é reutilizada, um conjunto de rotinas é reutilizado
(métodos), bem como uma estrutura de dados (atributos). Uma classe que implementa uma estrutura de dados pilha, por exemplo, contém
esta estrutura de dados e o conjunto de procedimentos para a sua manipulação.
Reutilizar classes, portanto, tende a ser mais eficiente que reutilizar
rotinas, e de mais alto nível de granularidade (uma classe de objetos tende a
ser um artefato de software mais complexo que uma rotina isolada). Meyer em
1988 enfatizava a necessidade da disponibilidade de artefatos genéricos e afirmava
que "as classes de linguagens orientadas a objetos podem ser vistas como
módulos de projeto bem como módulos de implementação"
[MEY 88]. A reutilização de classes pode ocorrer sob dois enfoques diferentes:
composição: consiste em usar as classes disponíveis em
bibliotecas para originar os objetos da implementação;
herança: consiste em aproveitar a concepção de classes
disponíveis em bibliotecas, no desenvolvimento de outras, a partir de herança.
Uma característica comum à reutilização de rotinas e
à reutilização de classes é que cabe a quem desenvolve a aplicação estabelecer
a arquitetura da aplicação: a organização dos elementos que compõem a aplicação
e o fluxo de controle entre eles. Além disto, há em comum o fato da
reutilização ser de artefatos isolados, cabendo ao desenvolvedor estabelecer
sua conexão ao sistema em desenvolvimento. Em um programa C o programador
determina a chamada de funções; em um programa Smalltalk
o programador procede a interligação das classes
(desenvolvidas e reutilizadas).
A reutilização promovida pela abordagem de
frameworks se situa num patamar de granularidade superior à
reutilização de classes, por reusar classes interligadas, ao invés de isoladas.
A reutilização de código e projeto em um nível de granularidade superior às
outras abordagens citadas, confere aos frameworks o potencial de contribuir
mais significativamente com o aumento de produtividade no desenvolvimento de
software.
O desenvolvimento de software orientado a
componentes é uma outra abordagem que promove o reuso
de artefatos de alta granularidade, com a capacidade de promover reuso de
projeto e código. Nesta abordagem uma aplicação é constituída a partir de um
conjunto de módulos (componentes) interligados. Na medida em que parte das
responsabilidades de uma aplicação seja delegada a um componente reutilizado,
estar-se-á promovendo uma diminuição do esforço necessário para produzir esta
aplicação, o que caracteriza aumento de produtividade - semelhante ao que
ocorre com os frameworks.
Um componente é "uma unidade de composição com
interfaces contratualmente especificadas e dependências de contexto
explícitas" [SZY 96b]. Componentes podem ser desenvolvidos utilizando o
paradigma de orientação a objetos, isto é, como estruturas de classes interrelacionadas, com visibilidade externa limitada [KRA
97], porém, no caso geral, componentes não dependem de tecnologia de implementação. Assim, qualquer artefato de software pode ser
considerado um componente, desde que possua uma interface definida [SZY 97].
Observa-se em comum nas abordagens de
desenvolvimento baseadas em frameworks e em componentes a possibilidade de
reutilização de artefatos de software de alta granularidade, e a caracterização
de reuso de projeto e código. A adoção destas abordagens no desenvolvimento de
software - em conjunto ou isoladamente - pode diminuir significativamente o
tempo para o desenvolvimento de novas aplicações, bem como a quantidade de
código a desenvolver, na medida em que parte das
responsabilidades das novas aplicações são atribuídas a artefatos de
software reutilizados.