```{thebe-init}
---
thebe: true
---

Programação Orientada a Objetos (POO) - exemplo em Engenharia Civil#

Introdução à POO#

A Programação Orientada a Objetos (POO) é um paradigma de programação que organiza o software em “objetos”, em vez de procedimentos ou funções. Cada objeto pode ser visto como uma representação de um conceito do mundo real, com suas propriedades (atributos) e comportamentos (métodos). A POO ajuda a modelar sistemas de forma mais modular e reutilizável.

Conceitos principais da POO:#

  • Classe: Um molde ou planta de um objeto.

  • Objeto: Uma instância de uma classe.

  • Atributos: As características ou propriedades de um objeto.

  • Métodos: As ações ou comportamentos que um objeto pode realizar.

  • Encapsulamento: O conceito de ocultar detalhes internos e mostrar apenas a interface necessária.

  • Herança: Permite que uma classe herde atributos e métodos de outra.

  • Polimorfismo: A habilidade de usar o mesmo nome de método para diferentes comportamentos.

Exemplo Prático: Modelo de Estruturas para Engenharia Civil#

Vamos começar com um exemplo simples de modelagem de estruturas de concreto usando POO.

Passo 1: Definir a classe Estrutura#

A primeira coisa que fazemos é criar uma classe que representa a estrutura. Vamos definir alguns atributos básicos como altura, largura e tipo de material da estrutura.

bloco.png

class Estrutura:
    def __init__(self, altura, largura, material):
        # Atributos da classe (propriedades)
        self.altura = altura
        self.largura = largura
        self.material = material

    def calcular_area(self):
        # Método para calcular a área da base da estrutura
        return self.altura * self.largura

    def descricao(self):
        # Método para fornecer uma descrição da estrutura
        return f"Esta estrutura tem {self.altura} metros de altura e {self.largura} metros de largura, construída com {self.material}."

Passo 2: Criar Objetos da Classe Estrutura#

Agora que temos a classe Estrutura, podemos criar objetos que representem diferentes tipos de estruturas.

# Criando objetos (instâncias) da classe Estrutura
estrutura1 = Estrutura(10, 5, "concreto")
estrutura2 = Estrutura(15, 8, "aço")
# Usando os métodos da classe
print(estrutura1.descricao())
print(f"Área da estrutura 1: {estrutura1.calcular_area()} m²")

print(estrutura2.descricao())
print(f"Área da estrutura 2: {estrutura2.calcular_area()} m²")

Passo 3: Herança - Classe Ponte#

Agora, vamos mostrar como a herança pode ser usada. Suponha que precisamos de uma classe Ponte que herda da classe Estrutura, mas com atributos adicionais, como o tipo de fundação.

ssa-itaparica.jpg

class Ponte(Estrutura):
    def __init__(self, altura, largura, material, tipo_fundacao):
        # Chamando o construtor da classe pai (Estrutura)
        super().__init__(altura, largura, material)
        self.tipo_fundacao = tipo_fundacao

    def descricao(self):
        # Método para fornecer uma descrição detalhada da ponte
        descricao_base = super().descricao()
        return f"{descricao_base} Tipo de fundação: {self.tipo_fundacao}."

Passo 4: Criando Objetos da Classe Ponte#

Agora, criamos uma ponte e vemos como a herança funciona.

# Criando objetos da classe Ponte
ponte1 = Ponte(20, 10, "concreto", "fundação profunda")
ponte2 = Ponte(30, 12, "aço", "fundação rasa")

# Usando os métodos da classe Ponte
print(ponte1.descricao())
print(f"Área da ponte 1: {ponte1.calcular_area()} m²")

print(ponte2.descricao())
print(f"Área da ponte 2: {ponte2.calcular_area()} m²")

Passo 5: Polimorfismo - Métodos com o mesmo nome#

Podemos ter métodos com o mesmo nome, mas que se comportam de maneira diferente em diferentes classes. No exemplo abaixo, vamos modificar o método calcular_area para que ele funcione de maneira diferente para Estrutura e Ponte.

class Estrutura:
    def __init__(self, altura, largura, material):
        self.altura = altura
        self.largura = largura
        self.material = material

    def calcular_area(self):
        return self.altura * self.largura

class Ponte(Estrutura):
    def __init__(self, altura, largura, material, tipo_fundacao):
        super().__init__(altura, largura, material)
        self.tipo_fundacao = tipo_fundacao

    def calcular_area(self):
        # Suponha que a área da ponte é calculada de maneira diferente
        return self.altura * self.largura * 1.2  # Ajuste para ponte com fundação

# Criando objetos
estrutura1 = Estrutura(10, 5, "concreto")
ponte1 = Ponte(20, 10, "concreto", "fundação profunda")

# Chamando o método 'calcular_area' para ambos os tipos
print(f"Área da estrutura: {estrutura1.calcular_area()} m²")
print(f"Área da ponte: {ponte1.calcular_area()} m²")

Resumo dos Conceitos#

  • Classes e Objetos: A classe é um modelo, e o objeto é uma instância dessa classe.

  • Herança: Uma classe pode herdar atributos e métodos de outra classe.

  • Polimorfismo: Métodos com o mesmo nome podem se comportar de maneira diferente, dependendo da classe.

Aplicações na Engenharia Civil#

A POO pode ser usada para modelar sistemas de construção, como:

  • Projetos de estruturas (prédios, pontes, etc.)

  • Cálculos de resistência de materiais

  • Análise de estruturas (vigas, pilares, etc.)

  • Sistemas de controle de obras

Com o tempo, você pode criar bibliotecas mais complexas, com classes para diferentes tipos de materiais, fundações, e métodos de cálculo específicos, tudo modelado de maneira modular e reutilizável.