ESTE MATERIAL PRESSUPÕE QUE VOCÊ JÁ CONHEÇA UM POUCO DE PROGRAMAÇÃO EM JAVASCRIPT COM P5
QUE SAIBA O QUE SÃO AS FUNÇÕES DO P5, VARIÁVEIS, LOOPS, ARRAYS, E QUE JÁ TENHA VISTO ALGUNS OBJETOS DO TIPO {} EM JAVASCRIPT
ATENÇÃO
PROGRAMAÇÃO ORIENTADA A
OBJETOS COM JAVASCRIPT (E P5)
DESENHANDO DOIS CARROS DE CORRIDA
COMEÇANDO BEM DO BÁSICO
PROGRAMAÇÃO ORIENTADA A
OBJETOS COM JAVASCRIPT (E P5)
DESENHANDO DOIS CARROS DE CORRIDA
COMEÇANDO BEM DO BÁSICO
Definimos aqui a posição inicial no eixo X para cada um dos dois carros
Aqui desenhamos o primeiro carro
Aqui desenhamos o segundo carro
Aqui movimentamos os dois carros
TRANSFORMANDO OS CARROS EM OBJETOS
PRIMEIRA ETAPA DE MELHORIA PARA
PROGRAMAÇÃO ORIENTADA A OBJETOS
Nesta versão, os carros passam a ser objetos (carroA e carroB), e suas propriedades de posição inicial no eixo X, velocidade, e nome, passam a fazer parte do próprio objeto
Aos desenhar os carros, passamos a usar a variável de posição que está guardada dentro de cada objeto
O nome do carro também está guardado dentro do próprio objeto
Cada carro guarda suas próprias propriedades e dados
O movimento é acrescido pela velocidade definida em cada objeto
OS RESULTADOS FORAM IGUAIS
MAS OS DADOS AGORA ESTÃO MAIS LEGÍVEIS E PODEM SER MAIS FACILMENTE ALTERADOS, SEM QUE SE FAÇA GRANDES MODIFICAÇÕES NA LÓGICA DO PROGRAMA
DEFININDO DOIS OBJETOS AUTÔNOMOS
ELES PRÓPRIOS CONTROLAM SUAS AÇÕES
Incluímos uma função aos carros, que ficará responsável por resolver a sua movimentação, para que cada carro resolva suas próprias questões
Usamos this.propriedade para informar que se trata da variável do próprio objeto, e não de uma variável global, ou a propriedade de um outro objeto
O segundo carro também recebe a mesma função
O movimento passa a ser acionado pela função anda() de cada objeto
OS RESULTADOS FORAM NOVAMENTE IGUAIS
MAS O CÓDIGO PARECE MAIS CENTRALIZADO NO OBJETO, QUE TAMBÉM RESOLVE SOZINHO AS AÇÕES QUE LHE SÃO NECESSÁRIAS
INCLUÍNDO AINDA MAIS AUTONOMIA
DEIXANDO QUE TUDO RELATIVO AO OBJETO SEJA RESOLVIDO POR ELE MESMO
Incluímos agora uma função desenha() que será responsável por desenhar o próprio carro na tela
A função desenha() utilizará os dados do próprio objeto para desenhá-lo
A função desenha() passa a ser acionada em cada objeto para fazê-los aparecerem na tela, assim como a função anda() processa seus movimentos
Repare como o código de draw() ficou muito mais simples e legível quando todas as ações e dados passaram para os próprios objetos
OS RESULTADOS PERMANECEM IGUAIS
MAS O CÓDIGO PARECE MAIS LEGÍVEL QUANDO AS AÇÕES SÃO APENAS ACIONADAS, E SEU PROCESSAMENTO É FEITO PELO PRÓPRIO OBJETO
TRAZENDO FLEXIBILIDADE
MAIS DADOS REGISTRADOS NOS OBJETOS PERMITIRÃO QUE ELES POSSAM SER FACILMENTE MODIFICADOS
Para dar mais flexibilidade e permitir a mudança da posição vertical, tiramos esse dado hard coded na função rect(), e incluímos uma nova propriedade y
A posição vertical de cada carro agora fica definida aqui, em uma variável
Modificamos a posição vertical e a posição inicial dos carros, sem nenhum esforço
O nome do carro ficará a 20 pixels acima do próprio carro, usando também y
A cor também ficará em uma variável cor, e não mais hard coded na função desenha()
A variável cor é aplicada aqui para desenhar o carro com a cor especificada
Essas mudanças permitiram que a função desenha() nos dois carros fossem absolutamente idênticas
Criamos uma variável para controlar se o carro deve andar, ou deve ficar parado
Esta variável estabelece a condição para que o processamento do movimento seja realizado, ou não
O segundo carro também possui todas as mesmas propriedades e funções
Criamos uma rotina aleatória que pode fazer o segundo carro desligar
OS RESULTADOS SÃO FÁCIES DE SEREM ALTERADOS
COM AS FUNÇÕES IDÊNTICAS E GENÉRICAS, O QUE MODIFICA O COMPORTAMENTO DOS CARROS SÃO OS SEUS PRÓPRIOS DADOS
TRAZENDO ALEATORIEDADE
INICIALIZANDO OS DADOS DE CADA CARRO COM VALORES DIFERENTES CADA VEZ QUE ELES RODAM
Criamos valores aleatórios para a velocidade do carro, a posição inicial em X, e a posição vertical
A velocidade é no mínimo 2, mas pode chegar a 7, a posição inicial em X varia entre 0 e 100, e a posição vertical varia entre 30 e 400
Também criamos valores aleatórios para os três canais de cor RGB, que variam entre 0 e 255 cada, produzindo cores aleatórias para os carros
As cores em canais separados são aplicadas assim pelo P5
O segundo carro recebe exatamente as mesmas características
Apenas os nomes continuam hard coded
A INICIALIZAÇÃO DO OBJETO FICOU AUTOMÁTICA
ISSO FAZ COM QUE O PRÓPRIO OBJETO GERE VALORES E DADOS INICIAIS PARA QUE POSSA OPERAR PRATICAMENTE SOZINHO, MESMO SE O PROGRAMADOR NÃO DEFINIR NENHUM VALOR ESPECÍFICO PARA ESTES DADOS
AUTOMATIZANDO A INICIALIZAÇÃO DOS OBJETOS
SE É PRATICAMENTE TUDO GERADO AUTOMATICAMENTE, POR QUE ISSO PRECISARIA SER CONSTRUÍDO UM A UM?
Primeiro criamos uma Array que guardará vários objetos de forma indexada
Depois definimos a quantidade de carros a serem gerados automaticamente
(isso será interessante no futuro)
Aqui começamos um loop para criar cada objeto carro dentro da Array
No lugar de carroA ou carroB, usaremos uma Array, e eles chamarão varioscarros[0] e varioscarros[1]
O nome do carro também será automatizado, incluíndo a própria variável do loop
Vamos automatizar o acionamento das funções desenha() e anda() em todos os carros, também através de um loop
Acionamos as funções nos referenciando aos carros através da Array varioscarros[]
Não podemos esquecer de mudar a referência para acionar uma eventual parada aqui também
Mas é aqui que está a grande vantagem em se fazer todo este esforço com programação orientada a objetos
Aumentamos o número de carros alterando apenas um valor
Como eles se comportam de forma autônoma, e são acionados por loops, todos irão ser criados e desenhados normalmente
AGORA ISSO PARECE MUITO ÚTIL
QUANTO TEMOS ALGUMA COISA QUE PRECISA SER MULTIPLICADA, E FUNCIONA DE FORMA AUTÔNOMA, O IDEAL É USAR PROGRAMAÇÃO ORIENTADA A OBJETOS
SIMPLIFICANDO O PROCESSO
USANDO "CLASSES" E "INSTÂNCIAS", ISTO É, CRIANDO UM MODELO E TIRANDO CÓPIAS DESTE MODELO
Podemos criar um objeto modelo, e tirar cópias independentes deste modelo original
Para isso, primeiro criamos o modelo como um objeto normal
Repare que por ser um modelo, não há como parametrizar o nome do objeto diretamente, como fizemos antes
Ele receberá um nome genérico inicialmente
Aqui temos uma mudança importante:
Como todos os carros serão uma cópia deste modelo, e o código dos carros, como era antes, gerava um valor aleatório para estes dados, ao tirarmos as cópias, todos virão com os mesmos valores gerados no modelo
É necessário uma função para substituir esses valores com novos dados aleatórios
Utilizamos um operador ... conhecido como Spread, para copiar todas as propriedades de carro como um novo objeto dentro de varioscarros[]
Aqui randomizamos todas as propriedades de cada carro com a função inicializa()
E aqui definimos qual é o nome de cada carro
APERFEIÇOANDO OBJETOS
UMA VEZ USANDO UM MODELO, AS MELHORIAS SERÃO DISTRIBUÍDAS PARA TODAS AS CÓPIAS AUTOMATICAMENTE
Criamos uma variável global para registrar quem será o carro que vencerá a corrida
Ao andar, se um carro ultrapassar os 600 pixels em X primeiro (não havendo nenhum outro registro em ganhador) ele registrará sua vitória
Repare que os próprios carros monitoram essa condição, e não há um código central que fica verificando quem é o ganhador
Como isso agora é parte do modelo (classe), todas as cópias (instâncias) receberão o aprimoramento
Se o carro for o ganhador, ele mesmo fará um registro na tela com seu nome
Quando passarem de 800 pixels em X, os carros desligam seus motores e param
REAPROVEITAMENTO
SE VOCÊ TIVER UM OBJETO BEM MODELADO, PODERÁ UTILIZÁ-LO EM DIVERSOS CÓDIGOS QUE CONSTRUIR
ELE SE COMPORTARÁ COMO UM COMPONENTE DA SUA PROGRAMAÇÃO
ELA É ÚTIL QUANDO TIVERMOS ELEMENTOS QUE SE MULTIPLICAM, MAS QUE POSSUEM AUTONOMIA E CARACTERÍSTICAS OU COMPORTAMENTOS INDIVIDUAIS
SE VOCÊ TIVER UM OBJETO BEM MODELADO, PODERÁ UTILIZÁ-LO EM DIVERSOS CÓDIGOS QUE CONSTRUIR
ELE SE COMPORTARÁ COMO UM COMPONENTE DA SUA PROGRAMAÇÃO
PROGRAMAÇÃO ORIENTADA A OBJETO É UM PARADIGMA DIFERENTE DE PROGRAMAÇÃO
QUANDO BEM USADA, ELA DEIXA SEU CÓDIGO MAIS LEGÍVEL E MAIS COMPREENSÍVEL
ELA PODE SIMPLIFICAR A CONSTRUÇÃO DE ALGUMAS COISAS, MAS PODE SER MUITO COMPLICADA PARA FAZER ALGO SIMPLES... VOCÊ PRECISA CONSIDERAR SE DEVE USÁ-LA
SERÁ COMUM ELA SER ARTICULADA ATRAVÉS DE ARRAYS COM MUITOS OBJETOS COPIADOS DO MODELO
COPYRIGHT © 2023
GUILHERME RANOYA
Code Tour
By Guilherme Ranoya
Code Tour
Codetour do processo de transformação de um código procedural (em javascript com P5) em Programação Orientada a Objetos
- 1,308