Article image
Rafael Dias
Rafael Dias11/12/2023 13:31
Compartilhe

A Importância da Programação Orientada a Objetos para Desenvolvedores de Todos os Níveis

  • #JavaScript
  • #POO

Como a programação orientada a objetos pode ajudar o Dev iniciante até o avançado?

Para iniciantes, a programação orientada a objetos oferece uma maneira mais amigável de entender como os diferentes componentes de um sistema interagem, criando uma base sólida.

À medida que os desenvolvedores ganham experiência, a programação orientada a objetos permite a criação de sistemas complexos de forma mais gerenciável. Isso facilita a escalabilidade à medida que os projetos crescem.

A reutilização de código, um princípio fundamental da programação orientada a objetos, reduz a duplicação de esforço e erros, beneficiando tanto iniciantes quanto desenvolvedores avançados.

Como a experiência do usuário pode melhorar utilizando programação orientada a objetos ?

Imagine o código como um conjunto de peças de Lego, onde cada peça faz uma coisa específica. Com a programação orientada a objetos, essas "peças" podem se encaixar de maneira mais eficiente, resultando em interfaces mais suaves e interativas para o usuário.

Ao usar programação orientada a objetos, é possível organizar o código de forma mais intuitiva, facilitando a manutenção e a adição de novos recursos. Isso se traduz em uma experiência do usuário mais consistente e menos propensa a bugs irritantes.

Com a abordagem orientada a objetos, os desenvolvedores podem criar componentes reutilizáveis, economizando tempo e esforço. Significando menos tempo resolvendo problemas e mais tempo aprimorando a experiência do usuário com recursos incríveis.

O que é programação orientada a objetos em JavaScript?

Em JavaScript, a programação orientada a objetos é uma maneira de organizar e estruturar seu código, tornando-o mais fácil de entender e reutilizar. Ao invés de escrever todo o código em um só lugar, você o divide em pequenas partes chamadas objetos. Esses objetos têm características (como cor e tamanho) e podem realizar ações (como girar ou pular).

Exemplo:

Conta Bancária:

Características (Propriedades): saldo, titular, número da conta.
Ações (Métodos): depositar, sacar, verificarSaldo.

class ContaBancaria {
 constructor(titular, numeroConta) {
this.titular = titular;
this.numeroConta = numeroConta;
this.saldo = 0;
 }

 depositar(valor) {
this.saldo += valor;
console.log(`Depósito realizado! Novo saldo: ${this.saldo}`);
 }

 sacar(valor) {
if (valor <= this.saldo) {
 this.saldo -= valor;
 console.log(`Saque realizado! Novo saldo: ${this.saldo}`);
} else {
 console.log('Saldo insuficiente para o saque.');
}
 }

 verificarSaldo() {
console.log(`Saldo atual: ${this.saldo}`);
 }
}

const minhaConta = new ContaBancaria('João', '123456');
minhaConta.depositar(1000);
minhaConta.sacar(500);
minhaConta.verificarSaldo();

Esse exemplo mostra como a programação orientada a objetos em JavaScript organiza o código, facilita a reutilização e ajuda na manutenção, tornando o desenvolvimento mais eficiente e compreensível.

Diretrizes e demais especificações

  • Prototypes e Herança

Explore o conceito de protótipos em JavaScript para implementar herança.

Utilize a propriedade prototype para adicionar métodos e propriedades às funções construtoras.

// Função construtora para a classe Animal
function Animal(name) {
this.name = name;
}

// Adicionando um método ao protótipo da classe Animal
Animal.prototype.sayHello = function () {
console.log(`Hello, I'm ${this.name}`);
};

// Função construtora para a classe Dog, que herda de Animal
function Dog(name, breed) {
// Chamando o construtor da classe pai (Animal) usando call para configurar o contexto corretamente
Animal.call(this, name);
this.breed = breed;
}

// Herança: Configurando o protótipo de Dog para ser um novo objeto com o protótipo de Animal
Dog.prototype = Object.create(Animal.prototype);

// Adicionando um método específico para a classe Dog ao protótipo
Dog.prototype.bark = function () {
console.log("Woof! Woof!");
};

