Pessoal, bom dia, na verdade boa tarde.
Estamos no dia 7 de agosto de 2020.
Agora são 12h03.
Depois de uma pausa na gravação de vídeos,
em função de outras atividades que tomaram minha atenção,
retomamos para o grupo de slides 11 - parte B.
É um grupo de slides bastante sucinto.
Na verdade ele trás à memória nossa
a necessidade de utilizar listas desacopladas
lá no grupo de slides 11 - parte A.
Então a parte B mostra como melhorar os slides 11 - parte A,
conforme tinha sido discutido naquele grupo de slides.
Ess grupo de slides em questão
foi elaborado pelo Luan Carlos Klein,
com a minha supervisão, em 2019.
Muito bem.
Melhorando a solução apresentada na solução 11 - parte A, bem entendido.
Qual era o problema daquela solução?
Se você prestar atenção,
aqui a gente está utilizando listas encadeadas
criando as listas
via instanciação direta do template parametrizado com a classe visada.
A gente sabe que isso é imperfeito.
Por quê?
Porque quando a gente usa direto
a instanciação de uma classe template parametrizada no tocante das listas,
o que vai acontecer é que a gente vai utilizar a parte genérica da lista
entretanto as partes específicas da lista acabam ficando...
imbricadas, acabam ficando mescladas dentro da classe principal.
E nesse caso em particular não fica legal,
porque...
as listas, tudo que é tocante da lista, a luz da coesão e desacoplamento,
ela vai ter que ficar desacoplada da classe principal.
Então uma solução para resolver isso
é, justamente, evitar a instanciação direta de uma lista parametrizada com algo,
criando classes específicas para tratar as listas.
Inclusive vou dar uma ajeitada nesse código aqui.
Vejam aqui.
Então aqui eu tenho essas classes de lista,
por exemplo, tem o LAlunos que agora
não é mais uma lista parametrizada com Aluno
e sim uma classe explícita ListaAluno.
Se eu voltar aqui um pouquinho,
você percebe, justamente,
que na linha logo abaixo você vai ter o LAlunos
como lista parametrizada com Aluno.
E já no slide subsequente você essa modificação que eu estava citando,
que eu passo a ter uma classe ListaAluno específica.
Bom, qual o impacto disso?
O impacto disso já foi discutido em aulas anteriores,
vamos só lembrar aqui rapidamente.
Agora tudo o que é relativo a ListaAluno,
lista de apontamento de Aluno, vai estar nessa classe.
Inclusive o núcleo dessa classe vai ser uma lista parametrizada com Aluno.
Por quê?
Porque eu aproveito a parte genérica do template.
Entretanto a parte específica vai estar encapsulada aqui.
E assim também funciona com as demais listas,
por exemplo a lista de Departamentos, a LDepartamentos,
ela vai ter como núcleo uma lista parametrizada com Departamento, obviamente,
para aproveitar a parte genérica do template,
e as partes específicas com está ali enquadradas no âmbito dessa classe.
Justamente, o próximo slide trás como exemplo
aqui o próximo slide já,
a classe ListaDepartamento.
Olha a essência dela.
Ele chamou aqui de LTDepartamento, tudo bem,
que é uma lista parametrizada com Departamento.
Então o algoritmo de inclusão, naturalmente, vai utilizar
o algoritmo de inclusão desse cara aqui, porque é algo que permite você utilizar uma solução genérica.
A destruição que vai ter na destrutora,
a destruição que eu digo é a desalocação de memória que vai ter na destrutora,
ele vai utilizar o que vem da lista genérica.
Já coisas mais específicas que dependem do tipo, como as listagens,
então eu não tenho escapatória, tenho que fazer um algoritmo específico,
entretanto ele fica encapsulado dentro da classe ListaDepartamento.
Aqui ele resolveu colocar a destrutora como virtual.
Nesse caso era imperativo,
mas por que as pessoas as vezes colocam destrutora como virtual?
Aqui funciona o seguinte, se você estiver apontando para um objeto enquanto sua classe base,
imagine que você tem um Professor
e você está apontando para o Professor enquanto Pessoa,
se você fizer um delete daquele ponteiro de Pessoa, daquele pPessoa,
você vai fazer um delete daquele ponteiro de Pessoa,
mas aquele ponteiro de Pessoa, na prática ele aponta para um Professor.
Ele está enxergando uma parte Pessoa, mas ele é um Professor.
Se você tiver um virtual na destrutora da classe Pessoa,
e fizer um delete daquele apontamento de Pessoa,
hora que fizer o delete e for executar a destrutora e falar:
"Opa, não posso destruir só a parte Pessoa, tenho que destruir a parte Professor também."
Então a virtualidade da destrutora serve para isso.
Mesmo que já esteja apontando para a classe base via um ponteiro,
aliás apontando para um objeto via ponteiro
enxergando ele como classe base,
se você destruir, fazer um delete nele, e a destrutora for virtual,
ele consegue fazer uma destruição perfeita,
ele vai destruir não só a parte apontada, mas vai destruir tudo o que tem para baixo.
evitando lixo e corrupção de memória.
Então é por isso que se coloca destrutora como virtual.
Mas isso é só uma observação a parte.
Aqui o que interessa é o que está escrito ali:
Uma lista específica, que utiliza uma lista template,
e molda os métodos de acordo com a necessidade dessa lista.
Tudo o que é relativo a lista está na classe dada que é a ListaDepartamento.
Fazendo um bom equilíbrio entre o genérico e o específico.
Aqui inclusive tem as implementações.
A construtora, destrutora, setnome,
incluaDepartamento que, basicamente faz uns testes condicionantes,
que você pode ou não incluir na lista.
Uma vez que possa incluir na lista, ele vai pedir para o seu núcleo, que é o LTDepartamento,
volta aqui para insistir que LTDepartamento é uma lista parametrizada com Departamento,
ele vai chamar a função genérica incluaInfo.
Já a função listagem eu dependo de saber o tipo,
por isso eu vou fazer o que?
Eu vou criar um pElAux, que é um ponteiro de elemento parametrizado com Departamento,
Para que isso? Para navegar nos elementos da lista.
Tanto é que o pElAux aponta para o getPrimeiro.
Uma vez que eu esteja navegando nos elementos,
cada vez que eu encontro um elemento eu posso recuperar sua essência.
Que é o Departamento lá apontado.
Uma vez que eu encontrei o apontamento do Departamento que está dentro daquela lista,
gerenciado por um dado elemento,
eu posso imprimir suas informações, por exemplo o nome do Departamento,
mas também poderia imprimir as informações.
Isso aqui só para lembrar vocês que essa solução permite
um bom equilíbrio entre a parte genérica, a gente ta utilizando a parte genérica aqui,
inclusive fazendo alguns adendos específicos sobre inclusão,
mas ela é inclusão a ela mesma, usando o algoritmo genérico.
Já a parte que é dependente do tipo, eu estou usando um algoritmo específico,
utilizando alguns artifícios da parte genérica, mas ainda sim usando um algoritmo específico para a situação dada.
Aí a gente chega no último slide desse grupo de slides,
que é um conjunto de exercícios propostos.
Conjunto de dois elementos.
Está aqui o primeiro elemento.
Utilizando a solução apresenta, modifique as demais lista, fazendo com que cada grupo de objetos pertinentes
tenha sua própria lista, para tratar seus apontamentos,
a partir de classes com seus métodos de acordo para tal.
Particularmente, faça isso inclusive para lista de apontamentos pessoas.
Sim, esse grupo de slides 11, particularmente a parte A, o que ele tratou?
A parte A trouxe como elemento principal o polimorfismo.
Ora, eu queria que vocês tratassem o polimorfismo
não como um código imbricado misturado dentro da Principal, mas sim como um código específico,
bem coeso e desacoplado, dentro do âmbito de uma ListaPessoas,
cuja a essência vai ser o template lista parametrizar a classe Pessoa,
mas todo o momento que ocorre o polimorfismo é tratado o método dentro da classe ListaPessoa.
Ainda temos o segundo tópico do exercício aqui, o segundo elemento do exercício que é o seguinte:
Além da classe principal, faça com que as outras classes que têm listas,
como departamento que tem uma lista de disciplinas,
também utilizem essa solução coesa e desacoplada proposta pelo Luan para a gente,
a luz do que a gente já tinha discutido antes.
Pessoal, então com isso nós retomamos nossas aulas gravadas.
Eu estou finalizando essa aula aqui agora.
Nos vemos na próxima aula que a gente ainda tem alguns conteúdos par ver.
Os principais elementos da disciplina, pelo menos os mais peculiares,
se eu me recordo já foram mencionados.
Ainda sim tem um conjunto de outros slides, de outros conteúdos dos grupos de slides,
que também são interessante e que serão, naturalmente, tratados nas aulas que vou gravar, espero que brevemente.
Bons estudos e até breve.