·
Análise e Desenvolvimento de Sistemas ·
Introdução à Lógica e Programação
Send your question to AI and receive an answer instantly
Recommended for you
152
Lógica de Programação - Aula 08 - Estruturas de Dados em Python
Introdução à Lógica e Programação
UMG
4
Modelagem da Solução e Implementação das Classes Fundamentais
Introdução à Lógica e Programação
UMG
5
uma Aplicação da Lógica Proposicional Portas Lógicas
Introdução à Lógica e Programação
UMG
61
Aula 1 - Lógica Proposicional - Matemática Aplicada à Computação
Introdução à Lógica e Programação
UMG
77
Lógica Proposicional - Propriedades e Quantificadores - Matemática Aplicada
Introdução à Lógica e Programação
UMG
75
Aula 06 Lógica e Programação - Repetição com While em Python
Introdução à Lógica e Programação
UMG
6
Criar Código em Python
Introdução à Lógica e Programação
UMG
6
Lista de Exercícios - Lógica de Programação em Java
Introdução à Lógica e Programação
IFPE
1
Lista de Exercícios Java: Calculo de A e Soma de Indices de Letras A
Introdução à Lógica e Programação
IFPE
13
Tipos de Pessoas e Interacoes na Universidade - Guia Completo
Introdução à Lógica e Programação
SENAC
Preview text
Programação Orientada a Objetos Prof Bernardo Copstein Prof Júlio Pereira Machado O que você vai aprender nessa aula Nesta aula o objetivo é trabalharmos o conceito de polimorfismo estrutural Juntamente com os conceitos de herança e polimorfismo por herança formam a base do paradigma de Programação Orientada a Objetos Este e outros conceitos adicionais estão organizados em 5 vídeos Polimorfismo estrutural Módulos Tratamento de exceções Arquivos Exercício geral O que você vai precisar para acompanhar essa aula Bibliografia Livros sobre JavaScript Ambiente de programação Nodejs Npm Visual Studio Code Opcionalmente você pode usar um ambiente online httpsreplit httpsstackblitzcom Consulte o material complementar Polimorfismo estrutural Interfaces polimorfismo estrutural Caracterizando grupos de entidades É comum que uma certa categoria de entidades se caracterize por ter determinadas propriedades ou comportamentos Motoristas precisam ter um número de habilitação válido Engenheiros caracterizamse por um número de CREA e uma lista de habilitações Por vezes estas características não definem a entidade por inteiro somente a associa a um subgrupo Uma Pessoa pode ser um Motorista e um Engenheiro ou só Motorista ou só Engenheiro Interfaces 1 Uma empresa trabalha com diversos entregáveis coisas que ela fornece Os entregáveis podem ser diferentes tipos de produtos ou serviços Alguns produtos e serviços pagam impostos são taxáveis Alguns produtos eu posso mandar entregar pelo correio Alguns serviços são isentos Interfaces 2 Servico é um tipo de Entregavel relação de herança e atende a um contrato interface que define os entregáveis dos quais podese cobrar impostos Taxavel posso ter outros servicos que são isentos de impostos Produto é um tipo de Entregavel que atende a dois contratos interfaces Transportavel e Taxavel posso ter outros produtos que são isentos de impostos eou que não posso entregar pelo correio Interfaces 3 Note que a relação de herança é hierárquica já a relação das classes com as interfaces não Uma interface apenas define propriedades que um objeto deve possuir de maneira a atender determinado contrato Uma interface não implica em herdar nada Se a classe possui aqueles atributos então ela atende ao contrato senão não Definindo uma interface typedefTransportavel fragilboolean valorFretenumber let p new ProdutoUva850 validatepTransportavel A definição da interface será estrutural Define que elementos da estrutura de um objeto o identificam como aderente a determinado contrato ou categoria Em JavaScript a interface será definida com o auxilio da biblioteca bycontract Podese verificar se uma determinada instancia implementa a mesma estrutura que foi definida ou seja se implementa o contrato interface Vai verificar se o objeto referenciado por obj possui as propriedades frágil e valorFrete Explorando o princípio da substituição Se posso descrever uma entidade como atendendo a vários contratos posso explorar o princípio da substituição para trabalhar com classes que não pertencem a um mesmo ramo de uma hierarquia de classes de forma padrão Exemplo function exibeFreteentregavel validateentregavelTransportavel consolelogDescricao entregaveldescricao Frete entregavelvalorFretetoFixed2 let p new ProdutoBanana1050 let s new Servico104Consultoria financeira200 exibeFretep exibeFretes Gera uma exceção Embora pertença a mesma hierarquia de Entregavel não implementa Transportavel Explorando polimorfismo estrutural Da mesma forma que foi possível explorar o princípio da substituição é possível criar funções que exploram polimorfismo estrutural sobre coleções de elementos que implementam um determinado contrato Exemplo function listaTaxaveistaxaveis validatetaxaveisArrayEntregavel validatetaxaveisArrayTaxavel forlet t of taxaveis consolelogDescricao tdescricao imposto tvalorImposto let ps pspushnew ProdutoBanana1050 pspushnew Servico104Consultoria financeira200 pspushnew ServicoVoluntario202Aulas vulneráveisJorge pspushnew ProdutoUva830 pspushnew Servico105Consultoria TI300 listaTaxaveisps Garante que todos os elementos do arranjo são derivados de Entregavel e implementam a interface Taxavel Gera uma exceção Verificando a aderência a outros contratos No exemplo ao lado exploramos garantimos que todos são Entregável e Taxavel Mas sabemos que alguns são Transportavel e para esses gostaríamos de exibir o valor do frete Como testar essa condição function listaTaxaveistaxaveis validatetaxaveisArrayEntregavel validatetaxaveisArrayTaxavel forlet t of taxaveis let aux Descricao tdescricao aux imposto tvalorImpostotoFixed2 SE aux FOR transportável aux valor transporte tvalorFrete consolelogaux Verificando a aderência a outros contratos Em JavaScript teremos de criar uma função específica para este fim explorando o operador in O operador in nos permite verificar se uma instancia possui uma determinada propriedade A função ao lado retorna true se o objeto informado for Transportavel Interface transportavel typedefTransportavel fragilboolean valorFretenumber function isTransportavelobj return fragil in obj valorFrete in obj Verificando a aderência a outros contratos Observe como fica a função listaTaxaveis usando a função auxiliar isTransportavel Na medida que isTransportavel nos garante que a instancia t é Transportavel podemos chamar as propriedades com segurança function listaTaxaveistaxaveis validatetaxaveisArrayEntregavel validatetaxaveisArrayTaxavel forlet t of taxaveis let aux Descricao tdescricao aux imposto tvalorImpostotoFixed2 if isTransportavelt aux fragil tfragil aux valor frete R tvalorFrete consolelogaux Resumindo Podemos definir contratos que as classes podem implementar ou não em uma relação não hierárquica Os contratos são definidos com auxílio de byContract e de uma função auxiliar Podemos explorar polimorfismo na herança e polimorfismo estrutural conforme for mais adequado Interface taxável typedefTaxavel aliquotanumber function isTaxavelobj return valorImposto in obj Dinâmica D1 Considerando o diagrama de classes ao lado implemente o que se pede a Uma função que recebe uma lista de Taxavel por parâmetro e retorne quantos são Produtos quantos são Servico e quantos são Veiculo b Uma função que recebe uma lista de Taxavel por parâmetro e imprime o valor médio do imposto dos veículos c Uma função que recebe uma lista de Entregavel por parâmetro e retorna quantos são produtos transportáveis d Uma função que recebe uma lista de Transportavel por parâmetro e imprime o total a ser gasto com o frete dos produtos Resumo do que vimos até agora O que são interfaces Como declarar interfaces Como explorar o princípio da substituição com interfaces Como explorar polimorfismo estrutural com interfaces Explorando Módulos A evolução dos módulos em JavaScript O padrão ECMAScript Relembrando o conteúdo do vídeo anterior O que são interfaces Como declarar interfaces Como explorar o princípio da substituição com interfaces Como explorar polimorfismo estrutural com interfaces Formatos de código em JavaScript JavaScript suporta uma variedade de tipos de formatos de código A versão ES6 introduziu o conceito de módulo mas os formatos de código que vieram antes ainda persistem Scripts são fragmentos de código que executam em escopo global São os precursores dos módulos CommonJS é um formato de módulo que é usado principalmente em servidores com Nodejs Módulos AMD é um formato de módulos muito usado em browsers ECMAScript é o formato previsto a partir do ES6 Ele se sobrepõe a todos os outros e é o que deve ser adotado a partir de então Visão geral dos formatos de código Tipo Onde executa Extensão Script Navegador js CommonJS Servidor js e cjs AMD Navegador js ECMAScript Navegador e Servidor js e mjs Para que módulos Situação problema Imagine que alguém criou um conjunto de funções em JavaScript para trabalhar com previsão do tempo Entre as muitas funções oferecidas estão temperaturaMediaperiodo maximosMinimosperíodo Outra pessoa criou um conjunto de funções para lidar com temperaturas de um forno de um processo industrial Entre as muitas funções oferecidas estão temperaturaMediaforno maximosMinimosforno Se quisermos aproveitar estes dois conjuntos de funções no mesmo sistema teremos problemas de colisão de nomes Pior mesmo que só usemos um dos conjuntos teremos de evitar de usar no nosso programa os mesmos nomes de função que foram usados nos conjuntos que vamos aproveitar Por fim como estes conjuntos serão disponibilizados para serem incorporados no nosso programa Módulos contexto Módulos nos permitem definir contexto Os recursos definidos dentro de um módulo ficam encapsulados dentro dele e associados ao nome do módulo Apenas os recursos que queremos que sejam visíveis do ponto de vista externo ficam visíveis Mesmo os recursos visíveis externamente tem seu identificador associado ao identificador do módulo evitando a colisão de nomes Módulos contexto exemplo Modulo Clima Temperaturas function carregaDoArquivo export function inicializa export function temperaturaMedia function eliminaDesvios outras funções Programa Principal Import Clima Climainicializa consolelogClimatemperaturaMedia As variáveis do módulo são visíveis apenas no seu contexto local Apenas o que é marcado para exportação fica visível para o programa O nome do módulo se incorpora ao nome das variáveis e métodos para evitar a mistura de identificadores Antes de módulos apenas scripts Antes do ES6 JavaScript tinha apenas scripts não módulos script srcothermodule1jsscript script srcothermodule2jsscript script srcmymodulejsscript Simular módulos com scripts tem vários problemas A noção de contexto é simulada por importação através de variáveis globais o que traz um grande risco para colisão de nomes As dependências entre os módulos não são declaradas É necessário carregar os módulos necessários junto com os módulos dos quais os módulos dependem E tudo isso na ordem certa CommonJS Projetado para servidores Os módulos são carregados de forma síncrona A sintaxe é compacta Exemplo var importedFunc1 requireothermodule1jsimportedFunc1 var importedFunc2 requireothermodule2jsimportedFunc2 Body function internalFunc function exportedFunc importedFunc1 importedFunc2 internalFunc Exports moduleexports exportedFunc exportedFunc AMD Projetado para navegadores Os módulos são carregados de forma assíncrona A sintaxe é mais complexa que CommonJS Exemplo defineothermodule1js othermodule2js function otherModule1 otherModule2 var importedFunc1 otherModule1importedFunc1 var importedFunc2 otherModule2importedFunc2 function internalFunc function exportedFunc importedFunc1 importedFunc2 internalFunc return exportedFunc exportedFunc Características dos módulos JavaScript Cada módulo é declarado em um arquivo Tal arquivo caracterizase por Escopo local Todas as variáveis funções e classes declaradas em um módulo são locais ao módulo Qualquer entidade que possa ser exportada deve ser explicitamente marcada como export Um módulo pode importar entidades marcadas como export em outros módulos Módulos são identificados por especificadores de módulos normalmente paths ou URLs Módulos são singletons isto é se são importados varias vezes apenas uma única instancia existe Os especificadores de módulos são usados como identificadores globais ECMAScript Os módulos ECMAScript foram introduzidos no ES6 Mantém todas as características já vistas para módulos JavaScript além de Sintaxe simples Suporta dependências cíclicas Suportam estruturas estáticas Tudo que será visto a partir de agora diz respeito a ECMAScript import importedFunc1 from othermodule1mjs import importedFunc2 from othermodule2mjs function internalFunc export function exportedFunc importedFunc1 importedFunc2 internalFunc exports e imports Cada módulo pode ter zero ou mais exports O módulo libmymathmjs tem dois exports square LIGHTSPEED O módulo mainmjs tem um único import square A segunda versão mostra como renomear um import libmymathmjs Not exported private to module function timesa b return a b export function squarex return timesx x export const LIGHTSPEED 299792458 mainmjs import square from libmymathmjs let x square3 OU import square as sq from libmymathmjs let x sq3 Namespace imports Uma alternativa aos imports nomeados são os namespace imports Usando este tipo de import o módulo se torna um objeto onde as propriedades são os export nomeados libmymathmjs Not exported private to module function timesa b return a b export function squarex return timesx x export const LIGHTSPEED 299792458 mainmjs import as math from libmymathmjs let x mathsquare3 mathLIGHTSPEED Pacotes NPM O registro de software NPM é a principal maneira de distribuir bibliotecas e aplicativos JavaScript O software é distribuído no que se convencionou chamar de pacote Um pacote é um diretório contendo arquivos eou subdiretorios diversos e um arquivo chamado packagejson que descreve o pacote Por exemplo quando o NPM cria um pacote vazio em um diretório chamado mypackage obtemos o arquivo ao lado name mypackage version 100 description main indexjs scripts test echo Error no test specified exit 1 keywords author license ISC Mais detalhes sobre NPM O NPM sempre instala os pacotes em um diretório chamado nodemodules Sempre que fazemos um import o JavaScript procura o nodemodules mais próximo na hierarquia de pastas import typedef validate from bycontract Arquivos com terminação js serão identificados como CommonJS o default a menos que seja especificado o contrário no packagejson Se outras bibliotecas forem instaladas no pacote elas serão listadas na seção de dependências do packagejson type module name video03 version 100 description main JogoDeCartasjs scripts test echo Error no test specified exit 1 keywords author license ISC dependencies bycontract 2011 promptsync 420 Criando um projeto A criação de um projeto ou seja transformação de um diretório em um pacote JavaScript ou Node é feita através do comando npm init Yes A instalação de outras bibliotecas no projeto corrente é feita através do comando npm install nome da biblioteca Dinâmica D2 Crie um módulo que disponha de funções para calcular a área das seguintes figuras geométricas Quadrado Retangulo Triangulo Circulo Crie o módulo e faça um pequeno programa exemplo que importe e uso este módulo OBS se sua biblioteca chamarse Areajs pode usar o comando que segue para importar todas as funções de uma vez import as area from Areasjs Dinâmica D3 Pesquise o site npm npmjscom Procure bibliotecas por temas use palavras chave Por fim busque a biblioteca luxon Esta é uma biblioteca para trabalhar com datas Instale a mesma e faça um exemplo de uso Pesquise a forma de instalação e referência para o ES6 Resumo do que vimos até agora Os formatos de arquivo em JavaScript O que são módulos e qual sua importância O padrão ECMAScritp para módulos A ferramenta NPM Tratamento de exceções O que sãopara que servem exceções O tratamento de exceções em JavaScript Relembrando o conteúdo do vídeo anterior Os formatos de arquivo em JavaScript O que são módulos e qual sua importância O padrão ECMAScritp para módulos A ferramenta NPM Situação problema 1 function fatorialvalor validatevalornumber if x0 return 1 else let fact0 forfact 1 valor1 valor fact fact valor returnfact Considere o código da função fatorial Se o valor informado é negativo a operação de fatorial não é possível Da forma como ela está implementada o resultado será 1 Isso é um problema em trechos de como o do código abaixo pois o valor resultante será inconsistente let x NumberpromptDigite um valor let y 5 fatorialx consolelogy Situação problema 2 class Retangulo lado1 lado2 constructorlado1lado2 validateargumentsNumberNumber if lado1 00 lado2 00 lado1 10 lado2 10 return thislado1 lado1 thislado2 lado2 get lado1 return thislado1 get lado2 return thislado2 perimetro if thislado1 10 return NaN return 2thislado1 2thislado2 area if thislado1 10 return NaN return thislado1 thislado2 Considere o código da classe Retangulo ao lado No caso de serem informados dados inválidos no método construtor atribuise o valor 1 para os tamanhos dos lados código roxo Todos os outros métodos que lidam com o tamanho dos lados passam a ter de verificar se o valor dos lados não é 1 de maneira a manter a integridade das respostas código vermelho Na verdade isso ocorre porque este código permite a criação de instâncias a partir de dados inválidos O que os problemas apresentados tem em comum Os dois problemas apresentados tem em comum o fato de que o tratamento para o problema detectado não tinha como ser corrigido no ponto onde ele foi detectado Na falta de solução melhor o uso de valores de controle foi a saída encontrada Exceções Exceções são o mecanismo oferecido pela maioria das linguagens de programação para sinalizar situações de erro que não podem ser resolvidas no ponto onde foram detectadas Sempre que uma situação de erro deste tipo é detectada deve ser sinalizada uma situação de exceção Uma exceção deve então ser lançada e depois convenientemente capturada no ponto onde o tratamento for mais adequado Lançando uma exceção function fatorialvalor validatevalor number if x 0 throw new ErrorValor invalido let fact 0 for fact 1 valor 1 valor fact fact valor return fact Considere o código da função fatorial Se o valor informado é negativo a operação de fatorial não é possível Quando esta situação é detectada o código lança uma exceção sinalizando a situação de erro trecho em vermelho Note que quando uma exceção é lançada a execução do código é interrompida e o sistema passa a buscar por um trecho capaz de capturar e tratar a exceção Capturando uma exceção 1 let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim O bloco try em vermelho é um bloco de captura de exceções Se nenhuma exceção é lançada quando o bloco vermelho esta sendo executado ele executa normalmente e depois a execução segue no trecho azul pulando o bloco catch código roxo Capturando uma exceção 2 let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim Quando uma exceção é lançada dentro de um bloco try a execução do código é imediatamente desviada para o bloco catch correspondente código roxo No caso se uma exceção é lançada a partir da função fatorial o código é imediatamente desviado para o catch e a linha sublinhada não é executada Capturando uma exceção 3 let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim Note que o bloco catch é apenas um local para que se escreva o tratamento da exceção A execução do código continua normalmente após sua execução No código ao lado o que impede que a execução continue é o comando exit que aborta a execução do programa O fluxo de uma exceção 1 try let x NumberpromptDigite um valor if x0 throw new ErrorValor invalido let y 5 fatorialx consolelogy catcherro consolelogValor inválido Encerrando processexit1 consolelogFim Se uma exceção é lançada dentro de um bloco trycódigo vermelho então a execução é imediatamente desviada para o bloco catch associado código roxo O fluxo de uma exceção 2 function fatorialvalor validatevalor number if x 0 throw new ErrorValor invalido let fact 0 for fact 1 valor 1 valor fact fact valor return fact let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim Se uma exceção é lançada fora do contexto de um bloco trycódigo vermelho então a execução é interrompida e o sistema de controle de fluxo busca o bloco try mais próximo No exemplo ao lado o código irá desviar para o ponto em que a função fatorial foi chamada Como a função foi chamada no contexto de um bloco try o fluxo desvia para o catch correspondente O fluxo de uma exceção 3 function fatorialvalor validatevalor number if x 0 throw new ErrorValor invalido let fact 0 for fact 1 valor 1 valor fact fact valor return fact let x NumberpromptDigite um valor let y 0 y 5 fatorialx consolelogy consolelogfim Se no ponto onde a função foi chamada não existe bloco try existem duas possibilidades Se a execução ainda se encontra dentro de um método ou função o fluxo desvia para quem chamou aquele método ou função Se a execução chegou a seu último nível programa principal então o mecanismo padrão de tratamento de exceções é acionado Neste caso o programa é interrompido e uma mensagem de erro padrão é exibida para o usuário Error Valor invalido Boa prática tratar todas as exceções Todas as exceções lançadas devem ser tratadas Não se deve deixar que mensagens de erro sem tratamento apareçam para o usuário final Nem no navegador Nem no servidor A clausula finally function testevalor try if valor 0 throw new ErrorValor 0 return 10valor catcherro return 0 finally consolelogSempre passa por aqui A clausula finally em vermelho serve para especificar um trecho de código que deve ser executado obrigatoriamente tendo ocorrido exceção ou não No código ao lado a mensagem será exibida na tela ocorrendo ou não a exceção O que lançar como exceção Em JavaScript qualquer coisa pode ser lançada como exceção Uma boa prática de programação é sempre lançar uma instancia da classe Error como mostrado até agora A variável indicada na clausula catch recebe uma referência para esta instancia e pode ser usada para termos acesso as propriedades desta classe let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogerromessage processexit1 consolelogFim Criando subclasses de Error Podese criar subclasses de Error com o objetivo de Criar exceções que sejam mais significativas no contexto da aplicação facilitando a leitura do código Criar exceções que tenham propriedades e métodos adicionais para armazenar dados que sejam relevantes no contexto Exemplo class valorInvalidoError extends Error constructorvalor superValor invalidovalor Subclasses de Error prédefinidas A lista ao lado apresenta as principais exceções pré definidas de JavaScript A explicação indica o objetivo para o qual foram criadas mas qualquer uma delas pode ser usada em qualquer contexto o que não é aconselhável RangeError indica que um valor esta for a da faixa permitida ReferenceError indica que uma referencia inválida fo detectada SyntaxError usada pra indicar que um erro de parsing foi encontrado TypeError é usada para indicar que uma operação falhou quando nenhuma das demais condições de erro for adequada URIError indica que uma das funções globais de tratamento de URI foi usada de maneira inadequada Dinâmica D4 Analise a classe ContaCorrente ao lado Acrescente o tratamento de operações inválidas saldo inicial depósito ou saques negativos Trate também o fato de que as operações de retirada nunca podem deixar o saldo negativo Crie uma exceção específica para indicar este tipo de situação class ContaCorrente saldo constructorsaldoInicial validatesaldoInicialnumber thissaldo saldoInicial depositovalor validatevalornumber thissaldo valor retiradavalor validatevalornumber thissaldo valor get saldo returnthissaldo Dinâmica D5 Escreva um pequeno programa que crie uma instancia da classe ContaCorrente desenvolvida na dinâmica D4 e apresente para o usuário um menu com as seguintes operações 1 Depositar 2 Retirar 3 Ver o saldo 4 Fim Trate adequadamente as eventuais exceções geradas Resumo do que vimos até agora O que são exceções Como lançar exceções Como tratar exceções Como criar nossas próprias exceções Diagrama de classes Garagem carrosCarro Carro id string Trem idstring carrosCarro Patio trensTrem Locomotiva potencianumber VagaoCarga capCarganumber VagaoPassageiro qtdadePassageirosnumber VagaoCargaRefrigerado VagaoPassageiroLocavel Interface Refrigerado tempMinimanumber Interface Locavel valorLocacaonumber Extends Extends Extends Extends Extends Extends CheckPoint Em relação ao sistema de exceções da linguagem JavaScript é correto afirmar que I Derivar exceções a partir da classe Error é possível mas não traz vantagens significativas II O comando throw permite lançar apenas objetos da classe Error e suas derivadas III Exceções são um mecanismo adequado para tratar situações de erro que não podem ser tratadas localmente Estão corretas a Apenas a I b Apenas a II c Apenas a III d A I e a III e A II e a III Trabalhando com arquivos texto O que são arquivos Trabalhando com arquivos texto Relembrando o conteúdo do vídeo anterior O que são exceções Como lançar exceções Como tratar exceções Como criar nossas próprias exceções Arquivos de computador Um arquivo de computador é um objeto que armazena dados informações configurações ou comandos usados por um programa Em um computador normalmente encontramos 3 tipos de arquivos Arquivos de aplicativos Arquivos de dados Arquivos de Sistema Arquivos x estruturas de dados Até agora os programas desenvolvidos nesse curso armazenavam os dados em estruturas de dados na memória principal tipicamente arranjos Estes dados entretanto são perdidos quando o programa se encerra Arquivos são um tipo especial de estrutura de dados de armazenamento não volátil isto é os dados permanecem armazenados após o encerramento do programa e podem ser lidos por outros programas se for o caso Arquivos podem ser compartilhados por programas Um pouco de história Arquivos são estruturas antigas que remontam os primórdios da computação Por esta razão sua estrutura esta intimamente ligada com a estrutura dos arquivos armazenados em fita magnética Em uma unidade de fita magnética os dados são armazenados de maneira sequencial e pela própria natureza da fita só podem ser lidos desta maneira Organização de arquivos de fita Cada arquivo armazenado em uma fita inicia com uma marca de início Begin Of File e termina com uma marca de fim End Of File Um cabeçote específico é capaz de ler os dados gravados na fita e transferir eles para a memória ou gravar na fita os dados que estão na memória conforme o comando Operações de leitura Read ou gravação Write também chamadas de operações de Entrada de dados Input e Saída de dados Output Para estas operações é reservada uma área na memória chamada buffer de ES O tamanho do Buffer de ES é equivalente a quantidade de dados que o cabeçote pode ler ou gravar de uma só vez exemplo 512 bytes A cada operação de leitura ou gravação a fita avança automaticamente Para ler um arquivo basta comandar várias operações de leitura até encontrar a marca de fim B O F dados E O F B O F dados E O F Cabeçote de leituragravação Buffer de memória Só o hardware evoluiu Desde muito cedo o sistema operacional escondeu dos programas o funcionamento efetivo dos dispositivos de armazenamento não volátil Os programas demandam as operações de ES para o sistema operacional que conhece o funcionamento dos dispositivos a partir dos drivers Por esta razão é que a lógica dos arquivos sequenciais continua a mesma dos tempos dos arquivos de fita embora não se use mais este tipo de equipamento Organização dos arquivos Arquivo File Conjunto sequencial de registros relacionados Exemplo informações sobre um grupo de pessoas Registro Record Pode ser pequeno como um único caracter de texto Pode ser um conjunto de campos relacionados Exemplo nome endereço idade telefone de uma pessoa Pode ser representado por uma instância de uma classe Campo Field Conjunto de caracteres com o mesmo significado Exemplo nome Arquivos representação gráfica Nome Endereço Telefone CIC RG Ana Silva Andradas 34 3325635 3455659 271646252 João Neto Siqueira 34 3534654 4545678 456546568 Maria Santos Ipiranga 67 2236651 0284808 873260269 Campo Registro Arquivo Ficha Nome Endereço Telefone CIC RG Registro Campos Chave primária Chave primária Apresenta um valor diferente para cada registro do arquivo É usada para identificar unicamente cada registro Matrícula Nome anonasc Salário 01432 Huguinho 1970 500000 20457 Zezinho 1982 700000 12899 Luizinho 1968 650000 9257 Pateta 2000 230000 Funcionarios Chave primária Lembrete dados sequenciais Mesmo que a gente imagine os dados como uma tabela no arquivo eles estão armazenados de forma sequencial Matrícula Nome anonasc Salário 01432 Huguinho 1970 500000 20457 Zezinho 1982 700000 12899 Luizinho 1968 650000 9257 Pateta 2000 230000 01432Huguinho19705000020457Zezinho19827000012899Luizinho196865000 Arquivo csv dados separados por vírgulas Porque conhecemos a estrutura do arquivo somos capazes de reconhecer registros nestes dados Tipos de arquivos Arquivo binário Os dados são armazenados em disco utilizando o mesmo formato binário de armazenamento em memória Caíram em desuso com o surgimento dos Sistemas Gerenciadores de Bancos de Dados SGBDs Na verdade estão por trás de qualquer SGBD Arquivo texto Os dados são armazenados em disco em registros de um único caracter ASCII ou UNICODE Sua grande vantagem é que podem ser facilmente lidos eou alterados por programas editores de texto além de outros programas Instalando a biblioteca de leitura de arquivos texto JavaScript não oferece comandos simples para a leitura de arquivos textos Nestes exemplos iremos usar uma biblioteca chamada n readLines Para instalar esta biblioteca usando NPM use o comando que segue npm install nreadlines Para importar a biblioteca no seu programa acrescente a linha import nReadlines from nreadlines Lendo arquivos texto 1 A função ao lado lê um arquivo texto usando a biblioteca n readLines O texto deve ter sido gerado por um editor de texto não formatado tipicamente os editores de programas Armazene o arquivo na mesma pasta de onde será disparado o programa function exibeArquivonarq validatenarqstring Localiza o arquivo let arq new nReadlinesnarq let buf Enquanto houverem linhas leitura síncrona Le o conteúdo da próxima linhas while buf arqnext Ajusta o formato dos caracteres let linha buftoStringutf8 Exibe a linha na tela consoleloglinha Lendo arquivos texto 2 O método construtor da classe nRealines localiza o arquivo na unidade de armazenamento e cria o vínculo com ele O método next lê todos os caracteres até encontrar um fim de linha e retorna este conteúdo em um buffer O método toString do buffer recebe o tipo de caracteres que deve retornar function exibeArquivonarq validatenarqstring Localiza o arquivo let arq new nReadlinesnarq let buf Enquanto houverem linhas leitura síncrona Le o conteúdo da próxima linhas while buf arqnext Ajusta o formato dos caracteres let linha buftoStringutf8 Exibe a linha na tela consoleloglinha Executando a função Este trecho de código exibe o arquivo chamado TextoSimplestxt consolelog exibeArquivoTextoSimplestxt consolelog Lendo arquivos formatados 1 O exemplo anterior leu um arquivo texto de formato livre Este tipo de arquivo normalmente é usado para armazenar texto mesmo Outros tipos de formatos como Comma Separated Values csv são usados para armazenar dados estruturados O arquivo ao lado usa csv para armazenar dados sobre vacinação Note que a primeira linha contém a descrição das linhas seguintes Nas demais os dados estão separados por virgulas CPFFirstName LastNameAgeDoses 1Emerald Edwards980 2Leroy Walker1040 3Matthew Archer972 4Noah Underhill410 5Sofia Richardson492 6Sloane Wren691 7Mackenzie Thomson773 Por simplicidade o CPF foi reduzido a um número sequencial Lendo arquivos formatados 2 A função ao lado lê o arquivo formatado com os dados de vacinas Pula a primeira linha de cabeçalho Para cada uma das linhas seguintes Separa os tokens separados por Armazena em um arranjo instancias de um objeto literal anônimo construído a partir dos dados lidos const carregaDados functionnarq let arq new nReadlinesnarq let buf let line let dados let dadosVac arqnext while buf arqnext line buftoStringutf8 dados linesplit dadosVacpush cpfparseIntdados0 nomedados1 idadeparseIntdados2 dosesparseIntdados3 return dadosVac Lendo arquivos formatados 3 O trecho ao lado ativa a função e exibe os dados na tela let dadosvac carregaDadosVacinacaocsv forlet dado of dadosVac consolelogdado cpf 1 nome Emerald Edwards idade 98 doses 0 cpf 2 nome Leroy Walker idade 104 doses 0 cpf 3 nome Matthew Archer idade 97 doses 2 cpf 4 nome Noah Underhill idade 41 doses 0 cpf 5 nome Sofia Richardson idade 49 doses 2 cpf 6 nome Sloane Wren idade 69 doses 1 cpf 7 nome Mackenzie Thomson idade 77 doses 3 cpf 500 nome Danny Carson idade 14 doses 1 Dinâmica D6 Crie um arquivo texto com dados de vagões ferroviários de carga identificador numérico e capacidade de carga Os vagões devem ter uma propriedade adicional capaz de indicar se estão em uso ou não Em seguida escreva um programa capaz de ler este arquivo e armazenar os vagões em um arranjo Por fim o programa deve marcar como em uso 4 vagões com capacidade para mais de 5000 Kg e imprimir a relação completa dos vagões Dinâmica D7 Altere o arquivo texto da dinâmica D6 para conter tanto locomotivas quanto vagões Reescreva o programa da dinâmica D6 para prever as locomotivas Explore polimorfismo na sua solução Resumo do que vimos até agora O que são arquivos O que são arquivos de dados O contexto histórico dos arquivos Como ler um arquivo não formatado Como ler um arquivo formatado Exercício de fixação Um exercício envolvendo todos os conceitos vistos nesta aula Relembrando o conteúdo do vídeo anterior O que são arquivos O que são arquivos de dados O contexto histórico dos arquivos Como ler um arquivo não formatado Como ler um arquivo formatado Integrando conceitos O objetivo deste vídeo é apresentar um exercício resolvido que integre todos os conteúdos vistos até aqui Nas dinâmicas 6 e 7 criamos uma garagens de elementos de trens O exercício irá utilizar estes elementos já desenvolvidos como ponto de partida na construção de um sistema de criação de composições ferroviárias um trem Os próximos Slides apresentam a especificação deste exercício Sistema de composição de trens Uma empresa ferroviária necessita de um sistema que a ajude a montar as composições ferroviárias trens de que necessita para atender as viagens programadas Conforme a viagem o trem precisa de vagões de passageiros eou de carga Alguns destes vagões podem ser locados inteiros e outros não assim como alguns são refrigerados e outros não Os vagões e locomotivas livres ficam estacionados em uma garagem A medida que são selecionados são retirados da garagem e incorporados ao trem Os trens ficam estacionados em um pátio de manobras A montagem do trem segue uma série de regras específicas detalhadas na sequencia Regras de composição de um trem A indicação da locomotiva é feita na criação do trem Não existe trem sem locomotiva A locomotiva é sempre o primeiro elemento a ser inserido e não pode ser retirado Não pode haver mais de uma locomotiva por trem As locomotivas podem puxar 2 vagões a cada 100 Hp Um vagão refrigerado conta como 2 normais exige mais potencia Vagões só podem ser inseridos e retirados no final do trem Vagões de carga tem de ser sempre os últimos Só podem haver no máximo 2 vagões locáveis por trem Frota atual A frota atual deve ser carregada a partir de um arquivo texto As quantidades de carros de cada tipo podem variar mas a configuração dos carros atualmente segue o exposto abaixo Note que estas informações são para criação do arquivo texto Não implicam em restrições nas classes Capacidade dos vagões de carga 2000 5000 ou 10000 toneladas Capacidade dos vagões de passageiro 70 120 ou 180 passageiros Potencia das locomotivas entre 500 e 1000 HP múltiplos de 100 Temperatura mínima da refrigeração 3 graus 10 graus 20 graus Formato do arquivo Como formato de arquivo sugerese um csv Cada linha deve ter o seguinte formato idtipopotenciacapCargaqtdadePasstempMinvalorLocação Onde tipo LO VC VP VR VL LO locomotiva VC vagão de carga VP vagão passageiros VR vagão de carga refrigerado VL vagão de passageiros locável OBS os valores que não dizem respeito ao tipo devem ser preenchidos com 0 zero ATENÇÃO cuide para não deixar mais de uma linha em branco ao final do arquivo Menu do sistema O sistema deve ter opções para 1 Listar os carros livres na garagem 2 Inserir um vagão indicando o id 3 Remover o último carro se for a locomotiva cancela o trem 4 Fim OBS O trem será criado automaticamente O estado atual do trem deve ser exibido a cada alteração Módulos O sistema deve ser desenvolvido em 3 módulos 1 Carrosjs Contem toda a hierarquia de classes e interfaces relacionadas aos carros 2 Composicoesjs Contem a Garagem o Trem e o Patio 3 Appjs Contém o programa principal Resumo do que vimos até agora Aplicação de herança Aplicação de polimorfismo na herança Aplicação de polimorfismo estrutural Aplicação de exceções Aplicação de arquivos TRANSFERÊNCIA EXTERNA CheckPoint Considere o texto que segue Arquivos são um tipo de estrutura para armazenamento de dados Entre suas esta o fato de que os dados podem ser compartilhados entre No caso específico de podemos citar ainda o fato de que eles podem ser facilmente em editores de textos comuns A alternativa que completa corretamente as lacunas é a não volátil vantagens programas diferentes bancos de dados criados mas não editados b volátil vantagens contextos de mesmo nível bancos de dados editados mas não criados c não volátil vantagens programas diferentes arquivos texto criados e editados d volátil desvantagens métodos distintos bancos de dados criados mas não editados e não volátil desvantagens contextos de mesmo nível arquivos texto criados e editados TRANSFERÊNCIA EXTERNA
Send your question to AI and receive an answer instantly
Recommended for you
152
Lógica de Programação - Aula 08 - Estruturas de Dados em Python
Introdução à Lógica e Programação
UMG
4
Modelagem da Solução e Implementação das Classes Fundamentais
Introdução à Lógica e Programação
UMG
5
uma Aplicação da Lógica Proposicional Portas Lógicas
Introdução à Lógica e Programação
UMG
61
Aula 1 - Lógica Proposicional - Matemática Aplicada à Computação
Introdução à Lógica e Programação
UMG
77
Lógica Proposicional - Propriedades e Quantificadores - Matemática Aplicada
Introdução à Lógica e Programação
UMG
75
Aula 06 Lógica e Programação - Repetição com While em Python
Introdução à Lógica e Programação
UMG
6
Criar Código em Python
Introdução à Lógica e Programação
UMG
6
Lista de Exercícios - Lógica de Programação em Java
Introdução à Lógica e Programação
IFPE
1
Lista de Exercícios Java: Calculo de A e Soma de Indices de Letras A
Introdução à Lógica e Programação
IFPE
13
Tipos de Pessoas e Interacoes na Universidade - Guia Completo
Introdução à Lógica e Programação
SENAC
Preview text
Programação Orientada a Objetos Prof Bernardo Copstein Prof Júlio Pereira Machado O que você vai aprender nessa aula Nesta aula o objetivo é trabalharmos o conceito de polimorfismo estrutural Juntamente com os conceitos de herança e polimorfismo por herança formam a base do paradigma de Programação Orientada a Objetos Este e outros conceitos adicionais estão organizados em 5 vídeos Polimorfismo estrutural Módulos Tratamento de exceções Arquivos Exercício geral O que você vai precisar para acompanhar essa aula Bibliografia Livros sobre JavaScript Ambiente de programação Nodejs Npm Visual Studio Code Opcionalmente você pode usar um ambiente online httpsreplit httpsstackblitzcom Consulte o material complementar Polimorfismo estrutural Interfaces polimorfismo estrutural Caracterizando grupos de entidades É comum que uma certa categoria de entidades se caracterize por ter determinadas propriedades ou comportamentos Motoristas precisam ter um número de habilitação válido Engenheiros caracterizamse por um número de CREA e uma lista de habilitações Por vezes estas características não definem a entidade por inteiro somente a associa a um subgrupo Uma Pessoa pode ser um Motorista e um Engenheiro ou só Motorista ou só Engenheiro Interfaces 1 Uma empresa trabalha com diversos entregáveis coisas que ela fornece Os entregáveis podem ser diferentes tipos de produtos ou serviços Alguns produtos e serviços pagam impostos são taxáveis Alguns produtos eu posso mandar entregar pelo correio Alguns serviços são isentos Interfaces 2 Servico é um tipo de Entregavel relação de herança e atende a um contrato interface que define os entregáveis dos quais podese cobrar impostos Taxavel posso ter outros servicos que são isentos de impostos Produto é um tipo de Entregavel que atende a dois contratos interfaces Transportavel e Taxavel posso ter outros produtos que são isentos de impostos eou que não posso entregar pelo correio Interfaces 3 Note que a relação de herança é hierárquica já a relação das classes com as interfaces não Uma interface apenas define propriedades que um objeto deve possuir de maneira a atender determinado contrato Uma interface não implica em herdar nada Se a classe possui aqueles atributos então ela atende ao contrato senão não Definindo uma interface typedefTransportavel fragilboolean valorFretenumber let p new ProdutoUva850 validatepTransportavel A definição da interface será estrutural Define que elementos da estrutura de um objeto o identificam como aderente a determinado contrato ou categoria Em JavaScript a interface será definida com o auxilio da biblioteca bycontract Podese verificar se uma determinada instancia implementa a mesma estrutura que foi definida ou seja se implementa o contrato interface Vai verificar se o objeto referenciado por obj possui as propriedades frágil e valorFrete Explorando o princípio da substituição Se posso descrever uma entidade como atendendo a vários contratos posso explorar o princípio da substituição para trabalhar com classes que não pertencem a um mesmo ramo de uma hierarquia de classes de forma padrão Exemplo function exibeFreteentregavel validateentregavelTransportavel consolelogDescricao entregaveldescricao Frete entregavelvalorFretetoFixed2 let p new ProdutoBanana1050 let s new Servico104Consultoria financeira200 exibeFretep exibeFretes Gera uma exceção Embora pertença a mesma hierarquia de Entregavel não implementa Transportavel Explorando polimorfismo estrutural Da mesma forma que foi possível explorar o princípio da substituição é possível criar funções que exploram polimorfismo estrutural sobre coleções de elementos que implementam um determinado contrato Exemplo function listaTaxaveistaxaveis validatetaxaveisArrayEntregavel validatetaxaveisArrayTaxavel forlet t of taxaveis consolelogDescricao tdescricao imposto tvalorImposto let ps pspushnew ProdutoBanana1050 pspushnew Servico104Consultoria financeira200 pspushnew ServicoVoluntario202Aulas vulneráveisJorge pspushnew ProdutoUva830 pspushnew Servico105Consultoria TI300 listaTaxaveisps Garante que todos os elementos do arranjo são derivados de Entregavel e implementam a interface Taxavel Gera uma exceção Verificando a aderência a outros contratos No exemplo ao lado exploramos garantimos que todos são Entregável e Taxavel Mas sabemos que alguns são Transportavel e para esses gostaríamos de exibir o valor do frete Como testar essa condição function listaTaxaveistaxaveis validatetaxaveisArrayEntregavel validatetaxaveisArrayTaxavel forlet t of taxaveis let aux Descricao tdescricao aux imposto tvalorImpostotoFixed2 SE aux FOR transportável aux valor transporte tvalorFrete consolelogaux Verificando a aderência a outros contratos Em JavaScript teremos de criar uma função específica para este fim explorando o operador in O operador in nos permite verificar se uma instancia possui uma determinada propriedade A função ao lado retorna true se o objeto informado for Transportavel Interface transportavel typedefTransportavel fragilboolean valorFretenumber function isTransportavelobj return fragil in obj valorFrete in obj Verificando a aderência a outros contratos Observe como fica a função listaTaxaveis usando a função auxiliar isTransportavel Na medida que isTransportavel nos garante que a instancia t é Transportavel podemos chamar as propriedades com segurança function listaTaxaveistaxaveis validatetaxaveisArrayEntregavel validatetaxaveisArrayTaxavel forlet t of taxaveis let aux Descricao tdescricao aux imposto tvalorImpostotoFixed2 if isTransportavelt aux fragil tfragil aux valor frete R tvalorFrete consolelogaux Resumindo Podemos definir contratos que as classes podem implementar ou não em uma relação não hierárquica Os contratos são definidos com auxílio de byContract e de uma função auxiliar Podemos explorar polimorfismo na herança e polimorfismo estrutural conforme for mais adequado Interface taxável typedefTaxavel aliquotanumber function isTaxavelobj return valorImposto in obj Dinâmica D1 Considerando o diagrama de classes ao lado implemente o que se pede a Uma função que recebe uma lista de Taxavel por parâmetro e retorne quantos são Produtos quantos são Servico e quantos são Veiculo b Uma função que recebe uma lista de Taxavel por parâmetro e imprime o valor médio do imposto dos veículos c Uma função que recebe uma lista de Entregavel por parâmetro e retorna quantos são produtos transportáveis d Uma função que recebe uma lista de Transportavel por parâmetro e imprime o total a ser gasto com o frete dos produtos Resumo do que vimos até agora O que são interfaces Como declarar interfaces Como explorar o princípio da substituição com interfaces Como explorar polimorfismo estrutural com interfaces Explorando Módulos A evolução dos módulos em JavaScript O padrão ECMAScript Relembrando o conteúdo do vídeo anterior O que são interfaces Como declarar interfaces Como explorar o princípio da substituição com interfaces Como explorar polimorfismo estrutural com interfaces Formatos de código em JavaScript JavaScript suporta uma variedade de tipos de formatos de código A versão ES6 introduziu o conceito de módulo mas os formatos de código que vieram antes ainda persistem Scripts são fragmentos de código que executam em escopo global São os precursores dos módulos CommonJS é um formato de módulo que é usado principalmente em servidores com Nodejs Módulos AMD é um formato de módulos muito usado em browsers ECMAScript é o formato previsto a partir do ES6 Ele se sobrepõe a todos os outros e é o que deve ser adotado a partir de então Visão geral dos formatos de código Tipo Onde executa Extensão Script Navegador js CommonJS Servidor js e cjs AMD Navegador js ECMAScript Navegador e Servidor js e mjs Para que módulos Situação problema Imagine que alguém criou um conjunto de funções em JavaScript para trabalhar com previsão do tempo Entre as muitas funções oferecidas estão temperaturaMediaperiodo maximosMinimosperíodo Outra pessoa criou um conjunto de funções para lidar com temperaturas de um forno de um processo industrial Entre as muitas funções oferecidas estão temperaturaMediaforno maximosMinimosforno Se quisermos aproveitar estes dois conjuntos de funções no mesmo sistema teremos problemas de colisão de nomes Pior mesmo que só usemos um dos conjuntos teremos de evitar de usar no nosso programa os mesmos nomes de função que foram usados nos conjuntos que vamos aproveitar Por fim como estes conjuntos serão disponibilizados para serem incorporados no nosso programa Módulos contexto Módulos nos permitem definir contexto Os recursos definidos dentro de um módulo ficam encapsulados dentro dele e associados ao nome do módulo Apenas os recursos que queremos que sejam visíveis do ponto de vista externo ficam visíveis Mesmo os recursos visíveis externamente tem seu identificador associado ao identificador do módulo evitando a colisão de nomes Módulos contexto exemplo Modulo Clima Temperaturas function carregaDoArquivo export function inicializa export function temperaturaMedia function eliminaDesvios outras funções Programa Principal Import Clima Climainicializa consolelogClimatemperaturaMedia As variáveis do módulo são visíveis apenas no seu contexto local Apenas o que é marcado para exportação fica visível para o programa O nome do módulo se incorpora ao nome das variáveis e métodos para evitar a mistura de identificadores Antes de módulos apenas scripts Antes do ES6 JavaScript tinha apenas scripts não módulos script srcothermodule1jsscript script srcothermodule2jsscript script srcmymodulejsscript Simular módulos com scripts tem vários problemas A noção de contexto é simulada por importação através de variáveis globais o que traz um grande risco para colisão de nomes As dependências entre os módulos não são declaradas É necessário carregar os módulos necessários junto com os módulos dos quais os módulos dependem E tudo isso na ordem certa CommonJS Projetado para servidores Os módulos são carregados de forma síncrona A sintaxe é compacta Exemplo var importedFunc1 requireothermodule1jsimportedFunc1 var importedFunc2 requireothermodule2jsimportedFunc2 Body function internalFunc function exportedFunc importedFunc1 importedFunc2 internalFunc Exports moduleexports exportedFunc exportedFunc AMD Projetado para navegadores Os módulos são carregados de forma assíncrona A sintaxe é mais complexa que CommonJS Exemplo defineothermodule1js othermodule2js function otherModule1 otherModule2 var importedFunc1 otherModule1importedFunc1 var importedFunc2 otherModule2importedFunc2 function internalFunc function exportedFunc importedFunc1 importedFunc2 internalFunc return exportedFunc exportedFunc Características dos módulos JavaScript Cada módulo é declarado em um arquivo Tal arquivo caracterizase por Escopo local Todas as variáveis funções e classes declaradas em um módulo são locais ao módulo Qualquer entidade que possa ser exportada deve ser explicitamente marcada como export Um módulo pode importar entidades marcadas como export em outros módulos Módulos são identificados por especificadores de módulos normalmente paths ou URLs Módulos são singletons isto é se são importados varias vezes apenas uma única instancia existe Os especificadores de módulos são usados como identificadores globais ECMAScript Os módulos ECMAScript foram introduzidos no ES6 Mantém todas as características já vistas para módulos JavaScript além de Sintaxe simples Suporta dependências cíclicas Suportam estruturas estáticas Tudo que será visto a partir de agora diz respeito a ECMAScript import importedFunc1 from othermodule1mjs import importedFunc2 from othermodule2mjs function internalFunc export function exportedFunc importedFunc1 importedFunc2 internalFunc exports e imports Cada módulo pode ter zero ou mais exports O módulo libmymathmjs tem dois exports square LIGHTSPEED O módulo mainmjs tem um único import square A segunda versão mostra como renomear um import libmymathmjs Not exported private to module function timesa b return a b export function squarex return timesx x export const LIGHTSPEED 299792458 mainmjs import square from libmymathmjs let x square3 OU import square as sq from libmymathmjs let x sq3 Namespace imports Uma alternativa aos imports nomeados são os namespace imports Usando este tipo de import o módulo se torna um objeto onde as propriedades são os export nomeados libmymathmjs Not exported private to module function timesa b return a b export function squarex return timesx x export const LIGHTSPEED 299792458 mainmjs import as math from libmymathmjs let x mathsquare3 mathLIGHTSPEED Pacotes NPM O registro de software NPM é a principal maneira de distribuir bibliotecas e aplicativos JavaScript O software é distribuído no que se convencionou chamar de pacote Um pacote é um diretório contendo arquivos eou subdiretorios diversos e um arquivo chamado packagejson que descreve o pacote Por exemplo quando o NPM cria um pacote vazio em um diretório chamado mypackage obtemos o arquivo ao lado name mypackage version 100 description main indexjs scripts test echo Error no test specified exit 1 keywords author license ISC Mais detalhes sobre NPM O NPM sempre instala os pacotes em um diretório chamado nodemodules Sempre que fazemos um import o JavaScript procura o nodemodules mais próximo na hierarquia de pastas import typedef validate from bycontract Arquivos com terminação js serão identificados como CommonJS o default a menos que seja especificado o contrário no packagejson Se outras bibliotecas forem instaladas no pacote elas serão listadas na seção de dependências do packagejson type module name video03 version 100 description main JogoDeCartasjs scripts test echo Error no test specified exit 1 keywords author license ISC dependencies bycontract 2011 promptsync 420 Criando um projeto A criação de um projeto ou seja transformação de um diretório em um pacote JavaScript ou Node é feita através do comando npm init Yes A instalação de outras bibliotecas no projeto corrente é feita através do comando npm install nome da biblioteca Dinâmica D2 Crie um módulo que disponha de funções para calcular a área das seguintes figuras geométricas Quadrado Retangulo Triangulo Circulo Crie o módulo e faça um pequeno programa exemplo que importe e uso este módulo OBS se sua biblioteca chamarse Areajs pode usar o comando que segue para importar todas as funções de uma vez import as area from Areasjs Dinâmica D3 Pesquise o site npm npmjscom Procure bibliotecas por temas use palavras chave Por fim busque a biblioteca luxon Esta é uma biblioteca para trabalhar com datas Instale a mesma e faça um exemplo de uso Pesquise a forma de instalação e referência para o ES6 Resumo do que vimos até agora Os formatos de arquivo em JavaScript O que são módulos e qual sua importância O padrão ECMAScritp para módulos A ferramenta NPM Tratamento de exceções O que sãopara que servem exceções O tratamento de exceções em JavaScript Relembrando o conteúdo do vídeo anterior Os formatos de arquivo em JavaScript O que são módulos e qual sua importância O padrão ECMAScritp para módulos A ferramenta NPM Situação problema 1 function fatorialvalor validatevalornumber if x0 return 1 else let fact0 forfact 1 valor1 valor fact fact valor returnfact Considere o código da função fatorial Se o valor informado é negativo a operação de fatorial não é possível Da forma como ela está implementada o resultado será 1 Isso é um problema em trechos de como o do código abaixo pois o valor resultante será inconsistente let x NumberpromptDigite um valor let y 5 fatorialx consolelogy Situação problema 2 class Retangulo lado1 lado2 constructorlado1lado2 validateargumentsNumberNumber if lado1 00 lado2 00 lado1 10 lado2 10 return thislado1 lado1 thislado2 lado2 get lado1 return thislado1 get lado2 return thislado2 perimetro if thislado1 10 return NaN return 2thislado1 2thislado2 area if thislado1 10 return NaN return thislado1 thislado2 Considere o código da classe Retangulo ao lado No caso de serem informados dados inválidos no método construtor atribuise o valor 1 para os tamanhos dos lados código roxo Todos os outros métodos que lidam com o tamanho dos lados passam a ter de verificar se o valor dos lados não é 1 de maneira a manter a integridade das respostas código vermelho Na verdade isso ocorre porque este código permite a criação de instâncias a partir de dados inválidos O que os problemas apresentados tem em comum Os dois problemas apresentados tem em comum o fato de que o tratamento para o problema detectado não tinha como ser corrigido no ponto onde ele foi detectado Na falta de solução melhor o uso de valores de controle foi a saída encontrada Exceções Exceções são o mecanismo oferecido pela maioria das linguagens de programação para sinalizar situações de erro que não podem ser resolvidas no ponto onde foram detectadas Sempre que uma situação de erro deste tipo é detectada deve ser sinalizada uma situação de exceção Uma exceção deve então ser lançada e depois convenientemente capturada no ponto onde o tratamento for mais adequado Lançando uma exceção function fatorialvalor validatevalor number if x 0 throw new ErrorValor invalido let fact 0 for fact 1 valor 1 valor fact fact valor return fact Considere o código da função fatorial Se o valor informado é negativo a operação de fatorial não é possível Quando esta situação é detectada o código lança uma exceção sinalizando a situação de erro trecho em vermelho Note que quando uma exceção é lançada a execução do código é interrompida e o sistema passa a buscar por um trecho capaz de capturar e tratar a exceção Capturando uma exceção 1 let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim O bloco try em vermelho é um bloco de captura de exceções Se nenhuma exceção é lançada quando o bloco vermelho esta sendo executado ele executa normalmente e depois a execução segue no trecho azul pulando o bloco catch código roxo Capturando uma exceção 2 let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim Quando uma exceção é lançada dentro de um bloco try a execução do código é imediatamente desviada para o bloco catch correspondente código roxo No caso se uma exceção é lançada a partir da função fatorial o código é imediatamente desviado para o catch e a linha sublinhada não é executada Capturando uma exceção 3 let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim Note que o bloco catch é apenas um local para que se escreva o tratamento da exceção A execução do código continua normalmente após sua execução No código ao lado o que impede que a execução continue é o comando exit que aborta a execução do programa O fluxo de uma exceção 1 try let x NumberpromptDigite um valor if x0 throw new ErrorValor invalido let y 5 fatorialx consolelogy catcherro consolelogValor inválido Encerrando processexit1 consolelogFim Se uma exceção é lançada dentro de um bloco trycódigo vermelho então a execução é imediatamente desviada para o bloco catch associado código roxo O fluxo de uma exceção 2 function fatorialvalor validatevalor number if x 0 throw new ErrorValor invalido let fact 0 for fact 1 valor 1 valor fact fact valor return fact let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogValor informado inválido Encerrando processexit1 consolelogfim Se uma exceção é lançada fora do contexto de um bloco trycódigo vermelho então a execução é interrompida e o sistema de controle de fluxo busca o bloco try mais próximo No exemplo ao lado o código irá desviar para o ponto em que a função fatorial foi chamada Como a função foi chamada no contexto de um bloco try o fluxo desvia para o catch correspondente O fluxo de uma exceção 3 function fatorialvalor validatevalor number if x 0 throw new ErrorValor invalido let fact 0 for fact 1 valor 1 valor fact fact valor return fact let x NumberpromptDigite um valor let y 0 y 5 fatorialx consolelogy consolelogfim Se no ponto onde a função foi chamada não existe bloco try existem duas possibilidades Se a execução ainda se encontra dentro de um método ou função o fluxo desvia para quem chamou aquele método ou função Se a execução chegou a seu último nível programa principal então o mecanismo padrão de tratamento de exceções é acionado Neste caso o programa é interrompido e uma mensagem de erro padrão é exibida para o usuário Error Valor invalido Boa prática tratar todas as exceções Todas as exceções lançadas devem ser tratadas Não se deve deixar que mensagens de erro sem tratamento apareçam para o usuário final Nem no navegador Nem no servidor A clausula finally function testevalor try if valor 0 throw new ErrorValor 0 return 10valor catcherro return 0 finally consolelogSempre passa por aqui A clausula finally em vermelho serve para especificar um trecho de código que deve ser executado obrigatoriamente tendo ocorrido exceção ou não No código ao lado a mensagem será exibida na tela ocorrendo ou não a exceção O que lançar como exceção Em JavaScript qualquer coisa pode ser lançada como exceção Uma boa prática de programação é sempre lançar uma instancia da classe Error como mostrado até agora A variável indicada na clausula catch recebe uma referência para esta instancia e pode ser usada para termos acesso as propriedades desta classe let x NumberpromptDigite um valor let y 0 try y 5 fatorialx consolelogy catch erro consolelogerromessage processexit1 consolelogFim Criando subclasses de Error Podese criar subclasses de Error com o objetivo de Criar exceções que sejam mais significativas no contexto da aplicação facilitando a leitura do código Criar exceções que tenham propriedades e métodos adicionais para armazenar dados que sejam relevantes no contexto Exemplo class valorInvalidoError extends Error constructorvalor superValor invalidovalor Subclasses de Error prédefinidas A lista ao lado apresenta as principais exceções pré definidas de JavaScript A explicação indica o objetivo para o qual foram criadas mas qualquer uma delas pode ser usada em qualquer contexto o que não é aconselhável RangeError indica que um valor esta for a da faixa permitida ReferenceError indica que uma referencia inválida fo detectada SyntaxError usada pra indicar que um erro de parsing foi encontrado TypeError é usada para indicar que uma operação falhou quando nenhuma das demais condições de erro for adequada URIError indica que uma das funções globais de tratamento de URI foi usada de maneira inadequada Dinâmica D4 Analise a classe ContaCorrente ao lado Acrescente o tratamento de operações inválidas saldo inicial depósito ou saques negativos Trate também o fato de que as operações de retirada nunca podem deixar o saldo negativo Crie uma exceção específica para indicar este tipo de situação class ContaCorrente saldo constructorsaldoInicial validatesaldoInicialnumber thissaldo saldoInicial depositovalor validatevalornumber thissaldo valor retiradavalor validatevalornumber thissaldo valor get saldo returnthissaldo Dinâmica D5 Escreva um pequeno programa que crie uma instancia da classe ContaCorrente desenvolvida na dinâmica D4 e apresente para o usuário um menu com as seguintes operações 1 Depositar 2 Retirar 3 Ver o saldo 4 Fim Trate adequadamente as eventuais exceções geradas Resumo do que vimos até agora O que são exceções Como lançar exceções Como tratar exceções Como criar nossas próprias exceções Diagrama de classes Garagem carrosCarro Carro id string Trem idstring carrosCarro Patio trensTrem Locomotiva potencianumber VagaoCarga capCarganumber VagaoPassageiro qtdadePassageirosnumber VagaoCargaRefrigerado VagaoPassageiroLocavel Interface Refrigerado tempMinimanumber Interface Locavel valorLocacaonumber Extends Extends Extends Extends Extends Extends CheckPoint Em relação ao sistema de exceções da linguagem JavaScript é correto afirmar que I Derivar exceções a partir da classe Error é possível mas não traz vantagens significativas II O comando throw permite lançar apenas objetos da classe Error e suas derivadas III Exceções são um mecanismo adequado para tratar situações de erro que não podem ser tratadas localmente Estão corretas a Apenas a I b Apenas a II c Apenas a III d A I e a III e A II e a III Trabalhando com arquivos texto O que são arquivos Trabalhando com arquivos texto Relembrando o conteúdo do vídeo anterior O que são exceções Como lançar exceções Como tratar exceções Como criar nossas próprias exceções Arquivos de computador Um arquivo de computador é um objeto que armazena dados informações configurações ou comandos usados por um programa Em um computador normalmente encontramos 3 tipos de arquivos Arquivos de aplicativos Arquivos de dados Arquivos de Sistema Arquivos x estruturas de dados Até agora os programas desenvolvidos nesse curso armazenavam os dados em estruturas de dados na memória principal tipicamente arranjos Estes dados entretanto são perdidos quando o programa se encerra Arquivos são um tipo especial de estrutura de dados de armazenamento não volátil isto é os dados permanecem armazenados após o encerramento do programa e podem ser lidos por outros programas se for o caso Arquivos podem ser compartilhados por programas Um pouco de história Arquivos são estruturas antigas que remontam os primórdios da computação Por esta razão sua estrutura esta intimamente ligada com a estrutura dos arquivos armazenados em fita magnética Em uma unidade de fita magnética os dados são armazenados de maneira sequencial e pela própria natureza da fita só podem ser lidos desta maneira Organização de arquivos de fita Cada arquivo armazenado em uma fita inicia com uma marca de início Begin Of File e termina com uma marca de fim End Of File Um cabeçote específico é capaz de ler os dados gravados na fita e transferir eles para a memória ou gravar na fita os dados que estão na memória conforme o comando Operações de leitura Read ou gravação Write também chamadas de operações de Entrada de dados Input e Saída de dados Output Para estas operações é reservada uma área na memória chamada buffer de ES O tamanho do Buffer de ES é equivalente a quantidade de dados que o cabeçote pode ler ou gravar de uma só vez exemplo 512 bytes A cada operação de leitura ou gravação a fita avança automaticamente Para ler um arquivo basta comandar várias operações de leitura até encontrar a marca de fim B O F dados E O F B O F dados E O F Cabeçote de leituragravação Buffer de memória Só o hardware evoluiu Desde muito cedo o sistema operacional escondeu dos programas o funcionamento efetivo dos dispositivos de armazenamento não volátil Os programas demandam as operações de ES para o sistema operacional que conhece o funcionamento dos dispositivos a partir dos drivers Por esta razão é que a lógica dos arquivos sequenciais continua a mesma dos tempos dos arquivos de fita embora não se use mais este tipo de equipamento Organização dos arquivos Arquivo File Conjunto sequencial de registros relacionados Exemplo informações sobre um grupo de pessoas Registro Record Pode ser pequeno como um único caracter de texto Pode ser um conjunto de campos relacionados Exemplo nome endereço idade telefone de uma pessoa Pode ser representado por uma instância de uma classe Campo Field Conjunto de caracteres com o mesmo significado Exemplo nome Arquivos representação gráfica Nome Endereço Telefone CIC RG Ana Silva Andradas 34 3325635 3455659 271646252 João Neto Siqueira 34 3534654 4545678 456546568 Maria Santos Ipiranga 67 2236651 0284808 873260269 Campo Registro Arquivo Ficha Nome Endereço Telefone CIC RG Registro Campos Chave primária Chave primária Apresenta um valor diferente para cada registro do arquivo É usada para identificar unicamente cada registro Matrícula Nome anonasc Salário 01432 Huguinho 1970 500000 20457 Zezinho 1982 700000 12899 Luizinho 1968 650000 9257 Pateta 2000 230000 Funcionarios Chave primária Lembrete dados sequenciais Mesmo que a gente imagine os dados como uma tabela no arquivo eles estão armazenados de forma sequencial Matrícula Nome anonasc Salário 01432 Huguinho 1970 500000 20457 Zezinho 1982 700000 12899 Luizinho 1968 650000 9257 Pateta 2000 230000 01432Huguinho19705000020457Zezinho19827000012899Luizinho196865000 Arquivo csv dados separados por vírgulas Porque conhecemos a estrutura do arquivo somos capazes de reconhecer registros nestes dados Tipos de arquivos Arquivo binário Os dados são armazenados em disco utilizando o mesmo formato binário de armazenamento em memória Caíram em desuso com o surgimento dos Sistemas Gerenciadores de Bancos de Dados SGBDs Na verdade estão por trás de qualquer SGBD Arquivo texto Os dados são armazenados em disco em registros de um único caracter ASCII ou UNICODE Sua grande vantagem é que podem ser facilmente lidos eou alterados por programas editores de texto além de outros programas Instalando a biblioteca de leitura de arquivos texto JavaScript não oferece comandos simples para a leitura de arquivos textos Nestes exemplos iremos usar uma biblioteca chamada n readLines Para instalar esta biblioteca usando NPM use o comando que segue npm install nreadlines Para importar a biblioteca no seu programa acrescente a linha import nReadlines from nreadlines Lendo arquivos texto 1 A função ao lado lê um arquivo texto usando a biblioteca n readLines O texto deve ter sido gerado por um editor de texto não formatado tipicamente os editores de programas Armazene o arquivo na mesma pasta de onde será disparado o programa function exibeArquivonarq validatenarqstring Localiza o arquivo let arq new nReadlinesnarq let buf Enquanto houverem linhas leitura síncrona Le o conteúdo da próxima linhas while buf arqnext Ajusta o formato dos caracteres let linha buftoStringutf8 Exibe a linha na tela consoleloglinha Lendo arquivos texto 2 O método construtor da classe nRealines localiza o arquivo na unidade de armazenamento e cria o vínculo com ele O método next lê todos os caracteres até encontrar um fim de linha e retorna este conteúdo em um buffer O método toString do buffer recebe o tipo de caracteres que deve retornar function exibeArquivonarq validatenarqstring Localiza o arquivo let arq new nReadlinesnarq let buf Enquanto houverem linhas leitura síncrona Le o conteúdo da próxima linhas while buf arqnext Ajusta o formato dos caracteres let linha buftoStringutf8 Exibe a linha na tela consoleloglinha Executando a função Este trecho de código exibe o arquivo chamado TextoSimplestxt consolelog exibeArquivoTextoSimplestxt consolelog Lendo arquivos formatados 1 O exemplo anterior leu um arquivo texto de formato livre Este tipo de arquivo normalmente é usado para armazenar texto mesmo Outros tipos de formatos como Comma Separated Values csv são usados para armazenar dados estruturados O arquivo ao lado usa csv para armazenar dados sobre vacinação Note que a primeira linha contém a descrição das linhas seguintes Nas demais os dados estão separados por virgulas CPFFirstName LastNameAgeDoses 1Emerald Edwards980 2Leroy Walker1040 3Matthew Archer972 4Noah Underhill410 5Sofia Richardson492 6Sloane Wren691 7Mackenzie Thomson773 Por simplicidade o CPF foi reduzido a um número sequencial Lendo arquivos formatados 2 A função ao lado lê o arquivo formatado com os dados de vacinas Pula a primeira linha de cabeçalho Para cada uma das linhas seguintes Separa os tokens separados por Armazena em um arranjo instancias de um objeto literal anônimo construído a partir dos dados lidos const carregaDados functionnarq let arq new nReadlinesnarq let buf let line let dados let dadosVac arqnext while buf arqnext line buftoStringutf8 dados linesplit dadosVacpush cpfparseIntdados0 nomedados1 idadeparseIntdados2 dosesparseIntdados3 return dadosVac Lendo arquivos formatados 3 O trecho ao lado ativa a função e exibe os dados na tela let dadosvac carregaDadosVacinacaocsv forlet dado of dadosVac consolelogdado cpf 1 nome Emerald Edwards idade 98 doses 0 cpf 2 nome Leroy Walker idade 104 doses 0 cpf 3 nome Matthew Archer idade 97 doses 2 cpf 4 nome Noah Underhill idade 41 doses 0 cpf 5 nome Sofia Richardson idade 49 doses 2 cpf 6 nome Sloane Wren idade 69 doses 1 cpf 7 nome Mackenzie Thomson idade 77 doses 3 cpf 500 nome Danny Carson idade 14 doses 1 Dinâmica D6 Crie um arquivo texto com dados de vagões ferroviários de carga identificador numérico e capacidade de carga Os vagões devem ter uma propriedade adicional capaz de indicar se estão em uso ou não Em seguida escreva um programa capaz de ler este arquivo e armazenar os vagões em um arranjo Por fim o programa deve marcar como em uso 4 vagões com capacidade para mais de 5000 Kg e imprimir a relação completa dos vagões Dinâmica D7 Altere o arquivo texto da dinâmica D6 para conter tanto locomotivas quanto vagões Reescreva o programa da dinâmica D6 para prever as locomotivas Explore polimorfismo na sua solução Resumo do que vimos até agora O que são arquivos O que são arquivos de dados O contexto histórico dos arquivos Como ler um arquivo não formatado Como ler um arquivo formatado Exercício de fixação Um exercício envolvendo todos os conceitos vistos nesta aula Relembrando o conteúdo do vídeo anterior O que são arquivos O que são arquivos de dados O contexto histórico dos arquivos Como ler um arquivo não formatado Como ler um arquivo formatado Integrando conceitos O objetivo deste vídeo é apresentar um exercício resolvido que integre todos os conteúdos vistos até aqui Nas dinâmicas 6 e 7 criamos uma garagens de elementos de trens O exercício irá utilizar estes elementos já desenvolvidos como ponto de partida na construção de um sistema de criação de composições ferroviárias um trem Os próximos Slides apresentam a especificação deste exercício Sistema de composição de trens Uma empresa ferroviária necessita de um sistema que a ajude a montar as composições ferroviárias trens de que necessita para atender as viagens programadas Conforme a viagem o trem precisa de vagões de passageiros eou de carga Alguns destes vagões podem ser locados inteiros e outros não assim como alguns são refrigerados e outros não Os vagões e locomotivas livres ficam estacionados em uma garagem A medida que são selecionados são retirados da garagem e incorporados ao trem Os trens ficam estacionados em um pátio de manobras A montagem do trem segue uma série de regras específicas detalhadas na sequencia Regras de composição de um trem A indicação da locomotiva é feita na criação do trem Não existe trem sem locomotiva A locomotiva é sempre o primeiro elemento a ser inserido e não pode ser retirado Não pode haver mais de uma locomotiva por trem As locomotivas podem puxar 2 vagões a cada 100 Hp Um vagão refrigerado conta como 2 normais exige mais potencia Vagões só podem ser inseridos e retirados no final do trem Vagões de carga tem de ser sempre os últimos Só podem haver no máximo 2 vagões locáveis por trem Frota atual A frota atual deve ser carregada a partir de um arquivo texto As quantidades de carros de cada tipo podem variar mas a configuração dos carros atualmente segue o exposto abaixo Note que estas informações são para criação do arquivo texto Não implicam em restrições nas classes Capacidade dos vagões de carga 2000 5000 ou 10000 toneladas Capacidade dos vagões de passageiro 70 120 ou 180 passageiros Potencia das locomotivas entre 500 e 1000 HP múltiplos de 100 Temperatura mínima da refrigeração 3 graus 10 graus 20 graus Formato do arquivo Como formato de arquivo sugerese um csv Cada linha deve ter o seguinte formato idtipopotenciacapCargaqtdadePasstempMinvalorLocação Onde tipo LO VC VP VR VL LO locomotiva VC vagão de carga VP vagão passageiros VR vagão de carga refrigerado VL vagão de passageiros locável OBS os valores que não dizem respeito ao tipo devem ser preenchidos com 0 zero ATENÇÃO cuide para não deixar mais de uma linha em branco ao final do arquivo Menu do sistema O sistema deve ter opções para 1 Listar os carros livres na garagem 2 Inserir um vagão indicando o id 3 Remover o último carro se for a locomotiva cancela o trem 4 Fim OBS O trem será criado automaticamente O estado atual do trem deve ser exibido a cada alteração Módulos O sistema deve ser desenvolvido em 3 módulos 1 Carrosjs Contem toda a hierarquia de classes e interfaces relacionadas aos carros 2 Composicoesjs Contem a Garagem o Trem e o Patio 3 Appjs Contém o programa principal Resumo do que vimos até agora Aplicação de herança Aplicação de polimorfismo na herança Aplicação de polimorfismo estrutural Aplicação de exceções Aplicação de arquivos TRANSFERÊNCIA EXTERNA CheckPoint Considere o texto que segue Arquivos são um tipo de estrutura para armazenamento de dados Entre suas esta o fato de que os dados podem ser compartilhados entre No caso específico de podemos citar ainda o fato de que eles podem ser facilmente em editores de textos comuns A alternativa que completa corretamente as lacunas é a não volátil vantagens programas diferentes bancos de dados criados mas não editados b volátil vantagens contextos de mesmo nível bancos de dados editados mas não criados c não volátil vantagens programas diferentes arquivos texto criados e editados d volátil desvantagens métodos distintos bancos de dados criados mas não editados e não volátil desvantagens contextos de mesmo nível arquivos texto criados e editados TRANSFERÊNCIA EXTERNA