Artigo do tipo Exemplos Práticos
Recursos especiais neste artigo:
Conteúdo sobre boas práticas.
Desenvolvimento com qualidade com GRASP
Os padrões GRASP englobam uma série de princípios baseados em conceitos de Orientação a Objetos. Partindo de análises que procuram definir quais as obrigações dos diferentes tipos de objetos em uma aplicação, estes patterns disponibilizam uma série de recomendações que procuram favorecer a obtenção de sistemas melhor estruturados.

Em que situação o tema é útil
Partindo de práticas consagradas no desenvolvimento de sistemas orientados a objetos, os padrões GRASP procuram fornecer diretrizes para a construção de aplicações bem estruturadas e que possam ser facilmente adaptáveis diante da necessidade de mudanças. A consequência direta das recomendações propostas por estes patterns é um código melhor organizado, de fácil manutenção e ainda, capaz de ser compreendido por diferentes desenvolvedores sem grandes dificuldades.

Ao se considerar o desenvolvimento de softwares nos primórdios da computação, verifica-se que os primeiros programas se resumiam a um agrupamento de comandos organizados em uma sequência lógica. Era relativamente comum a repetição de trechos de código ao longo de uma aplicação, além da presença de instruções desviando o fluxo de execução em resposta a condições específicas (GOTOs). Este tipo de prática ficou popularmente conhecido como “código spaghetti”, revelando-se como um modelo bastante trabalhoso para a implementação de soluções, principalmente a partir do aumento progressivo na complexidade dos sistemas informatizados.

O advento da programação estruturada foi uma resposta às dificuldades encontradas nessa fase inicial do desenvolvimento de sistemas. A fim de sanar as deficiências até então existentes, foram introduzidos mecanismos como estruturas de decisão e repetição, além de se incentivar o uso de técnicas como a separação de grupos de instruções com alguma relação em sub-rotinas. Tudo isso possibilitou uma melhor organização do código-fonte, facilitando a construção de aplicações robustas e voltadas aos mais variados objetivos.

Logo após a programação estruturada, a próxima transformação de grande impacto na área de software foi o surgimento do conjunto de princípios conhecidos como Orientação a Objetos (OO). Nesse estágio de evolução foi dada uma grande ênfase à representação de elementos do mundo real como objetos, com tais estruturas sendo formadas por um agrupamento de características (atributos/propriedades) e comportamentos (operações/métodos). C++, .NET, PHP, Delphi e Java constituem bons exemplos de linguagens/plataformas que incorporam o conceito de objeto na implementação de aplicações.

Dentre os fatores que contribuíram para popularizar as linguagens baseadas em OO, merece destaque o trabalho efetuado por diversos especialistas de software documentando soluções que ficaram conhecidas como padrões de projeto/design patterns. Uma das mais famosas iniciativas neste sentido foi a publicação no ano de 1994 de 23 patterns, aos quais se convencionou chamar de GoF (BOX 1).

A utilização de patterns em projetos de software tem como grande benefício privilegiar a adoção de boas práticas de programação, contribuindo dessa maneira para uma melhor estruturação das aplicações resultantes. Um pattern nada mais é do que um conjunto de recomendações voltadas à resolução de uma necessidade específica e, por vezes, recorrente na área de desenvolvimento. Isso significa que um padrão não está ligado a uma determinada tecnologia, mas sim que procura fornecer um modelo já testado anteriormente (e com êxito) para um cenário bem definido.

Além dos padrões GoF, vários outros patterns foram catalogados com o decorrer do tempo. Um exemplo disto são os padrões GRASP, os quais contemplam um conjunto de princípios baseados na noção de responsabilidade e que podem servir de guia no desenvolvimento de soluções OO. O objetivo deste artigo é descrever estes patterns e ainda, de que forma os mesmos podem ser úteis durante a construção de aplicações na plataforma .NET.

BOX 1. GoF

GoF é a sigla em inglês para o termo “Gang of Four”, um apelido dado ao esforço conjunto de 4 autores (Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides), os quais documentaram 23 padrões de projeto no famoso livro “Design Patterns: Elements of Reusable Object-Oriented Software”. Na época de lançamento desta obra, foram elaborados exemplos de implementação destes patterns nas linguagens C++ e Smalltalk; contudo, a ampla abrangência destes padrões permite que os mesmos sejam empregados ainda hoje, auxiliando desenvolvedores das mais variadas plataformas na tarefa de resolver situações que se repetem com alguma frequência.

Padrões GRASP e o conceito de responsabilidade: uma visão geral

Conforme mencionado anteriormente, os padrões GRASP (abreviatura do inglês “General Responsibility Assignment Software Patterns”) são formados por princípios/padrões que servem de base para a atribuição de responsabilidades em um projeto orientado a objetos. Estes patterns foram publicados originalmente pelo especialista Craig Larman no livro “Applying UML and Patterns – An Introduction to Object-Oriented Analysis and Design and the Unified Process” (obra traduzida em português com o título “Utilizando UML e Padrões – Uma introdução à análise e ao projeto orientados a objetos e ao desenvolvimento iterativo”).

O conceito de responsabilidade deve ser compreendido, basicamente, como as obrigações que um objeto possui quando se leva em conta o seu papel dentro de um determinado contexto. Além disso, é preciso considerar ainda as prováveis colaborações (interações) entre diferentes objetos. A implementação de soluções OO considerando os conceitos de responsabilidade, papéis e colaborações fazem parte de uma abordagem conhecida como Responsibility-Driven Design ou, simplesmente, RDD (BOX 2).

Para se definirem as responsabilidades de um objeto, leva-se em conta o que este elemento irá “fazer” e/ou “saber”.

Responsabilidades relativas ao que um objeto faz incluem:

· A execução de ações que condizem com o papel desempenhado por tal objeto. Geralmente, tais ações serão implementadas sob a forma de métodos em classes implementadas através do .NET Framework;

· A criação de outros objetos dos quais a instância (objeto) inicial depende;

· A coordenação de atividades envolvendo vários outros objetos.

Quanto ao que um objeto sabe, é possível citar:

· O conhecimento a respeito de outros objetos relacionados;

· O conhecimento dos dados privados que o objeto em questão encapsula (expostos no caso da plataforma .NET através das propriedades que compõem uma classe);

· O conhecimento a respeito de coisas que serão calculadas ou, mesmo, derivadas a partir de um elemento principal (uma superclasse, por exemplo).

Os diferentes padrões GRASP não devem ser encarados como soluções pré-definidas para problemas específicos. Na verdade, estes patterns devem ser compreendidos como princípios que auxiliam os desenvolvedores na árdua tarefa de projetar de uma forma bem estrutura aplicações orientadas a objetos.

Ao todo são nove os padrões GRASP, os quais serão discutidos em maiores detalhes nas próximas seções (o nome em português desses patterns está seguido entre parênteses pela identificação equivalente em inglês):

· Criador (Creator);

· Especialista na Informação (Information Expert);

· Baixo Acoplamento (Low Coupling);

· Alta Coesão (High Cohesion);

· Controlador (Controller);

· Polimorfismo (Polymorphism);

· Fabricação/Invenção Pura (Pure Fabrication);

· Indireção (Indirection);

· Variações Protegidas (Protected Variations).

BOX 2. RDD

Responsibility-Driven Design é uma técnica de desenvolvimento OO proposta no início dos anos 1990, como resultado do trabalho dos pesquisadores Rebecca Wirfs-Brock e Brian Wilkerson. Este paradigma está fundamentado nas ideias de responsabilidade, papéis e colaborações.

...
Quer ler esse conteúdo completo? Tenha acesso completo