Sobre orientação a objeto, responsabilidades e comida italiana

tulum-trattoria-romana

Faz tempo que eu venho pensando sobre um assunto e só há poucos dias conseguir botar no papel.

Tem a ver com orientação a objetos, responsabilidades, colaboração/comunicação, e comida italiana.
Aqui vai…

Quando eu comecei a programar, lá em 2000, eu tive contato com esse conceito de “orientação a objeto”.
Classes, atributos, métodos, herança, polimorfismo, pá.
As pessoas diziam que era melhor programar usando esse paradigma. Mas, olhando pra trás, nunca ninguém me explicou porquê exatamente isso era melhor.

O tempo passou e eu ouvi uma metáfora que ficou na cabeça: usando orientação a objetos, seu código fica menos parecido com um prato de espaghetti e mais parecido com um prato de ravioli. Cada ravioli faz uma coisa, os raviolis falam com outros raviolis quando necessário, e seu sistema fica muito mais fácil de manter e evoluir,

Só que… na prática não era bem assim.

De lá pra cá eu programei muita coisa OO, e tive contato com muito código OO. Herança, Polimorfismo, classes, tá tudo lá, sempre. Mas ainda assim, muitas vezes o código, mesmo OO, ainda tinha aquele cheirinho de spaghetti.

E aí a medida que eu fui ficando mais experiente, eu me pegava cada vez mais pensando em termos de responsabilidades e “conhecimento”:

  • Onde eu devo colocar esse método? De quem deve ser a responsabilidade por essa tarefa?
  • Hum, essa responsabilidade tá no lugar errado, precisa refatorar isso aqui…
  • Xi, esse componente aqui não deveria conhecer aquele componente acolá.

(Veja que eu estou usando a palavra componente de maneira muito genérica aqui. Pode ser um <input>, uma classe java, um módulo python, uma função javascript. Neste contexto, um componente é um pedaço do seu software que tem uma responsabilidade ok?)

E aí tem vezes que um sistema crescendo lembra até uma empresa: vira e mexe vc se pega perguntando “quem é/deveria ser a pessoa/área responsável por essa atividade?” – alguém aí já passou por isso?

Peraí que eu tô viajando muito, deixa eu aterrisar aqui…

Então, refletindo de maneira um pouco mais profunda sobre isso, cheguei à conclusão que:

Pensar meramente em termos de OO não causa código raviólico.

Pra fazer código raviólico vc precisa enxergar seu software como uma rede de componentes que colaboram entre si.

Acho que, idealmente, isso deve se parecer com a estrutura B abaixo.

unnamed

  • Cada componente tem uma responsabilidade bem definida – senão vc vai ficar perdido scrollando no meio de um monte de código.
  • Cada componente deve conhecer apenas alguns poucos vizinhos mais íntimos – senão gera alto acoplamento: os componentes perdem a capacidade de variar independentemente. Aí se vc muda um negócio aqui -> causa vários impactos (ou bugs) acolá.
  • E cada componente pode ser quebrado em componentes menores. Vc pode ter uma rede de componentes dentro de um componente.

No nosso trabalho, além de programar as responsabilidades de cada componente, a gente precisa definir responsabilidades e organizar essa rede de modo a facilitar a comunicação entre os componentes; de modo que comunicação entre eles flua de maneira ótima.

Fazer software bem feito é a arte de ser CEO do sistema!🙂

Então: no dia que vc for ensinar programação pra alguém que tá começando: antes de falar sobre OO, herança, etc; por favor considere falar primeiro sobre raviolis. O ravioli que é o importante.

Antes de bitolar no OO, o caboco precisa entender porquê dividir um sistema em partes menores, com responsabilidades bem definidas, e tão independentes umas das outras quanto possível.
O importante é focar na rede, e na otimização da interação entre os elementos da rede. OO é só uma ferramenta pra ajudar a construir a rede.

Pq se o caboco não tiver pensando em ravioli desde o começo, vai sair espaghetti.

Ah vai.

7 comentários em “Sobre orientação a objeto, responsabilidades e comida italiana

  1. Poxa cara, simplesmente fantástico artigo. Por favor, faça mais com esse tema. Sempre me perguntava na época que aprendi a programar com Java. Por que caralhos eu deva programar OO? Se de modo estrutural funciona perfeitamente? Claro que pensava assim só no começo. Mas agora você tirou uma grande dúvida kk Grande abraço.

  2. Boa cara!!
    Muitas pessoas relevam essa questão de **responsabilidade** que é justamente o que você disse, “….um comportamento não deve está nesse componente pq não faz parte da responsabilidade dele….” e se você ainda assim achar que o comportamento deveria está lá você está pensando/entendendo errado. Exemplo: em 2 classes Lâmpada e RedeElétrica não faz sentido na classe Lâmpada você verificar se existe corrente na rede elétrica.

  3. Cara, você disse: “Mas, olhando pra trás, nunca ninguém me explicou porquê exatamente isso era melhor”. E saliento dizendo que ultimamente tenho percebido que muitas coisas na vida são assim. Te ensinam como a parada funciona, mas não explicam o porque e o resultado é um spaghetti mental de idéias desestruturadas. Nem todos têm o dom do questionamento e a curiosidade para entender como as coisas funcionam (ou como deveriam funcionar, hehe). Curti seu texto explicativo🙂 Parabéns e muito obrigado! Sucesso pra você.

  4. Parabéns pela postagem. Bem clara e objetiva.

    Eu passei por um processo parecido no começo. Se tivesse lido esse artigo no começo, seria bem diferente, ah seria.

    Abraços.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s