SOP - Subject-Oriented Programming
By
Augusto César Melo de Oliveira and Sabrina Bet
Na da década de 90, descobriu-se que a Engenharia de Software orientada a objetos não era suficiente para a resolução de diversos problemas encontrados durante o design de Softwares, de forma que se tornou necessário a criação de novas abordagens.
A Programação Orientada a Sujeitos (SOP – Subject-Oriented Programming), apresentada aqui, é uma dessas abordagens, e teve seus estudos iniciais em 1993 por Harrison e Ossher, do IBM T.J. Watson Research Center.
Apresentação Seminário | Trabalho Final
Conteúdo
Introdução
A Decomposição é uma técnica crítica em todos os estágios de desenvolvimento de um projeto. Deve ser usado para quebrar um problema em vários problemas tornado a resolução mais fácil, distribuindo a responsabilidade entre designers e desenvolvedores aumentando a eficiencia do trabalho.
Desde que o objetivo é desenvolver um sistema completo, a decomposição usualmente implica em uma recomposição: o modelo de um sistema é decomposto para deixar o processo de desenvolvimento manipulável, mas as partes devem ser recombinadas em um estágio para deixar o sistema completo. Uma variedade de técnicas, como herança múltipla, em linguagens orientadas a objetos para alcançar esse objetivo. Mas a composição orientada a sujeitos é mais flexível que todas essas técnicas.
Paradigmas Projeto Orientado a Sujeitos:
A Programação Orientada a Sujeitos complementa a programação orientada a objetos, resolvendo um grande número de problemas criados aos se utilizar a tecnologia orientada a objetos no desenvolvimento de grandes sistemas ou suítes para integração de aplicativos. De maneira resumidas, a SOP nos permite:
Assim as vantagens vem em forma de:
Conceitos
A Programação Orientada a Sujeitos é uma tecnologia de composição de programas que suporta a construção de sistemas orientados a objetos através de sujeitos. Um sujeito (subject) é uma coleção de classes ou fragmentos de classes o qual modela um domínio sob um ponto de vista. Um sujeito pode ser uma aplicação completa por si só, ou pode ser um fragmento de uma aplicação que composta com outros sujeitos produz uma aplicação completa. A composição de sujeitos (subject composition) combina classes para produzir novos sujeitos de forma a incorporar funcionalidades em um sujeito já existente.
A Programação Orientada a Sujeitos desta forma, suporta a construção de sistema orientada a objetos como composição de sujeitos de forma a estender e integrar sistemas através de composição de sujeitos (como se fosse “colar” ou “adaptar” sujeitos).
A flexibilidade da composição de sujeitos introduz uma nova oportunidade para o desenvolvimento e modularização de programas orientados a objetos. Programação Orientada a Sujeitos em grande escala envolve a determinação de como dividir o sistema em sujeitos e criar regras de composição (composition rules), necessárias para compor os sujeitos corretamente, pois estas regras especificam como os sujeitos serão compostos.
Exemplo Pattern Decorator
Será apresentado aqui uma parte do software PunkJunk, que controla uma máquina de troca de moesdas, escrito pelo hacker Dewey Cheatem [3]. O PunkJunk representa as partes da máquina através de objetos, como por exemplo o display, distribuidor, etc. O Objeto Display (instancia do tipo Display) é representado desta forma:
Objeto Original escrito por Dewey Cheatem
Inicialmente, PunkJunk fazia apenas a troca de moedas. Após muitas reclamações dos usuários, Dewey resolveu que PunkJunk aceitaria notas de papel também. Apenas foi aumentada aumentou a Classe Display, para conhecer também notas de papel. Mais especificamente, foi aumentado o método show() para mostrar mensagens de troca de notas, e para incluir uma referencia associada ao objeto BillChanger. Para isso foi utilizado o design patter Decorator para não precisar modificar a classe Display:
Classe Display com o Pattern Decorator
Porém esta solução não era tão boa quanto o esperado. Existia dois problemas significantes (apontados na figura anterior):
Não sendo suficiente, foi feita a reimplementação do Decorator com o auxílio da Programação Orientada a Sujeitos. Definiu-se uma classe chamada Extensions, a qual implementa aprimora o método show() e a instância BillChanger necessária para o Display. Então é feita a composição da classe Extension com a classe Display (original), assim criando uma nova classe com as funcionalidades de ambas classes Display e Extension:
Solução utilizando SOP
A composição do Display inclui show() da classe Extensions, as características da classe original Display, e inclui todas as instâncias de variáveis e outros métodos de ambas as classes Display e Extensions.
O uso da Programação Orientada a Sujeitos na implementação do decorator significa:
Código do Exemplo:
Código Original - PunkJunk |
Código com Decorator em C++ |
Solução utilizando SOP |
class
CoinChanger; class Display |
class BillChanger; class
DisplayDecorator virtual void show() {
|
class BillChanger; class Extensions |
Ferramentas
A Programação Orientada a Sujeitos é uma tecnologia independente de linguagem. A IBM possui as ferramentas que permitem a programação SOP sendo elas: VAC++ (para C++), HyperJ (Java). E para Smalltalk existe apenas um protótipo, sem previsão para desenvolvimento.
HyperJ
O HyperJ, suporta a Separação Multidimencional de Interesses (Multi-Dimensional Separation of Concerns -MDSC). Isso facilita a adaptação, composição, integração, modularição imprevista e até mesmo a uma remodularição de componentes.
Esta separação de interesses é o objetivo principal da decomposição. E a decomposição deve ser feita até que cada unidade do problema possa ser compreendida e construída, e cada unidade da decomposição deve apresentar apenas um interesse.
MDSC permite a decomposição de interesses em: classes, objetos, procedimentos, métodos, entre outros.
O HyperJ oferece uma poderosa habilidade na composição, que pode ser usada para na combinação de sujeitos em um programa ou componente. Com isso é possível criar versões de sistemas contendo diferentes características. Pode ser usado também para estender ou adaptar um componente.
Este ambiente pode ser usados em qualquer estágio do ciclo de vida de um software – projeto, implementação, integração, evolução de sistema, reengenharia, etc:
No caso especial do SOP os módulo de interesses são identificados como Sujeitos.
O HyperJ implementa HyperSpaces que seria a representação de software em múltiplas dimensões. O HyperSpace é composto pelo Hyperslices que encapsulam os interesses e Hypermodule que é um conjunto de hyperslices e relacionamentos de integração (regras de composição e relacionamento entre interesses).
Implementação Container
A Implementação do Container foi realizada com a divisão do container em duas visões simples. A visão de inclusão de objetos e a exclusão de objetos. Esses são os dois sujeitos propostos no trabalho. A composição foi a união das remoção e inserção, conforme pode ser vista na figura a seguir.
Visões do Container
Especificação do Hipermódulo:
- hyperspace (Arquivos
que serão compostos) -concerns (Mapeamento
de Interesses) -hypermodules
(Relacionamentos (Regras) de Composição) |
Conclusões
Referências Bibliográficas
[1] TARR, Peri; OSSHER, Harold. (2000). “Hyper/J User and Installation Manual”. IBM Research. IN: http://www.research.ibm.com/hyperspace/HyperJ/HyperJ.htm.
[2] IBM Corporation. (1996). "Subject-oriented programming". IBM Research. IN: http://www.research.ibm.com/sop/.
[3] VLISSIDES, John. (1998). "Subject-Oriented Design". C++ Report. IN: http://www.research.ibm.com/sop/sopdpegs.htm.
[4] KAPLAN, Mattew; OSSHER, Harold; HARISSON, William; KRUSKAL, Vicent. (1996). "Subject-oriented design and the Watson Subject Compiler". Position paper for OOPSLA'96 Subjectivity Workshop. IN: http://www.research.ibm.com/sop/papers/position96.htm.