The Codest
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Indústrias
    • Fintech e Banca
    • E-commerce
    • Adtech
    • Tecnologia da saúde
    • Fabrico
    • Logística
    • Automóvel
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
Seta para trás VOLTAR
2016-09-10
Desenvolvimento de software

TER OU SER?

Katarzyna Jaruga

Ao aprender programação orientada para objectos, e depois de dominar as noções básicas de objectos, campos e métodos, passa-se a maior parte do tempo a falar de herança. Herança significa que adquirimos uma parte da implementação de uma classe base. Basta criar uma subclasse de uma classe de base para herdar todos os campos e métodos não privados.

Um carro e um avião são veículos, pelo que é óbvio que estas duas classes devem ser expandidas a partir da sua classe base comum chamada Veículo. Este é um exemplo académico típico, mas ao decidirmos sobre a ligação destas classes com a relação de herança, devemos ter em conta algumas consequências.

Fig. 1 Implementação da relação de herança.

Neste caso, as classes estão intimamente ligadas umas às outras, o que significa que as alterações no comportamento de cada classe podem ser efectuadas através de alterações na classe base código. Isto pode ser tanto uma vantagem como uma desvantagem - depende do tipo de comportamento que esperamos. Se a herança for aplicada no momento errado, o processo de adição de uma nova função pode encontrar algumas dificuldades de implementação, porque não se adequará ao modelo de classe criado. Teremos que escolher entre duplicar o código e reorganizar o nosso modelo - e isso pode ser um processo realmente demorado. Podemos chamar o código que executa a relação de herança de "aberto-fechado" - isso significa que ele está aberto para extensões, mas fechado para modificações. Partindo do princípio de que na classe Veículo existe um funcionamento geral e definido do motor de cada veículo, no momento em que quisermos acrescentar um modelo de veículo sem motor (por exemplo, uma bicicleta) à nossa hierarquia de classes, teremos de efetuar algumas alterações sérias às nossas classes.

classe Veículo
  def start_engine
  fim

  def stop_engine
  fim
fim

classe Avião < Veículo
  def mover
    motor_de_partida
    ...
    parar_motor
  fim
fim

Composição

Se estivermos interessados apenas numa parte do comportamento da classe existente, uma boa alternativa à herança é utilizar a composição. Em vez de criar subclasses que herdam todos os comportamentos (os que precisamos e os que não precisamos de todo), podemos isolar as funções de que precisamos e equipar os nossos objectos com referências a elas. Desta forma, deixamos de pensar que o objeto é um tipo de um objeto de base, a favor da afirmação de que contém apenas algumas partes das suas propriedades.

Fig. 2 Utilização da composição

Seguindo esta abordagem, podemos isolar o código responsável pelo funcionamento do motor na classe autónoma denominada Motor e fazer-lhe referência apenas nas classes que representam veículos com motor. Isolar as funções com o uso de composição tornará a estrutura da classe Veículo mais simples e fortalecerá o encapsulamento das classes individuais. Agora, a única forma de os veículos poderem ter um efeito no motor é utilizar a sua interface pública, porque já não terão informações sobre a sua implementação. Além disso, permitirá utilizar diferentes tipos de motores em diferentes veículos, e até mesmo permitir a sua troca durante a execução do programa. É claro que a utilização da composição não é perfeita - estamos a criar um conjunto de classes pouco interligadas, que pode ser facilmente alargado e está aberto a modificações. Mas, ao mesmo tempo, cada classe está ligada a muitas outras classes e deve ter informações sobre as suas interfaces.

classe Veículo
fim

classe Motor
  def start
  fim

  def stop
  fim
fim

class Plane < Veículo
  def initialize
    @engine = Engine.new
  fim

  def mover
    @engine.start
    @engine.stop
  fim

  def change_engine(new_engine)
    @motor = novo motor
  end
fim

A escolha

Ambas as abordagens descritas têm vantagens e desvantagens, por isso, como escolher entre elas? A herança é uma especialização, pelo que é melhor aplicá-la apenas a problemas em que existam relações de tipo "is-a" - para lidarmos com a verdadeira hierarquia de tipos. Como a herança liga fortemente as classes entre si, em primeiro lugar, devemos sempre considerar se devemos ou não utilizar a composição. A composição deve ser aplicada a problemas em que existem relações de tipo "has-a" - assim, a classe tem muitas partes, mas é algo mais do que um conjunto de classes. Um avião é composto por partes, mas sozinho é algo mais - tem capacidades adicionais, como o voo. Continuando com este exemplo, as partes individuais podem ocorrer em diferentes variantes especializadas e, nesse caso, é uma boa altura para utilizar a herança.

