[Conceito] - Orientação a Objetos: Modele Comportamento
Published: 2022-09-06 18:22:51

> Conteúdo original em https://twitter.com/zanfranceschi/status/1567216344428584960

Ei dev,

Pra você que é iniciante em Orientação a Objetos e quer ficar calvo ou calva de tanto que a brisa da vitória irá esvoaçar seus cabelos, cola mais pra essa dica de modelagem com foco em COMPORTAMENTO!

Cola mais pra eu te explicar o rolê.

cc @sseraphini 

↓

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bogfubtd18nlvtytutri.png)

---

Tá, mas e quando você abre aquele tutorial na internet e se depara com uma modelagem simples como essa? Fazer um "banco" pra ensinar os fundamentos de OO.

Parece bem comum, né? Cliente, Conta e seus atributos...

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h763p5zhwhuh9gu346z9.png)

---

Aí depois o tutorial fala pra criar um método "transferir" – mais arroz e feijão que isso não conheço.

Não tá ruim, né? Parece coerente modelar a Conta sendo responsável pela transferência.

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zy69qws7ez3jf9ovhgof.png)

---

Depois, você começa a aprender bancos de dados e ORMs (hibernate, entity framework, prisma, doctrine, sqlalchemy, etc).

Naturalmente, o foco é nas estruturas e atributos e depois faz os save, delete, etc.

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mgo2kp9yj16vthh92sfp.png)

---

Aí você encontra outro tutorial sobre introdução a Orientação a Objetos... 

...com o tema "carro"! (leia com uma entonação de americano bobo empolgado)

É o carro que é veículo, aí o carro tem os métodos "acelerar", "virar"... e assim caminha a humanidade.

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zox252lxs2f8pohlf2si.png)

---

Quase todo material introdutório a orientação a objetos é assim: foco na estrutura (campos, atributos, forma) e o comportamento (métodos) vem depois, meio que como uma cola.

---

Pois bem, aí vc roda uns quilómetros na estrada dev e começa a se deparar com DDD, TDD, clean architecture, hexagonal, archiecture, ports and adapters e os escambau a quatro.

Parece que os materiais deram um salto quântico e você se sente mais perdida que pulga em cobra. 🥲

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m59gpsorcjci9dsoms1s.png)

---

Por tudo isso, gostaria de propor uma nova forma para você pensar nas suas modelagens. Sem buzz-words, sem conceitos complexos pra quem está iniciando: FOQUE EM COMPORTAMENTO!

MODELE COMPORTAMENTO TAMBÉM COMO OBJETOS!

---

Orientação a Objetos é comumente ensinada como se as coisas precisassem refletir uma visão estática do mundo. É como se apenas as coisas perceptíveis numa foto merecessem virar uma classe ou objeto.

---

Você não vê um carro virando numa foto, mas vê o carro, o volante, a roda, etc.

Numa foto duma loja, você não veria a transação da compra em si. Você veria a cliente, o caixa, o produto.

Parece que o termo "objeto" está sendo levado ao pé da letra demais no ensino de OO.

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/znmb1379d8c0pn2rnz5q.png)

---

Por sugestão, quero dizer pra você também considerar comportamento. Quero dizer para você experimentar modelar classes que expressem fluxo, movimento, comportamento! Como se você passasse a enxergar um vídeo em vez de apenas uma foto!

---

Vamos a alguns exemplos práticos.

Vamos imaginar um banco (financeiro) num tutorial em que gostaríamos de abrir uma conta. A gente poderia começar a modelar o comportamento em primeiro plano e a estrutura depois, em segundo plano.

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g85sclq16hhaeaewp3gi.png)

---

Poderíamos imaginar outros exemplos também de modelagem com foco em comportamentos expressos em objetos*.

\* Gosto de chamar classes de objetos porque muitas vezes estou falando do runtime, da aplicação funcionando, instancias, etc – não design. Classe é design, objeto é runtime.

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7y21m39x1gr8j7znukn9.png)

![Image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2x2a4lzydgav6saso18.png)

---

Talvez modelar dessa forma possa lhe parecer errado, contra o que você aprendeu.

Não estou falando que essa forma é a correta, estou lhe sugerindo dar a chance de pensar dessa forma. Isso vai lhe possibilitar uma abordagem diferente que pode te ajudar em algumas situações.

---

Essa forma de pensar vai te abrir uma nova dimensão. Além do mais, quando você conversa com usuários de sistemas, raramente fala-se de estrutura de início – fluxos frequentemente é que são os objetos das conversas (trocadilho proposital).

---

Experimente começar seus desenhos/análises/diagramas com fluxos e comportamentos em vez de estruturas.

Gregor Hohpe disse em um de seus livros que, num diagrama, as setas/conexões são mais interessantes do que as caixinhas e essa thread é sobre isso!

---

Ah, modelar objetos pensando em comportamento pode gerar um pouco mais de dificuldade na persistência (afinal, persistência é apenas estrutura, nunca comportamento). Mas por outro lado, pensar em eventos será mais fácil ("conta aberta", "usuário logado", "carro colidiu", etc).

---

No passado, fiz uma thread que aborda mais ou menos essa ideia de comportamento vs estrutura, entretanto, num nível mais alto.

Tá aí, caso se interesse 👇

https://twitter.com/zanfranceschi/status/1515015604977401857

---

Agora me conta aí como você geralmente modela seus objetos? Compartilha seu processo com a gente 🙂

---

Bom, era o que tinha pra falar pra você que está iniciando.

Espero que esse assunto tenha causado, pelo menos, alguma curiosidade para experimentação.

Gostaria também de agradecer demais se chegou até aqui e especialmente ao @lixeletto pela revisão! ♥️

Um abraço e um beijo.