DEV Community

João Paulo Oliveira
João Paulo Oliveira

Posted on

2

Contribuindo para coesão e encapsulamento através do design de código Tell Don't ask

Tell Don’t Ask, em português diga não pergunte, é um princípio de design de código no qual através de um objeto ocorre a combinação de dados e comportamentos. Este design traz a lembrança de que orientação objeto baseia-se no comportamento que determinado objeto tem sobre seus dados e assim transferindo a responsabilidade a quem é de direito.

Image description

Image description

As duas figuras acima ilustram a relação entre dois objetos e suas responsabilidades em que a primeira figura mostra o objeto “chamador” fazendo diversas perguntas a outro objeto e tomando decisões com bases nas respostas que recebe, já a segunda imagem representa uma comunicação na qual o objeto “chamador” apenas diz ao outro o que fazer e assim toda a lógica concentra-se em quem é o dono dos dados.

Por exemplo, vamos imaginar que temos uma classe denominada carro e ela tem como propriedade velocidade. Porém iremos considerar uma velocidade limite de 120km.

class Carro(
   var velocidade: Int
)
Enter fullscreen mode Exit fullscreen mode

E ao utilizarmos uma instância desta classe queremos fazer com que o carro acelere.

fun main() {
   val carro = Carro(0)
   if (carro.velocidade < 120) {
       if ((carro.velocidade + 10) > 120) {
           carro.velocidade = 120
       } else {
           carro.velocidade += 10
       }
   }
}
Enter fullscreen mode Exit fullscreen mode

E aqui é perceptível que há algo errado, pois quem chama o objeto precisa verificar se a incrementação da velocidade não irá ultrapassar o limite permitido, 120km.

Já utilizando o conceito Tell Don’t Ask o código ficará mais conciso e as responsabilidades são definidas de acordo com o escopo de cada objeto.

fun main() {
   val carro = Carro(0)
   carro.acelerar()
}
Enter fullscreen mode Exit fullscreen mode

Agora quem chama o objeto não precisa implementar a lógica para incrementar a velocidade do objeto carro e sim somente chamar o método acelerar.

Já a classe carro fica responsável pelo o comportamento de acelerar, detendo toda a lógica de como fazê-la.

class Carro(
   private var velocidade: Int
) {
   fun acelerar() {
       if (this.velocidade < 120) {
           val novaVelocidade = this.velocidade + 10
           if (novaVelocidade > 120) {
               this.velocidade = 120
           } else {
               this.velocidade = novaVelocidade
           }
       }
   }
}
Enter fullscreen mode Exit fullscreen mode

Além de contribuir para um código limpo e coeso onde as responsabilidades são divididas para cada objeto de acordo com seu escopo, também contribui para a reutilização de código, pois quem utilizar esta classe carro não precisará perguntar sobre a velocidade do carro para tomar decisões e sim somente dizer o que é necessário.

Portanto, Tell Don’t Ask só reforça o pilar do encapsulamento que encontramos ao estudar programação orientada a objetos. O encapsulamento consiste em adicionar uma camada de segurança à aplicação escondendo suas propriedades e expondo pontos de interações. Deste modo, os dados só podem ser manipulados internamente e quem utiliza só precisa dizer o que deseja e não perguntar, assim como fazemos com nossos controles remotos de televisão, não sabemos como ele funciona internamente e apenas precisamos dizer para que ele ligue a TV, mude de canal, baixe e aumente o volume, entre outras funcionalidades, mas como isso de fato funciona não é preciso saber.

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay