Olá, estudante! Tudo bem?
Agora que você já domina os layouts responsivos com o Jetpack Compose, que tal adicionar mais uma ferramenta à sua caixa de habilidades? Neste momento, você conhecerá os principais conceitos de Orientação a Objetos (OO), que possivelmente já viu em outras linguagens e disciplinas, mas agora com um foco específico na sua aplicação em Kotlin e sua comparação com o JavaScript. Você analisará como essas linguagens implementam paradigmas fundamentais, como classes, herança, polimorfismo e encapsulamento, comparando suas abordagens e diferenças estruturais.
O objetivo não é apenas relembrar a teoria, mas, sim, aprofundar a aplicação prática desses conceitos em Kotlin, explorando suas particularidades e vantagens no desenvolvimento moderno. Ao final da lição, você será capaz de entender as vantagens e limitações de cada abordagem, além de aplicar esses conhecimentos para escrever um código mais modular, reutilizável e eficiente em diferentes contextos de programação.
Vamos lá?
Imagine que você está desenvolvendo um sistema para uma plataforma de cursos on-line e sua equipe decidiu usar Kotlin para o desenvolvimento do aplicativo mobile e JavaScript para o backend e algumas funcionalidades do frontend. Ao começar a estruturar as classes e funcionalidades do sistema, você percebe que há diferenças significativas entre como Kotlin e JavaScript implementam orientação a objetos. Enquanto Kotlin usa um modelo baseado em classes — similar ao Java —, JavaScript, originalmente, utilizava um modelo baseado em protótipos, embora tenha incorporado suporte a classes na ECMAScript 6 (ES6).
Diante disso, como as diferenças na implementação da Orientação a Objetos impactam a modularidade, reutilização e organização do código em cada linguagem? Com base nos ganhos já conhecidos da POO, como encapsulamento, herança e polimorfismo, você conseguirá identificar as vantagens e desvantagens de cada abordagem, compreendendo qual delas melhor se adapta às necessidades de desenvolvimento em diferentes cenários! Vamos entender melhor sobre isso?
Agora, vamos entender como Kotlin e Javascript implementam a POO na prática? Para ilustrar como isso acontece, vamos utilizar como exemplo a TechSolutions, uma empresa fictícia de tecnologia que enfrentava desafios de manutenção e escalabilidade em sua plataforma de automação empresarial, cujo backend em JavaScript era robusto, mas a versão mobile apresentava dificuldades de evolução.
Diante do crescimento acelerado da base de usuários, tornou-se evidente que a arquitetura precisaria ser reformulada para garantir um desempenho melhor e um desenvolvimento mais eficiente. Sendo assim, a liderança da empresa decidiu dividir a equipe de tecnologia em dois grupos: um responsável pelo backend e painel administrativo, que continuaria utilizando JavaScript, e outro focado no desenvolvimento do aplicativo mobile, que passaria a ser construído com Kotlin.
A transição para um novo modelo gerou desafios na aplicação consistente da Orientação a Objetos em Kotlin e JavaScript, devido às diferenças entre herança baseada em classes e protótipos. Para garantir a modularidade e a padronização, a equipe realizou treinamentos e definiu diretrizes para unificar a estrutura das classes e modelos de dados, facilitando a integração entre o aplicativo e o backend.
Após a reestruturação, o aplicativo mobile em Kotlin tornou-se mais estável e rápido, melhorando a experiência do usuário, enquanto o backend em JavaScript manteve sua flexibilidade com um código mais organizado. Com isso, a empresa modernizou sua tecnologia e estabeleceu um modelo de desenvolvimento eficiente e escalável para o futuro! Como resultado, a empresa conseguiu modernizar sua tecnologia e estabelecer um modelo de desenvolvimento mais eficiente e escalável para o futuro!
Observe que esse exemplo demonstra claramente como o conteúdo abordado nesta lição é aplicado na prática, embora também possa ser útil em diversos outros contextos!
A Orientação a Objetos (OO) é um dos paradigmas mais utilizados no desenvolvimento de software, pois permite organizar o código em objetos, que encapsulam dados e comportamentos. Felix (2016) afirma que a programação orientada a objetos — também conhecida por sua sigla POO — facilita a relação da máquina com o mundo real, isso porque qualquer coisa que pertence ao mundo físico pode ter um representando na esfera digital.
A Orientação a Objetos é um dos paradigmas mais utilizados no desenvolvimento de software, pois organiza o código de forma modular e reutilizável, facilitando tanto a manutenção quanto a escalabilidade dos sistemas. Antes de explorarmos seus conceitos fundamentais, é essencial compreender seu principal propósito: estruturar o software de maneira que ele reflita elementos do mundo real, tornando o desenvolvimento mais intuitivo e eficiente.
Nesse contexto, revisaremos três dos pilares desse paradigma — Encapsulamento, Herança e Polimorfismo — junto a seus dois principais componentes: Classes e Objetos.
A classe é o molde que define as propriedades e os comportamentos de um objeto. O objeto, por sua vez, é uma instância dessa classe. Felix (2016) resume a explicação dizendo que objetos correspondem a elementos da vida real e que classes agrupam esses objetos.
Protege os dados internos de um objeto, permitindo acessá-los apenas por métodos específicos. De acordo com Felix (2016), o conceito pode ser utilizado como forma de restringir a visibilidade de informações e detalhes de implementações.
Permite que uma classe herde atributos e métodos de outra classe, promovendo a reutilização de código. Sobre isso, Felix (2016) aponta a herança como uma maneira de reutilizar o código, onde uma nova classe é criada absorvendo os membros de uma classe já existente.
Permite que métodos com o mesmo nome tenham comportamentos diferentes, dependendo do contexto. Felix (2016) complementa dizendo que o polimorfismo permite que você programe de forma ampla em vez de perder muito tempo no desenvolvimento de código específicos.
Para entender melhor como as linguagens Kotlin e JavaScript implementam os conceitos de Orientação a Objetos, apresento-lhe dois exemplos simples de classe e criação de instância de objeto. Na Figura 1, será apresentada uma classe simples em Kotlin, que define um modelo básico com atributos e um método para exibir informações. Em seguida, veremos como criar uma instância dessa classe e utilizá-la no código.
Já na Figura 2, teremos o equivalente em JavaScript, demonstrando como a mesma estrutura pode ser implementada utilizando a sintaxe da linguagem, observe:
Por meio desses exemplos, é possível comparar as similaridades e diferenças entre as duas abordagens e como ambas permitem a criação e manipulação de objetos de forma eficiente.
O encapsulamento, basicamente, é a restrição do acesso direto aos atributos de um objeto, permitindo que eles sejam modificados apenas por meio de métodos específicos. Veja na Figura 3 como esse conceito é aplicado em Kotlin:
Já na Figura 4, teremos o equivalente em JavaScript, demonstrando como a mesma estrutura pode ser implementada utilizando a sintaxe da linguagem, observe:
De maneira geral, a herança permite que uma classe reutilize atributos e métodos de outra classe. Veja na Figura 5 como esse conceito é aplicado em Kotlin:
Já na Figura 6, teremos o equivalente em JavaScript, demonstrando como a mesma estrutura pode ser implementada utilizando a sintaxe da linguagem, observe:
O polimorfismo permite que métodos com o mesmo nome tenham comportamentos diferentes em classes diferentes. Veja na Figura 7 como esse conceito é aplicado em Kotlin:
Já na Figura 8, teremos o equivalente em JavaScript, demonstrando como a mesma estrutura pode ser implementada utilizando a sintaxe da linguagem.
De modo geral, as implementações de Orientação a Objetos em Kotlin e JavaScript possuem semelhanças conceituais, mas diferem em sua estrutura e sintaxe. Enquanto Kotlin segue um modelo mais próximo das linguagens tradicionais de POO, com suporte nativo para classes, herança baseada em classes e modificadores de acesso, JavaScript adota um modelo mais flexível, baseado em protótipos, permitindo maior dinamismo, mas exigindo um controle manual sobre encapsulamento e herança. Além disso, Kotlin enfatiza segurança e tipagem estática, enquanto JavaScript é dinâmico e mais permissivo, o que pode influenciar a escolha da linguagem dependendo do contexto do projeto.
Compreender as diferenças entre Kotlin e JavaScript em relação à Orientação a Objetos é essencial para desenvolver aplicações escaláveis e organizadas. Resumidamente, podemos dizer que ambos os modelos oferecem vantagens, mas escolher a abordagem correta pode impactar diretamente a manutenção e a evolução do projeto. Por isso, a importância de compreender muito bem cada uma delas.
Agora, vamos colocar isso em prática! Com certeza, você se lembra do projeto apresentado na lição anterior da tela responsiva de login. Pois bem, vamos agora criar uma classe em Kotlin para autenticar e devolver um feedback ao usuário. Para iniciar essa prática, siga os passos a seguir:
Tenha uma máquina com o Android Studio instalado (esse processo você já conhece da primeira parte da disciplina).
Caso você tenha o projeto da aula anterior, você pode simplesmente abri-lo. Caso contrário, crie um novo projeto chamado KotlinBoxWithContraints e escolha o template “Empty Compose Activity” e clique em “Next”.
Escolha a linguagem Kotlin.
Clique em Finish (Concluir) para criar o projeto.
Siga o passo a passo a seguir:
1) Implemente uma nova classe chamada Authenticator.kt conforme a Figura 9:
2) Agora que você já tem a classe de autenticação, é preciso fazer algumas alterações no Composable ResponsiveLoginForm() da lição anterior que ficará conforme a Figura 10 a seguir:
Entenda as principais mudanças do código com relação ao que foi implementado na lição anterior:
Linha 23: criação de uma variável chamada loginMessage para exibir a mensagem de sucesso ou de falha na interface.
Linha 24: criação de uma instância de objeto da classe Authenticator().
Linhas 49 a 55: implementação do comportamento do botão para que, ao ser clicado, chame o método login da classe Authenticator e, baseado no resultado, exiba a mensagem de sucesso ou falha.
Linha 64: inserção de um espaço entre o botão e o local onde aparecerá a mensagem de retorno da tentativa de login.
Linha 65: componente para exibição da mensagem com o resultado da tentativa de login.
A aplicação da Programação Orientada a Objetos (POO) no projeto da lição anterior foi essencial para estruturar o código de forma modular, reutilizável e organizada. Ao utilizar esses conceitos, garantimos que funcionalidades, como a autenticação de usuários no formulário de login, fossem implementadas de maneira clara e escalável. No exemplo, a criação de uma classe Authenticator permitiu centralizar a lógica de validação de credenciais, facilitando sua reutilização e manutenção. Além disso, a separação entre camadas de apresentação (interface gráfica com Jetpack Compose) e lógica de negócios tornou o desenvolvimento mais eficiente e alinhado às boas práticas, garantindo um sistema mais seguro e adaptável a futuras melhorias. Agora, desafie seus colegas e/ou professores a implementar os demais conceitos, o que acha?
FELIX, R. Programação orientada a objetos. São Paulo: Pearson Education do Brasil, 2016.