// Criando instâncias das classes Animal e Dog
const animal = new Animal("Generic Animal");
const dog = new Dog("Buddy", "Golden Retriever");

// Usando métodos das classes
animal.sayHello(); // Output: Hello, I'm Generic Animal
dog.sayHello();   // Output: Hello, I'm Buddy
dog.bark();     // Output: Woof! Woof!


  • Funções Construtoras

Use funções construtoras para criar objetos, nomeie-as com a primeira letra em maiúsculo.

Adicione propriedades ao this dentro da função construtora.

function Car(model, year) {
this.model = model;
this.year = year;
}
  • Módulos e Encapsulamento

Explore a encapsulação usando módulos, pode ser completado usando closures.

const Calculator = (function() {
let result = 0;

function add(x) {
  result += x;
}

function subtract(x) {
  result -= x;
}

function getResult() {
  return result;
}

return {
  add,
  subtract,
  getResult
};
})();
  • Propriedades Getters e Setters

A implementação de propriedades getters e setters em Programação Orientada a Objetos (POO) é uma prática comum para controlar o acesso e a modificação de atributos de objetos.

class Pessoa {
  constructor(nome, idade) {
      this._nome = nome; // Atributo privado com convenção de nome com underline
      this._idade = idade;
  }


  // Getter para a propriedade 'nome'
  get nome() {
      return this._nome;
  }


  // Setter para a propriedade 'nome'
  set nome(novoNome) {
      if (typeof novoNome === 'string' && novoNome.length > 0) {
          this._nome = novoNome;
      } else {
          console.log('Nome inválido');
      }
  }


  // Getter para a propriedade 'idade'
  get idade() {
      return this._idade;
  }


  // Setter para a propriedade 'idade'
  set idade(novaIdade) {
      if (typeof novaIdade === 'number' && novaIdade > 0) {
          this._idade = novaIdade;
      } else {
          console.log('Idade inválida');
      }
  }


  apresentar() {
      console.log(`Olá, meu nome é ${this._nome} e tenho ${this._idade} anos.`);
  }
}


// Criando uma instância da classe Pessoa
const pessoa = new Pessoa('João', 25);


// Acessando os getters
console.log(pessoa.nome); // Output: João
console.log(pessoa.idade); // Output: 25


// Utilizando os setters
pessoa.nome = 'Maria';
pessoa.idade = 30;


// Chamando o método da classe
pessoa.apresentar(); // Output: Olá, meu nome é Maria e tenho 30 anos.


Neste exemplo, a classe Pessoa possui propriedades privadas _nome e _idade, e os métodos get e set são utilizados para definir como essas propriedades podem ser acessadas e modificadas. Os getters permitem a leitura dessas propriedades, enquanto os setters permitem a modificação delas, proporcionando uma maneira controlada de interagir com os atributos da classe.

  • Polimorfismo

Aproveite o polimorfismo para criar métodos em várias classes com a mesma assinatura.

 class Animal {
makeSound() {
  console.log("Some generic sound");
}
}

class Dog extends Animal {
makeSound() {
  console.log("Woof! Woof!");
}
}

class Cat extends Animal {
makeSound() {
  console.log("Meow!");
}
}
  • Evite o Uso Excessivo de Herança

 Favoreça a composição sobre a herança para evitar problemas de hierarquia excessiva.

  • Tratamento de Erros

Implemente tratamento de erros adequado ao criar instâncias de objetos. Use exceções ou valores de retorno apropriados.

  • Comentários Descritivos

Adicione comentários descritivos para explicar a lógica complexa ou escolhas de design.

Lembrando de que essas são diretrizes gerais, e a aplicação específica pode depender dos requisitos do projeto e das práticas adotadas pela equipe de desenvolvimento.

E ai curtiu essa abordagem sobre POO ? tentei ser o mais direto e objetivo possível, utilizei javascript como exemplo, porque atualmente estudo essa linguagem e me senti confortável, mas nada que impeça a utilização de outras linguagens, e muito obrigado por ler! e se quiser se conectar comigo só clicar aqui onde está escrito Linkedin.

Compartilhe
Comentários (0)