Tanto a herança como a composição são apenas ferramentas que os programadores têm à sua disposição, pelo que a escolha da ferramenta correta para um determinado problema requer experiência. Por isso, vamos praticar e aprender com os nossos erros 🙂

Artigos relacionados

Ilustração de uma aplicação de cuidados de saúde para smartphone com um ícone de coração e um gráfico de saúde em ascensão, com o logótipo The Codest, representando soluções digitais de saúde e HealthTech.
Desenvolvimento de software

Softwares para o setor de saúde: Tipos, casos de uso

As ferramentas em que as organizações de cuidados de saúde confiam atualmente não se assemelham em nada às fichas de papel de há décadas atrás. O software de cuidados de saúde apoia agora os sistemas de saúde, os cuidados aos doentes e a prestação de cuidados de saúde modernos em...

OCODEST
Ilustração abstrata de um gráfico de barras em declínio com uma seta ascendente e uma moeda de ouro que simboliza a eficiência ou a poupança de custos. O logótipo The Codest aparece no canto superior esquerdo com o slogan "In Code We Trust" sobre um fundo cinzento claro
Desenvolvimento de software

Como dimensionar a sua equipa de desenvolvimento sem perder a qualidade do produto

Aumentar a sua equipa de desenvolvimento? Saiba como crescer sem sacrificar a qualidade do produto. Este guia cobre sinais de que é hora de escalar, estrutura da equipe, contratação, liderança e ferramentas - além de como o The Codest pode...

OCODEST
Desenvolvimento de software

Construir aplicações Web preparadas para o futuro: ideias da equipa de especialistas do The Codest

Descubra como o The Codest se destaca na criação de aplicações web escaláveis e interactivas com tecnologias de ponta, proporcionando experiências de utilizador perfeitas em todas as plataformas. Saiba como a nossa experiência impulsiona a transformação digital e o negócio...

OCODEST
Desenvolvimento de software

As 10 principais empresas de desenvolvimento de software sediadas na Letónia

Saiba mais sobre as principais empresas de desenvolvimento de software da Letónia e as suas soluções inovadoras no nosso último artigo. Descubra como estes líderes tecnológicos podem ajudar a elevar o seu negócio.

thecodest
Soluções para empresas e escalas

Fundamentos do desenvolvimento de software Java: Um Guia para Terceirizar com Sucesso

Explore este guia essencial sobre o desenvolvimento de software Java outsourcing com sucesso para aumentar a eficiência, aceder a conhecimentos especializados e impulsionar o sucesso do projeto com The Codest.

thecodest

Subscreva a nossa base de conhecimentos e mantenha-se atualizado sobre os conhecimentos do sector das TI.

    Sobre nós

    The Codest - Empresa internacional de desenvolvimento de software com centros tecnológicos na Polónia.

    Reino Unido - Sede

    • Office 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polónia - Pólos tecnológicos locais

    • Parque de escritórios Fabryczna, Aleja
      Pokoju 18, 31-564 Cracóvia
    • Embaixada do Cérebro, Konstruktorska
      11, 02-673 Varsóvia, Polónia

      The Codest

    • Início
    • Sobre nós
    • Serviços
    • Case Studies
    • Saber como
    • Carreiras
    • Dicionário

      Serviços

    • Aconselhamento
    • Desenvolvimento de software
    • Desenvolvimento backend
    • Desenvolvimento de front-end
    • Staff Augmentation
    • Programadores de back-end
    • Engenheiros de nuvem
    • Engenheiros de dados
    • Outros
    • Engenheiros de GQ

      Recursos

    • Factos e mitos sobre a cooperação com um parceiro externo de desenvolvimento de software
    • Dos EUA para a Europa: Porque é que as empresas americanas decidem mudar-se para a Europa?
    • Comparação dos centros de desenvolvimento da Tech Offshore: Tech Offshore Europa (Polónia), ASEAN (Filipinas), Eurásia (Turquia)
    • Quais são os principais desafios dos CTOs e dos CIOs?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Direitos de autor © 2026 por The Codest. Todos os direitos reservados.

    pt_PTPortuguese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek cs_CZCzech pt_PTPortuguese