Chama-se de application framework a um conjunto de bibliotecas (coleções de sub programas utilizadas para o desenvolvimento de “software”) ou classes (coleções de tipos encapsulados de variáveis e tipos de métodos) usadas para implementar a estrutura padrão de uma aplicação para um dado sistema operacional. A vantagem de seu emprego é o agrupamento de grande quantidade de código reusável o que economiza o esforço de reescrever código padrão a cada nova aplicação. Os application framework apresentaram grande popularidade com o advento das interfaces gráficas para o usuário (GUI) que tendem a padronizar a estrutura das aplicações. É muito mais simples usar ferramentas automáticas para a criação de GUI quando um application framework padrão é adotado.
A implementação dos application framework é feita por programação orientada a objeto e assim o código específico de cada aplicação pode utilizar a herança das classes existentes no application framework.
O application framework Microsoft para Windows é o Microsoft Foundation Classes (MFC) que foi criado em 1992 inspirado no Think Class Library (TCL) do Macintosh. Na mesma época a Borland desenvolveu o Object Windows Library (OWL) que depois foi descontinuado em favor do Visual Component Library (VCL).
A linguagem Java foi liberada em 1995. Sua biblioteca de GUI foi denominada Abstract Window Toolkit (AWT). Em 1997 foi liberada a Java Foundation Classes (JFC) que incorporou (em 1998) a interface Swing inspirada na Internet Foundation Classes, da Netscape.
Application Framework de Bruno Preiss
Na criação de programas utilizando os padrões de orientação a objetos, tais como o application framework de Bruno Preiss, sugere-se criar Projetos com a seguinte composição:
1. Um diretório (ou "package") com estruturas dos fundamentos
da hierarquia de classes e padrões de projeto
2. Um diretório com a definição dos dados a serem processados
3. Um diretório (ou "package") com as estruturas de dados a
utilizar (pilha, fila, lista, árvore, grafo, etc.)
4. Um diretório com a aplicação ou programa principal
Assim fazendo o diretório das estruturas dos fundamentos é único e reaproveitado sempre, os diretórios das estruturas de dados são um para cada estrutura de dados escolhida (na verdade são duas versões para cada estrutura podendo haver a implementação por “arrays” e a implementação por listas encadeadas). Para cada novo problema ou aplicação basta fazer a definição dos dados e o programa principal pois todo o resto já está pronto.
Para utilizar a hierarquia de classes e os padrões de projeto de Bruno Preiss pode-se criar um diretório (ou “package”) com os fontes obtidos do sítio do autor. Como os arquivos disponibilizados são divididos por funções algumas vezes é preciso agrupar vários arquivos do autor para criar um arquivo a ser compilado. É preciso também cuidar das extensões de arquivos. No sítio Java de Bruno Preiss todos os arquivos estão com extensão .txt e precisam ser modificados para .java. No sítio C++ todos arquivos estão com extensão .cpp e os arquivos de cabeçalho precisam ser do tipo .h havendo necessidade de separar os arquivos .h e .cpp. Deve-se lembrar que classes definidas por templates toda a definição fica no arquivo .h.
Os sítios de Bruno Preiss para C++e Java, respectivamente, são
http://www.pads.uwaterloo.ca/Bruno.Preiss/books/opus4/programs/ e http://www.pads.uwaterloo.ca/Bruno.Preiss/books/opus5/programs/
Arquivo | Fonte de Bruno Preiss |
LinkedList.java |
pgm04_13.txt até pgm04_22.txt |
Comparable.java |
pgm05_01.txt |
AbstractObject.java |
pgm05_02.txt; pgm05_03.txt |
Chr.java |
pgm05_04.txt |
Int.java |
pgm05_05.txt; pgm08_01.txt |
Dbl.java |
pgm05_06.txt |
Str.java |
pgm05_07.txt |
Container.java |
pgm05_08.txt |
AbstractContainer.java |
pgm05_09.txt; pgm05_12.txt; pgm08_04.txt |
Visitor.java |
pgm05_10.txt |
AbstractVisitor.java |
pgm05_11.txt |
Enumeration.java |
pgm05_13.txt |
SearchableContainer.java |
pgm05_14.txt |
AbstractSearchableContainer.java |
pgm05_15.txt |
Association.java |
pgm05_16.txt; pgm05_17.txt; pgm05_18.txt |
Arquivo | Fonte de Bruno Preiss |
Object.h | pgm05_01.cpp |
Object.cpp | pgm05_02.cpp; pgm05_03.cpp |
NullObject.h | pgm05_04.cpp |
NullObject.cpp | pgm05_05.cpp |
Wrapper.h | pgm05_06.cpp |
Wrapper.cpp | pgm05_07.cpp |
Container.h | pgm05_09.cpp |
Container.cpp | pgm05_10.cpp |
Visitor.h | pgm05_11.cpp |
PutingVisitor.cpp | pgm05_12.cpp |
Iterator.h | pgm05_13.cpp |
Ownership.h | pgm05_17.cpp |
SearchableContainer.h | pgm05_21.cpp |
Array.h | pgm04_01.cpp |
LinkedList.h | pgm04_09.cpp até pgm04_10.cpp |
HashTable.h | pgm08_07.cpp |
HashTable.cpp | pgm08_08.cpp |
Para o primeiro trabalho do Curso de Estruturas de Dados
I sugere-se usar uma definição de dados como a que se segue:
Os programas principais poderiam ser feitos da forma que se segue.