No mundo de software nós freqüentemente encontramos ferramentas, frameworks e outros ítens que nos abstraem alguns conceitos, e nos dão uma maneira de trabalhar “mais alto nível”.
Nessas situações, é comum ouvirmos que essa abstração é “transparente para o desenvolvedor”, “transparente para o usuário”, ou “transparente alguma coisa”. Essa terminologia abstrai (usar esse termo aqui foi irresistível
) dois tipos de abstração bem diferentes, então vou falar um pouco sobre os dois tipos de abstração encontrados em software, com algumas opiniões sobre ambos.
O que eu chamo de Abstrações Transparentes são as que te oferecem uma forma de trabalho num nível mais alto, mas te permitem ver (é transparente afinal de contas) o que está por baixo dos panos sem tanto esforço. Um exemplo disso eu diria que é o que acontece no Struts e no Spring MVC.
Frameworks web deste estilo tentam te dar um desenvolvimento mais produtivo, sem que você tenha que se preocupar com tudo que está envolvido no processamento de requisições e respostas HTTP. Entretanto, o fluxo de processamento da requisição e resposta é bem intuitivo do ponto de vista do que está acontecendo na interação do usuário com o servidor. E se você quiser manipular a requisição e a resposta, você conseguirá facilmente, sem “burlar” a proposta do framework.
O que eu chamo de Abstrações Opacas são as que também te oferecem uma forma de trabalho num nível mais alto, mas te escondem bem mais o que está acontecendo por baixo dos panos. O objetivo é de fato que você não precise saber dos detalhes, e não queira se meter com eles. Um exemplo disso é o que acontece no JSF e no Wicket, e também no Aqualogic Service Bus.
O JSF e o Wicket oferecem um paradigma de desenvolvimento web diferente do tradicional modelo “Request/Response”. Eles têm um modelo componentizado, no qual a requisição e a resposta HTTP ficam bem encapsulados, e as suas interações com o usuário devem ser totalmente focadas nos componentes. A idéia é que você realmente não veja o que está rolando por baixo dos panos, e não se envolva mesmo com os detalhes.
Eu pensei um pouco sobre isso hoje mais cedo, mexendo com o Aqualogic Service Bus. Troquei umas idéias sobre o que ele faz quando ocorre mais de uma chamada a mais de um web service dentro da mesma transação, e na hora eu pensei: “Ainda bem que essa abstração é opaca!”
A ferramenta é sensacional e cuida de muitos detalhes cabeludos do trabalho com WS-* sem que você precise fazer na mão.
Sobre os dois tipos de abstração, a decisão de qual é mais adequado varia muito com a situação e com gostos pessoais. Em relação a frameworks web, eu tenho me dado muito melhor com Abstrações Transparentes, pois eu quero ver os detalhes e quero ter controle sobre eles.
Em situações em que não queremos controlar os detalhes do que está sendo feito, as Abstrações Opacas são muito boas, pois nos poupam esforços. É interessante saber em cada situação qual tipo de abstração você quer, porque a sua escolha de tecnologias e ferramentas será traçada com isso em mente.
Então na próxima ver que alguém disser que alguma coisa é “transparente”, veja logo se é Transparente ou Opaca
Eu tenho uma grave tendência a não gostar dessas coisas “opacas”. Pode ser que seja um defeito meu, não sei, mas a verdade é que me incomoda muito não ter idéia do que acontece. Um exemplo disso foi o Jersey quando eu queria manipular a entrada e penei, pois o bicho não era claro na maneira que trabalhava. Cheguei a pensar que só conseguiria usar o JAXB. No fim das contas descobri quase por milagre que existia uma forma de pegar um InputStream, mas nem na documentação eu vi isso.
Mas sei lá, derrepente é trauma hehehehehe.
Abraços e valeu pelo artigo. Ficou ótimo!
É, normalmente eu também prefiro as abstrações transparentes, mas em alguns casos não vale a pena o esforço de conhecer os detalhes, ou é algo que não nos interessa muito, então as abstrações opacas também têm seu espaço
Não sei se vc já trabalhou com Ruby on Rails, mas acho que é um caso de abstração opaca. Quando você precisa fazer alguma configuração fora do padrão, geralmente é muito difícil descobrir como fazer. Nem a documentação costuma ajudar.
Oi Guilherme, cheguei a estudar um pouco o RoR e a fazer alguns poucos exemplos, mas nada além do feijão com arroz do framework. Assim, não cheguei aos detalhes de como funciona a abstração dele. Mas obrigado pelo feedback, pois certamente ainda vou estudar mais sobre ele no futuro.
[]s