Programação Orientada a Objetos (POO) - Conteúdo da Aula

1. Explicação detalhada dos tópicos apresentados na aula

1.1 Paradigmas de programação: estruturado vs orientado a objetos

- Programação estruturada: organiza o código em blocos sequenciais de instruções com controle de fluxo através de estruturas de decisão (if) e repetição (for, while). O foco está no fluxo de execução e na modularização via procedimentos/funções. Exemplo simples: um programa que lê valores, processa e retorna resultados chamando funções para cada tarefa.

- Programação orientada a objetos (POO): organiza o software em objetos que encapsulam dados (estado) e comportamento (métodos). A comunicação entre partes do sistema ocorre por meio do envio de mensagens (chamadas a métodos) entre objetos. A ideia é modelar o domínio do problema de forma mais próxima ao mundo real.

Observação: na prática, muitas linguagens suportam ambos os paradigmas e permitem combinar técnicas, mas a POO enfatiza encapsulamento, modularização por classes e objetos, além de herança e polimorfismo.

1.2 Objeto

- Um objeto é uma entidade que representa algo do domínio do problema, reunindo dados (estado) e funções (comportamento) que atuam sobre esses dados. É a unidade básica da programação orientada a objetos.

Exemplo: um lápis pode ser considerado um objeto. Estado (atributos) pode ser: cor, marca, espessura; comportamento (métodos) pode ser: escrever, apontar. Interação com o objeto ocorre por meio de suas ações.

1.3 Classe

- Classe é o molde (blueprint) que descreve um conjunto de objetos semelhantes. Ela reúne atributos (estado) e métodos (comportamento) que definem como serão os objetos daquela família.

Diferença-chave: objeto é uma instância concreta da classe, já a classe é a abstração. Em termos simples, você define a classe para depois criar objetos (instâncias) dessa classe.

Exemplo: a classe Livro descreve atributos como título, autor, número de páginas; e métodos como abrir, fechar, imprimirResumo. Instâncias dessa classe seriam livros reais como Bíblia, dicionário, relatório.

1.4 Atributos e Métodos (Estado e comportamento)

- Atributos (ou propriedades) descrevem o estado de um objeto em determinado instante. Exemplo: para um carro, atributos podem ser cor, ano, velocidade, combustível.

- Métodos descrevem o comportamento que o objeto pode realizar. Exemplo: acelerar, frear, acender faróis de um carro.

Observação: a ideia de encapsulamento é que os atributos sejam protegidos e acessados/modificados apenas via métodos do próprio objeto, promovendo consistência do estado.

1.5 Encapsulamento e comunicação entre objetos

- Encapsulamento: esconder detalhes internos do objeto (dados) e expor apenas a interface pública (métodos) para interagir com ele.

- Comunicação entre objetos: objetos trocam mensagens acionando os métodos uns dos outros. Por exemplo, um objeto Pedido pode chamar o método calcularTotal() de um objeto Carrinho para obter o total.

1.6 Instanciação de classe e o uso de self (Python)

- Objeto é criado a partir de uma classe por meio da instanciação. Em Python, o método especial __init__ é chamado automaticamente ao criar a instância e recebe o objeto criado como referência via o parâmetro self.

- Exemplo prático (Point):

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def set_x(self, x):
        self.x = x

    def set_y(self, y):
        self.y = y

    def get(self):
        return (self.x, self.y)

    def move(self, dx, dy):
        self.x += dx
                self.y += dy

- Observação: o parâmetro self permite que o método acesse os atributos do objeto em criação e modifique seu estado.

1.7 Representação de objetos e o método __repr__

- O método __repr__ (ou equivalente) define como o objeto será representado, útil para imprimir o estado do objeto de forma legível.

- Exemplo de representação: def __repr__(self): return f"Point({self.x}, {self.y})"

1.8 Observações e dicas úteis

  • A organização em classes facilita modularização, reutilização e manutenção do código.
  • Ao criar classes, pense em encapsulamento: exponha apenas o necessário através de métodos públicos.
  • Use exemplos simples (como Livro, Point) para praticar a modelagem de atributos e métodos antes de lidar com cenários mais complexos.

