DEV Community

Francisco Zanfranceschi
Francisco Zanfranceschi

Posted on

[Conceito] - Orientação a Objetos: Modele Comportamento

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


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


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


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


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


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


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


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


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

Image


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.

Top comments (0)