Programação Orientada a Objetos (POO) - Visão Geral

1) Conteúdo teórico abordado na aula

Nesta aula, apresentamos a Programação Orientada a Objeto (POO) como um paradigma de programação que organiza software em objetos que encapsulam dados e comportamentos. Diferente da programação estruturada, onde o software é construído a partir de procedimentos que interagem via parâmetros, na POO a comunicação ocorre entre objetos através de mensagens (invocação de métodos).

Definição de Objeto

  • Um objeto é uma entidade que representa algo do mundo real ou conceitual, com estado e comportamento. Ex.: uma caneta, um mouse, um carro.
  • Estado (dados) -> atributos (ou propriedades) que descrevem o objeto no momento.
  • Comportamento -> métodos (funções) que descrevem o que o objeto pode fazer ou como ele pode reagir a eventos.

Definição de Classe

  • A classe é o molde ou especificação que descreve um conjunto de objetos com as mesmas características (atributos) e comportamentos (métodos).
  • Objeto é uma instância concreta de uma classe. Ex.: classe Livro pode ter instâncias Bíblia, Dicionário, Relatório, cada uma com seus atributos específicos.

Atributos vs Métodos

  • Atributos: representam o estado de um objeto. Ex.: carro: cor, ano, velocidade, combustível.
  • Métodos: representam o comportamento do objeto. Ex.: acelerar, frear, ligar farol.

Encapsulamento

Encapsulamento é o princípio de ocultar o estado interno de um objeto e expor apenas o que é necessário através de uma interface pública (métodos). Isso reduz o acoplamento e aumenta a manutenção do código.

Instância vs Classe

  • Classe: descrição abstrata de um conjunto de objetos (o molde).
  • Instância/Objeto: é uma ocorrência concreta criada a partir de uma classe, existente em tempo de execução, com valores próprios para seus atributos.

Exemplos práticos

  • Exemplo de classe Livro: atributos como cor, páginas, título; métodos como get, set, imprimir.
  • Exemplo de código com Point (classe Point) em Python (descritos na aula):
    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
    
    O objetivo é mostrar a criação de atributos (self.x, self.y) e métodos (get, move, etc.) e como a invocação p.move(3, -5) altera o estado do objeto p.

Observações úteis

  • Em Python, o primeiro argumento de qualquer método de uma classe é sempre o self, que se refere ao objeto atual.
  • Para representar um objeto, o Python usa a expressão p = Point(…); depois, p.get() acessa o estado de p via seus atributos.
  • O método repr (ou __repr__) pode ser utilizado para definir como o objeto é impresso, útil para debug e visualização de estados.

Observação prática

Em geral, ao modelar um domínio, comece definindo as classes que representam entidades-chave, liste seus atributos (estado) e seus métodos (comportamento), e pense na comunicação entre objetos por meio de chamadas de métodos, mantendo o encapsulamento para manter a consistência do estado.

2) Resumo por tópico e sub-tópico

1. Conceitos básicos da POO

  • Objeto: unidade que combina estado e comportamento; pode representar algo do mundo real ou conceitual.
  • Atributos: características que definem o estado de um objeto (ex.: cor, ano, velocidade).
  • Métodos: ações que um objeto pode realizar (ex.: acelerar, frear, escrever).
  • Classe: molde ou modelo que descreve um conjunto de objetos com atributos e métodos comuns.
  • Instância: objeto concreto criado a partir de uma classe.

2. Diferença entre classe e objeto

  • Classe é a abstração; objeto é a implementação concreta no tempo/espaço.
  • Objeto possui estado (valores dos atributos) distintos entre diferentes instâncias da mesma classe.
  • Classe define a estrutura, objeto realiza as ações com base nessa estrutura.

3. Atributos e Métodos

  • Atributos descrevem o estado de um objeto (ex.: cor, ano, posição).
  • Métodos descrevem o comportamento/ações que o objeto pode executar (ex.: acelerar, obter posição).

4. Encapsulamento

  • Oculta o estado interno e expõe uma interface pública segura (métodos) para interação.
  • Reduz acoplamento e facilita manutenção e reutilização do código.

5. Exemplos práticos usados na aula

  • Carro: atributos (cor, ano, velocidade, combustível); métodos (acelerar, frear, acender farol).
  • Livro: atributos (cor, páginas, título); exemplos de classe Livro com instâncias Bíblia, Dicionário, Relatório.
  • Point (exemplo em Python): atributo x, y; métodos __init__, move, get, 7x, 7y (nome dos métodos fictícios para demonstrar abstração).

6. Observação sobre a prática com Python

  • O método __init__ é o construtor da classe e é executado na criação do objeto.
  • O uso de self permite acessar atributos e métodos do objeto atual.
  • As instâncias são criadas pela expressão objeto = Classe(...).

3) Mapa Mental (Mermaid) - Principais tópicos

mindmap root((POO - Programação Orientada a Objetos)) Conceitos Objeto Definição Atributos e Métodos Classe Definição Instância Encapsulamento Comunicação entre objetos Estruturas de exemplo Carro Atributos: cor, ano, velocidade, combustível Métodos: acelerar, frear, virar, acenderFarol Livro Atributos: cor, paginas, titulo Métodos: get, set Exemplo de código Point Atributos: x, y Métodos: __init__, move, get Observações Instanciação Representação de objetos

Questões de múltipla escolha sobre o conteúdo

1) Qual afirmação descreve corretamente a relação entre classe e objeto?
1,50 Médio

Resposta correta: C) O objeto é uma instância de uma classe que possui estado e comportamento.

Observação: A classe define o modelo (atributos e métodos); o objeto concreto criado a partir desse modelo possui valores específicos para os atributos (estado) e pode executar os métodos (comportamento).

2) Qual é o papel do encapsulamento na Programação Orientada a Objetos?
2,50 Difícil

Resposta correta: B) Oculta detalhes internos e expõe apenas a interface pública, reduzindo acoplamento.

Explicação: Encapsulamento protege o estado do objeto, expondo apenas o necessário através de métodos públicos (get/set ou operações), o que facilita a manutenção e o uso seguro do objeto.

3) Considere uma classe Carro com atributos: cor, ano, velocidade; métodos: acelerar() e frear(). Se a chamada acelerar(10) for executada, o que ocorre?
2,50 Difícil

Resposta correta: A) A velocidade é incrementada em 10 (velocidade += 10).

Explicação: O método acelerar deve alterar o estado do objeto, atualizando o atributo velocidade conforme o parâmetro fornecido.

4) Sobre instância vs classe, qual afirmação é correta?
3,50 Extrema

Resposta correta: C) A instância é um objeto concreto com estado; a classe é a abstração que o descreve.

Explicação: A classe define estrutura e comportamento; a instância é a realização concreta dessa classe, com seus próprios valores de 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á!