2. Resumo de tópicos e sub-tópicos

  • 1. Paradigmas de programação
    • 1.1 Estruturado
      • Baseado em blocos sequenciais de instruções
      • Foco no fluxo de execução
    • 1.2 Orientado a objetos
      • Foco em objetos que encapsulam dados e comportamento
      • Comunicação entre objetos via chamadas de método
  • 2. Objeto
    • Definição: entidade que representa algo do domínio
    • Estado: atributos que descrevem o objeto
    • Comportamento: métodos que definem o que o objeto pode fazer
    • Exemplos: caneta, mouse, carro
  • 3. Classe
    • Definição: molde para criar objetos
    • Instância: objeto concreto criado a partir da classe
    • Relação classe x objeto
    • Exemplos: classe Livro; instâncias Bíblia, relatório, dicionário
  • 4. Atributos e Métodos
    • Atributos: estado do objeto
    • Métodos: comportamento do objeto
    • Encapsulamento: proteger o estado interno
  • 5. Instanciação e self (Python)
    • __init__ é chamado na criação da instância
    • Self refere-se ao objeto atual
    • Exemplo prático de Point
  • 6. Representação de objetos
    • __repr__ define como o objeto é impresso

Observação: os exemplos de Caneta, Carro, Livro ajudam a entender o mapeamento entre mundo real e abstração em código.

3. Mapa mental (Mermaid) - Programação Orientada a Objetos

mindmap root((Programação Orientada a Objetos)) Objeto Definição Atributos Métodos Classe Definição Instanciação Encapsulamento Ocultação de estado Interface Interação Mensagens / Chamada de métodos Exemplos Caneta Carro Livro Point Exemplos de Conceitos Estado Comportamento self

4. Questões de avaliação

Questão 1 (Média, 1,50 ponto): Qual afirmação descreve corretamente a diferença entre programação estruturada e orientação a objetos?

Resposta correta: B) Estruturada foca no fluxo de instruções com procedimentos; OO foca em objetos que encapsulam estado e comportamento.

Explicação: Na estruturação, o foco está na sequência de ações e na modularização por meio de funções. Na OO, o foco é modelo de domínio com objetos que reúnem dados (estado) e ações (métodos) e se comunicam via chamadas de métodos.

Questão 2 (Difícil, 2,50 pontos): O que significa encapsulamento em OO?

Resposta correta: A) Ocultar dados internos do objeto e expor apenas a interface pública.

Explicação: O encapsulamento protege o estado do objeto, controlando como os dados são acessados/modificados por meio de métodos públicos; isso reduz dependências e aumenta a consistência do estado.

Questão 3 (Difícil, 2,50 pontos): Qual é a função do método __init__ em Python?

Resposta correta: B) Inicializar uma nova instância da classe.

Explicação: __init__ é chamado automaticamente ao criar uma instância e normalmente inicializa atributos do objeto usando os parâmetros fornecidos (ou valores padrão).

Questão 4 (Extrema, 3,50 pontos): Ao instanciar um objeto de uma classe, qual a afirmação correta?

Resposta correta: B) A classe é o molde; a instância é o objeto concreto criado a partir dela.

Explicação: A classe define a estrutura (atributos e métodos). Ao instanciar, criamos um objeto real com valores específicos para os atributos.

Pontuação Total
0.00

Texto original

O texto original pode conter falhas de gramática ou de concordância, isso ocorre porque ele foi obtido por um processo de extração de texto automático.
Texto extraído do video Algoritmos e Programação de Computadores II - Programação Orientada a Objetos I

O LAPISO A OBEINVINOS, novamente, é nossa disciplina de algoritmos e programação de computadores 2 da ONVSP.
Essa é a nossa segunda semana, com a terceira videoaula.
Nesta semana, vamos aprender um conceito que é novo para vocês, que é a ideia de programação oriental do objeto.
Para vocês alunos da engenharia da computação, vocês vão ver mais detalhes, que está esse conteúdo numa outra disciplina mais específica para isso, e sendo que nesta semana, dessa disciplina que a gente está vendo agora, é mais para vocês ter uma visão geral para entender os conceitos mais importantes, que são os básicos desta nova paradigma, que é o paradigma da programação oriental do objeto.
Bom, então a gente vai ter duas videoaulas sobre esse assunto.
A primeira, a gente vai entender o que é clássico que é objeto, e daí na outra semana, na outra videoaula, a gente vai ver algumas outras coisas relacionadas.
Bom, então, pessoal, todo o programa, independente da complexidade, pode ser escrito com uma combinação de comandos, que vai envolver três estruturas principais, que são as estruturas de sequência, seleção e de repetição, que é exatamente o que a gente viu no Bimestre passado, com as estruturas IF, I, or For, que são estruturas de seleção e repetição, além das sequências.
E a gente pode utilizar funções para separar o programa em pequenas partes, que onde isso vai facilitar a modularização, reuso e manutenção de código.
Então vocês viram como que a gente define funções na linguagem Python, passagem de parâmetros, e aí, espero que vocês tenham entendido que os funções acabam facilitando bastante o desenvolvimento de programas, modularizando melhor o seu programa, podendo reutilizar aquela função em diferentes aplicações, e assim por diante.
E aí, a gente, então, está trabalhando até esse momento com a programação estruturada, onde a gente vai ter procedimentos que são implementados em blocos, e a comunicação entre esses procedimentos se dá pela passagem de parâmetros.
Procedimento que eu digo aqui seria no caso as funções, então as funções você tem a comunicação entre elas, sempre feita por meio da passagem de parâmetros de uma para outra.
E um programa estruturado, quando em execução, vai ser caracterizado pelo acionamento dessas funções, que já tarefas desses dessas funções vão ser manipular os dados dependendo do objetivo de cada função.
Já, pessoal, a programação orientada ao objeto é um pouco diferente, a gente vai ter o conceito de dados e procedimentos separados.
E tanto os dados como os procedimentos, como as funções, vão ser encapsuladas no único elemento que a gente vai chamar de objeto.
Então, um único objeto vai ser formado pelos dados que compõem esse objeto que caracterizam esse objeto, e também as funções que seria o comportamento desse objeto, o que ele faz, o que ele pode mudar, o que ele pode realizar.
E o estabelecimento da comunicação entre os objetos caracteriza a execução do seu programa, então você vai ter vários objetos ao longo do seu programa, e esses objetos vão se comunicar por meio do acionamento de funções de cada um desses objetos.
Então, o que é um objeto? O objeto é uma entidade que formaliza um modo pelo qual compreendemos algo no domínio do problema.
Então, você pode dizer que uma caneta é um objeto que um mouse é um objeto, que um teclado é um objeto.
Então, realmente seria o que? É uma entidade que você não vai formalizar algumas características deste entidade e você vai chamar aquilo de objeto.
Reflete a capacidade do sistema de guardar informações sobre esse elemento que você abstraiu, interagir com ele ou ambas as coisas.
Então, por exemplo, você tem uma caneta, o que essa caneta tem? Ela tem a cordela, você tem o formato, você tem a tampa, então quer dizer, a interação com essa caneta, se dá por meio da escrita, de você segurar essa caneta na determinada posição e assim por diante.
Então, o objeto é uma entidade mais próximo possível das entidades do mundo real.
Então, essa abstração que a gente faz dos objetos do mundo real, a gente vai levar isso para a computação para os nossos programas.
E a gente vai começar a modelar objetos no nosso programa tentando ser o mais próximo possível do mundo real.
E há um objeto sempre estão associados ao seu estado e o seu comportamento.
Então, no caso de uma caneta, por exemplo, você tem um estado que seria carga cheia, carga vazia, distampado, tampado.
E o seu comportamento que seria escrevendo ou não escrevendo, seria algo nessa linha.
Vamos ver um exemplo melhor.
Imagina que eu tenho um objeto carro.
O que esse carro tem de característica, que a gente chama de atributo? Então, a gente tem a corda desse carro, que nesse caso é vermelho, o ano 2012, velocidade 0, que eu damos por hora, combustível e tanol.
Então, são algumas características desse carro.
E a gente tem alguns métodos, por exemplo, método acelerar, frear, virar, acionar, farol, estar entre várias outras funções ou métodos que podem estar associados a esse objeto carro.
Então, a gente diz que os atributos de um objeto detalham as propriedades ou o estado desse objeto naquele momento.
Pode estar parado, pode estar andando o ano dele.
E os métodos definem o comportamento desse objeto.
Então, você que você pode fazer com esse objeto? Com um carro, você pode acelerar, você pode frear, você pode acender o farol, está? É o comportamento desse carro, desse objeto.
Bom, eu falei de objeto para vocês, mas existe um outro conceito que é bem mais importante também, que é o conceito de classe.
Uma classe, pessoal, descreve um conjunto de objetos semelhantes.
São os atributos e métodos que resumem as características correntes de vários objetos.
Então, para você definir, para você ter um objeto, é necessário você ter a classe inicialmente, porque a classe é quem vai modelar como que vai ser esse objeto.
E qual é a diferença entre classe e objeto? Então, o objeto constitui uma entidade concreta no tempo, com um tempo espaço de existência, enquanto que uma classe é simplesmente uma abstração.
Então, na prática, a gente define uma classe no nosso programa e depois a gente instancia essa classe criando o objeto.
Então, o objeto é uma instância da classe que a gente criou.
Olha então um exemplo aqui.
Eu tenho uma classe livro, que é algo genérico, que é uma abstração de livro, onde você vai definir algumas propriedades, por exemplo, cor, número de páginas, título, etc.
E você pode dar aí instanciar essa classe livro para diferentes livros que realmente existem.
Então, por exemplo, a Bíblia, um relatório, um dicionário, são todos os objetos da classe livro, ou em outras palavras, são instâncias daquela classe que a gente tem.
São coisas que realmente existem.
E aí cada um desses objetos vai ter suas próprias características que a gente definiu aqui em cima.
Então, por exemplo, número de páginas, a Bíblia vai ter um número de páginas, um relatório, vai ter um número de páginas, e o dicionário também vai ter um número de páginas.
Então, cada objeto vai ter o seu conjunto particular de atributos que estão definidos lá na classe.
Bom, até um momento, a gente já fez uso de objetos, mesmo vocês sem saberem.
Então, por exemplo, lá no Bíblia Extra Passado, a gente eu mostrei para vocês um exemplo de uso da classe Frexons para trabalhar com um número de fração.
Então, quando a gente fazia isso daqui, na verdade, Frexons é uma classe que está definida dentro deste módulo Frexons, e o fraque 1 é o objeto que a gente acabou de criar.
E esse objeto contém esses valores aqui, que é numerador e denominador 1 e 2.
Aqui, a gente está criando um outro objeto, chamado de fraque 2, que também tem numerador e denominador, só que com valores diferentes, em respeitivo para esse objeto, que seria 3 e 4.
Então, nesse exemplo, a gente tem a classe Frexons e os objetos fraque 1 e fraque 2, que são instâncias desta classe.
Vamos fazer um exemplo agora, pessoal, na prática de como a gente pode definir uma própria classe nossa, e também o seu respeitivo objeto, quer dizer, uma instância desta classe.
Então, a gente vai fazer um exemplo aqui, de uma classe chamada de Point, que tem.
.
.
Imagina que você tem lá um plano carquezeano, em 12 menções, X e Y, e você tem um ponto definido nesse plano que contém a coordenada X e a coordenada Y associada a esse tempo.
Então, os atributos desta classe vão ser X e Y, e um objeto qualquer que a gente vai instanciar depois, vai ter um valor de X e um valor de Y, lá instanciado, criado para esse objeto específico.
E qual é o comportamento desse objeto? O comportamento é definido pelas funções, pelos métodos, que, nesse caso, vai ser as funções 7x, 7y, get e move.
Então, a gente vai implementar estas funções, esses métodos na nossa classe Point.
Vamos lá.
Então, eu tenho aqui o meu interface, a minha ideia criado, com um arquivo.
py, que eu já é criado para mim, eu vou definir uma classe por meio da palavra chave class.
E aí, o nome desta classe Point, dois pontos, quando a gente dá enter, a gente já tem a identação, que eu vou colocar as coisas ali dentro dessa classe.
Um primeiro método que a gente vai definir, pessoal, é o método inite.
Esse método inite vai ser criado automaticamente para a gente, quando a gente instanciar esse objeto dessa classe Point.
Então, esse método inite, com o underscore antes e depois aqui, ele é chamado automaticamente, quando a gente instancia o objeto desta classe.
E, entre parentes, tem essa palavra chave self, que, por padrão da linguagem Python, a gente usa ela para referenciar o próprio objeto que está sendo criado desta classe.
Usando esse método self ponto um nome, a gente define uma tributo desta classe.
Então, por exemplo, self.
x, citando isso para um valor, que a gente vai passar aqui comparando também, significa que a gente está passando na criação deste objeto, está passando algumas informações para dentro dele.
Então, se eu coloco ali dentro do parentes, o x e o y, o usuário vai passar esses dois valores para dentro da dumeto do inite.
E, lá na criação deste objeto, os attributes x e y já vão ser guardados aqui para a gente correspondentes a este objeto que foi criado.
Eu posso também colocar um valor padrão aqui para x e y, para o caso do usuário, não quiser especificar esses valores inicialmente, então, no caso, x e y vão receber o valor zero.
Aí, a gente tem um método 7x.
Esse método 7x recebe o valor x que o usuário vai passar comparando.
E, lá dentro, a gente pode fazer a atualização do attribute x, que é o attribute deste objeto para o novo valor que o usuário está passando aqui como parâmetro.
E, a mesma coisa, para o 7y.
Reparem que, em cada função dessa, que eu crio, a minha própria ideia já cria o self aqui com um primeiro parâmetro.
O que é esse primeiro parâmetro? Esse primeiro parâmetro, pessoal, é quando a gente faz algo assim.
Então, aqui, a gente vou criar este objeto, vou chamar de p, p, está aqui, a instânciação desta classe, estou criando um objeto p.
Se eu fizer, por exemplo, p.
7x, recebe, por exemplo, 5, esse self aqui, pessoal, ele está refrenciando o próprio objeto que eu acabei de criar.
Que, no caso, é o pezinho que está aqui.
Então, quando a gente faz p.
e o nome do método, esse objeto, antes do ponto aqui, p, o p, vai ser o próprio objeto que está sendo refrenciado por esse primeiro parâmetro da definição da função.
Então, por padrão, a gente usa a palavra chave self para refrenciar o próprio objeto e, aí, com isso, eu tenho acesso a os meus attributes que foram criados lá em cima na instânciação daquele objeto lá dentro do método em it.
Então, eu citei aqui, eu creio as funções 7x e 7y, posso definir mais a função get, então, função get, que ela vai me retornar, ela vai me retornar o self.
x e o self.
y caso, o usuário queira, recebe esses valores lá fora, da definição dessa classe aí.
E o método move, eu posso passar aqui valores para x e y e fazer atualização deles aqui também.
Então, 7x, aqui eu posso fazer, por exemplo, um ofset, um ofset de x e um ofset de y.
Então, o self.
x vai receber, mais igual, vai receber ele mesmo, mais o ofset de x e o self de y vai receber o ele mesmo, mais o ofset de y.
Beleza? Então, olha só, essa daqui foi a definição da nossa classe e eu posso tirar isso aqui por enquanto.
Vou rodar, então, eu coloquei na memória já essa classe, ela já está definida na memória do meu interpretador e eu posso vir aqui criar o objeto aqui no meu interpretador.
Aqui, eu crio esse objeto, posso pegar esse objeto p.
Quando eu faço isso, ele me retorna uma representação padrão desse objeto que é nesse formato que está aqui.
Se você quiser alterar isso na definição da atua classe, você pode implementar esse método, repre, que está aqui.
Esse método aqui, pessoal, repre, ele é o mesmo do específico onde você pode retornar uma string que vai ser uma representação do teu objeto.
Tá? Self.
x, mais vírgula, mais STR, de self.
y, mais, ou tá? Fecha aparentes.
Então, isso aqui é uma representação onde eu vou, só quero imprimir esse objeto, eu vou imprimir esse objeto com os valores de x e y entre parênteses, separados por vírgula.
Então, vamos ver como isso vai se comportar lá na nossa interpretador.
Então, eu defini novamente aqui no meu interpretador, esta nova versão dessa classe, vou criar novamente esse objeto e agora eu vou chamar o p.
Então, reparem que agora ele está usando esta representação aqui, da que eu defini nessa função, para imprimir o conteúdo deste objeto.
Tá bom? Se eu quiser criar um novo objeto, que eu faço, mesma forma, nesse que eu vou colocar valores para x e y com 3 e 4.
Agora, eu consigo imprimir o que, então, ele tem os valores 3 e 4.
E o p reparem que ele não mudou, ele continua com 0,0.
Então, cada objeto vai ter os seus respectivos valores, de atributos, onde esses atributos estão definidos aqui na minha classe.
Beleza? E se você quiser rodar alguma dessas funções, você pode fazer.
Então, por exemplo, supongo que eu queira fazer com que p, se move para 3 pontos à direita, e menos 5 pontos abaixo, estão a coordenada x e coordenada y.
E aí, eu vou agora imprimir o p.
novamente, ele setou o x y para esses oficets que eu tinha aqui passado como argumentos da função move.
Beleza, gente? Então, essa foi a nossa vide-primeira-videola sobre programação orientado objetos.
Na segunda vide-ala, a gente vai aprender um pouquinho mais de conceitos relacionados a esse assunto.
Então, obrigado, pessoal, pela atenção de vocês.
Espero que vocês possam ter entendido um pouco sobre esse paradigma.
E a gente se vê na próxima vide-ala.
Obrigado e até lá!