From fc8594a440b435ce3b30d26079ef6bc76f475981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tain=C3=A1=20Soares?= Date: Tue, 25 Jan 2022 14:20:04 -0300 Subject: [PATCH 1/2] =?UTF-8?q?Heran=C3=A7a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- semana18/aula53/.gitignore | 4 ++ semana18/aula53/package.json | 28 +++++++++ semana18/aula53/respostas.md | 85 +++++++++++++++++++++++++++ semana18/aula53/src/Light/Client.ts | 14 +++++ semana18/aula53/src/app.ts | 20 +++++++ semana18/aula53/src/class/Customer.ts | 22 +++++++ semana18/aula53/src/class/User.ts | 37 ++++++++++++ semana18/aula53/src/index.ts | 42 +++++++++++++ semana18/aula53/tsconfig.json | 17 ++++++ 9 files changed, 269 insertions(+) create mode 100644 semana18/aula53/.gitignore create mode 100644 semana18/aula53/package.json create mode 100644 semana18/aula53/respostas.md create mode 100644 semana18/aula53/src/Light/Client.ts create mode 100644 semana18/aula53/src/app.ts create mode 100644 semana18/aula53/src/class/Customer.ts create mode 100644 semana18/aula53/src/class/User.ts create mode 100644 semana18/aula53/src/index.ts create mode 100644 semana18/aula53/tsconfig.json diff --git a/semana18/aula53/.gitignore b/semana18/aula53/.gitignore new file mode 100644 index 0000000..8ece3ba --- /dev/null +++ b/semana18/aula53/.gitignore @@ -0,0 +1,4 @@ +node_modules +package-lock.json +build +.env \ No newline at end of file diff --git a/semana18/aula53/package.json b/semana18/aula53/package.json new file mode 100644 index 0000000..0e9df8c --- /dev/null +++ b/semana18/aula53/package.json @@ -0,0 +1,28 @@ +{ + "name": "aula53", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "ts-node-dev ./src/index.ts", + "start": "tsc && node ./build/index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@types/knex": "^0.16.1", + "cors": "^2.8.5", + "dotenv": "^14.3.0", + "express": "^4.17.2", + "knex": "^1.0.1", + "mysql": "^2.18.1" + }, + "devDependencies": { + "@types/cors": "^2.8.12", + "@types/express": "^4.17.13", + "@types/node": "^17.0.12", + "ts-node-dev": "^1.1.8", + "typescript": "^4.5.5" + } +} diff --git a/semana18/aula53/respostas.md b/semana18/aula53/respostas.md new file mode 100644 index 0000000..c0e2082 --- /dev/null +++ b/semana18/aula53/respostas.md @@ -0,0 +1,85 @@ +# Aula 53 - Herança e Polimorfismo + + + +-----------------------------------------------**HERANÇA**----------------------------------------------- + +### Exercício 1 + +a)Seria possível imprimir a senha (password) atrelada a essa instância? +* Não, pois não foi criado um método getter para gerar a visualização desse atributo. + + +b)Quantas vezes a mensagem "Chamando o construtor da classe User" foi impressa no terminal? +* Apenas uma vez. + + + +### Exercício 2 + +a)Quantas vezes a mensagem "Chamando o construtor da classe Customer" foi impressa no terminal? +* Apenas uma vez. + + +b)Quantas vezes a mensagem "Chamando o construtor da classe User" foi impressa no terminal? Por quê? +* Apenas uma vez. + + + +### Exercício 3 +a)Seria possível imprimir a senha (password) atrelada a essa instância? Por quê? +* Não, pois é uma informação privada e e não existe, ainda, nenhum método para visualizar essa informação. + + + +-----------------------------------------------**POLIMORFISMO**----------------------------------------------- + +### Exercício 1 + +a)Quais propriedades você conseguiu imprimir? Teve alguma que não foi possível? Por que isso aconteceu? +* Todas as propriedades, porém o método ***calculateBill*** por ser uma função(método), só é possível ver seu valor invocando a ***variável.método***. + + +### Exercício 7 +Criar um endpoint com as especificações: +* Deve ser um GET (/movie/search); +* Deve receber o termo de busca como uma query string (/movie/search?query=); +* Faz a busca entre todos os filmes que tenham o termo de busca no nome ou na sinopse. Além disso, a lista deve vir ordenada pela data de lançamento. + +Função de retornar o filme pelo termo de busca no nome ou sinopse: + +**MÉTODO RAW** +``` +const returnTermo = async(palavra:string):Promise => { + const resultado = await connection.raw(` + SELECT * FROM Movies + WHERE title LIKE "%${palavra}%" OR synopsis LIKE "%${palavra}%" + ORDER BY launch_date ASC; + `) + return resultado[0] +} +``` + +**QUERY BUILDER** +``` +const returnTermo = async(palavra:string):Promise => { + const resultado = await connection("Movies") + .where("title", "like", `%${palavra}%`) + .orWhere("synopsis", "like", `%${palavra}%`) + .orderBy('launch_date'); + + return resultado +} +``` + +Requisição: +``` +app.get("/movie/search", async(req:Request, res:Response) => { + try { + const movies = await returnTermo(req.query.palavra as string) + res.status(200).send(movies) + } catch (error: any) { + res.status(400).send({message:error.message}) + } +}) +``` \ No newline at end of file diff --git a/semana18/aula53/src/Light/Client.ts b/semana18/aula53/src/Light/Client.ts new file mode 100644 index 0000000..8a045ed --- /dev/null +++ b/semana18/aula53/src/Light/Client.ts @@ -0,0 +1,14 @@ +export interface Client { + name: string; + // Refere-se ao nome do cliente + + registrationNumber: number; + // Refere-se ao número de cadastro do cliente na concessionária + // como se fosse um id + + consumedEnergy: number; + // Refere-se à energia consumida pelo cliente no mês + + calculateBill(): number; + // Retorna o valor da conta em reais + } \ No newline at end of file diff --git a/semana18/aula53/src/app.ts b/semana18/aula53/src/app.ts new file mode 100644 index 0000000..9159606 --- /dev/null +++ b/semana18/aula53/src/app.ts @@ -0,0 +1,20 @@ + +import express, {Express} from 'express' +import cors from 'cors' +import { AddressInfo } from 'net'; + +const app: Express = express(); + +app.use(express.json()); +app.use(cors()); + +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address() as AddressInfo; + console.log(`Server is running in http://localhost:${address.port}`); + } else { + console.error(`Failure upon starting server.`); + } +}); + +export default app \ No newline at end of file diff --git a/semana18/aula53/src/class/Customer.ts b/semana18/aula53/src/class/Customer.ts new file mode 100644 index 0000000..9ac012d --- /dev/null +++ b/semana18/aula53/src/class/Customer.ts @@ -0,0 +1,22 @@ +import { User } from "./User"; + +export class Customer extends User { + public purchaseTotal: number = 0; + private creditCard: string; + + constructor( + id: string, + email: string, + name: string, + password: string, + creditCard: string + ) { + super(id, email, name, password); + console.log("Chamando o construtor da classe Customer"); + this.creditCard = creditCard; + } + + public getCreditCard(): string { + return this.creditCard; + } +} \ No newline at end of file diff --git a/semana18/aula53/src/class/User.ts b/semana18/aula53/src/class/User.ts new file mode 100644 index 0000000..c8ffe0e --- /dev/null +++ b/semana18/aula53/src/class/User.ts @@ -0,0 +1,37 @@ +export class User { + private id: string; + private email: string; + private name: string; + private password: string; + + constructor( + id: string, + email: string, + name: string, + password: string + ){ + console.log("Chamando o construtor da classe User") + this.id = id + this.email = email + this.name = name + this.password = password + } + + public getId(): string { + return this.id + } + + public getEmail(): string { + return this.email + } + + public getName(): string { + return this.name + } + + public introduceYourself():string{ + return `Olá, sou ${this.name}. Bom dia!` + } +} + + diff --git a/semana18/aula53/src/index.ts b/semana18/aula53/src/index.ts new file mode 100644 index 0000000..55db642 --- /dev/null +++ b/semana18/aula53/src/index.ts @@ -0,0 +1,42 @@ +import { Customer } from "./class/Customer"; +import { User } from "./class/User"; +import { Client } from "./Light/Client"; + + /*HERANÇA */ +//---------------------------------------------------------------------------------------------// +// //Exercício 1 +// const newUser = new User("99999","joao@email.com", "Joao", "123456") +// console.log(newUser.getId()) +// console.log(newUser.getEmail()) +// console.log(newUser.getName()) + +// //Exercício 2 +// const newCustomer = new Customer("99999","joao@email.com", "Joao", "123456","225633251463") +// console.log(newCustomer.getCreditCard()) + +// //Exercício 3 +// const otherCustomer = new Customer("99999","joao@email.com", "Joao", "123456","225633251463") +// console.log(otherCustomer.getId()) +// console.log(otherCustomer.getEmail()) +// console.log(otherCustomer.getName()) +// console.log(otherCustomer.getCreditCard()) +// console.log(otherCustomer.purchaseTotal) + +// //Exercício 4 e 5 +// console.log(otherCustomer.introduceYourself()) + + + /*POLIMORFISMO */ +//---------------------------------------------------------------------------------------------// +//Exercício 1 +const client:Client = { + name: "Carlos", + registrationNumber: 123456789, + consumedEnergy: 25, + calculateBill : () => { + return 2 + } +} + +console.log(client) +console.log(client.calculateBill()) \ No newline at end of file diff --git a/semana18/aula53/tsconfig.json b/semana18/aula53/tsconfig.json new file mode 100644 index 0000000..eacbb43 --- /dev/null +++ b/semana18/aula53/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "sourceMap": true, + "outDir": "./build", + "rootDir": "./src", + "removeComments": true, + "strict": true, + "noImplicitAny": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true + + } +} \ No newline at end of file From a48f5c85482d433db59e7cd40cbd5c2067da4a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tain=C3=A1=20Soares?= Date: Wed, 26 Jan 2022 15:24:43 -0300 Subject: [PATCH 2/2] Finalizando aula53 --- semana18/aula53/respostas.md | 57 ++++++------------------ semana18/aula53/src/Light/Client.ts | 50 ++++++++++++++++++++- semana18/aula53/src/Light/Residents.ts | 60 ++++++++++++++++++++++++++ semana18/aula53/src/index.ts | 45 +++++++++++++------ 4 files changed, 156 insertions(+), 56 deletions(-) create mode 100644 semana18/aula53/src/Light/Residents.ts diff --git a/semana18/aula53/respostas.md b/semana18/aula53/respostas.md index c0e2082..16397e2 100644 --- a/semana18/aula53/respostas.md +++ b/semana18/aula53/respostas.md @@ -40,46 +40,17 @@ a)Quais propriedades você conseguiu imprimir? Teve alguma que não foi possíve * Todas as propriedades, porém o método ***calculateBill*** por ser uma função(método), só é possível ver seu valor invocando a ***variável.método***. -### Exercício 7 -Criar um endpoint com as especificações: -* Deve ser um GET (/movie/search); -* Deve receber o termo de busca como uma query string (/movie/search?query=); -* Faz a busca entre todos os filmes que tenham o termo de busca no nome ou na sinopse. Além disso, a lista deve vir ordenada pela data de lançamento. - -Função de retornar o filme pelo termo de busca no nome ou sinopse: - -**MÉTODO RAW** -``` -const returnTermo = async(palavra:string):Promise => { - const resultado = await connection.raw(` - SELECT * FROM Movies - WHERE title LIKE "%${palavra}%" OR synopsis LIKE "%${palavra}%" - ORDER BY launch_date ASC; - `) - return resultado[0] -} -``` - -**QUERY BUILDER** -``` -const returnTermo = async(palavra:string):Promise => { - const resultado = await connection("Movies") - .where("title", "like", `%${palavra}%`) - .orWhere("synopsis", "like", `%${palavra}%`) - .orderBy('launch_date'); - - return resultado -} -``` - -Requisição: -``` -app.get("/movie/search", async(req:Request, res:Response) => { - try { - const movies = await returnTermo(req.query.palavra as string) - res.status(200).send(movies) - } catch (error: any) { - res.status(400).send({message:error.message}) - } -}) -``` \ No newline at end of file +### Exercício 2 +a)Mesmo sabendo que não é possível, tente criar uma instância dessa classe (ou seja: new Place(...)). Qual foi o erro que o Typescript gerou? +* RESPOSTA DO TYPESCRIPT : "Cannot create an instance of an abstract class.". + +b)Pense e responda: o que precisaríamos fazer para conseguir efetivamente criar uma instância dessa classe? +* Para criar uma instância de uma classe abstrata precisamos declarar uma classe filha e criar uma instância dessa última + + +### Exercício 3 +a)Por que a Place não é uma interface? +* Place é uma classe porque precisa ter um acesso restrito a um dos seus atributos, o que é impossível de se fazer em interfaces. + +b)Por que a classe Place é uma Classe Abstrata? +* Por fim, ela é abstrata por um motivo simples. O nosso sistema possui 3 tipos de lugares e preferimos criar uma classe para representar cada um deles. Então não há motivos para querermos instanciar um objeto do tipo Place porque, no nosso contexto, todos os casos deles já estão cobertos por outras classes. Isso responde à terceira pergunta: Place é abstrata porque não enxergamos uma situação em que seria necessário criar uma instância dessa classe. diff --git a/semana18/aula53/src/Light/Client.ts b/semana18/aula53/src/Light/Client.ts index 8a045ed..a648578 100644 --- a/semana18/aula53/src/Light/Client.ts +++ b/semana18/aula53/src/Light/Client.ts @@ -1,3 +1,5 @@ +import { Industry, Residence } from "./Residents"; + export interface Client { name: string; // Refere-se ao nome do cliente @@ -11,4 +13,50 @@ export interface Client { calculateBill(): number; // Retorna o valor da conta em reais - } \ No newline at end of file + } + + +export class ResidentialClient extends Residence implements Client{ + + constructor( + public name:string, + public registrationNumber: number, + public consumedEnergy: number, + private cpf: string, + residentsQuantity:number, + cep: string + ){ + super(registrationNumber,cep) + } + + public getCpf(): string { + return this.cpf; + } + + public calculateBill(): number { + return this.consumedEnergy * 0.75; + } +} + + + +export class IndustrialClinet extends Industry implements Client { + constructor( + public name: string, + public registrationNumber: number, + public consumedEnergy: number, + private insdustryNumber: string, // tanto faz ser string ou number + machinesQuantity: number, + cep: string + ) { + super(machinesQuantity, cep); + } + + public getIndustryNumber(): string { + return this.insdustryNumber; + } + + public calculateBill(): number { + return this.consumedEnergy * 0.45 + this.machinesQuantity * 100; + } +} \ No newline at end of file diff --git a/semana18/aula53/src/Light/Residents.ts b/semana18/aula53/src/Light/Residents.ts new file mode 100644 index 0000000..deb0684 --- /dev/null +++ b/semana18/aula53/src/Light/Residents.ts @@ -0,0 +1,60 @@ +export abstract class Place { + constructor(protected cep: string) {} + + public getCep(): string { + return this.cep; + } +} + + + +//Representa uma casa residencial +export class Residence extends Place { + constructor( + protected residentsQuantity: number, + // Refere-se ao número de moradores da casa + + cep: string + ) { + super(cep); + } + + public getResidentsQuantity():number{ + return this.residentsQuantity + } +} + +//Representa um comércio + export class Commerce extends Place { + constructor( + protected floorsQuantity: number, + // Refere-se à quantidade de andares do lugar + + cep: string + ) { + super(cep); + } + + public getFloorsQuantity():number{ + return this.floorsQuantity + } +} + +//Representa uma indústria +export class Industry extends Place { + constructor( + protected machinesQuantity: number, + // Refere-se à quantidade de máquinas do local + + cep: string + ) { + super(cep); + } + + public getMachinesQuantity():number{ + return this.machinesQuantity + } +} + + + diff --git a/semana18/aula53/src/index.ts b/semana18/aula53/src/index.ts index 55db642..7830e4b 100644 --- a/semana18/aula53/src/index.ts +++ b/semana18/aula53/src/index.ts @@ -1,6 +1,7 @@ import { Customer } from "./class/Customer"; import { User } from "./class/User"; -import { Client } from "./Light/Client"; +import { Client} from "./Light/Client"; +import { Commerce, Industry, Place, Residence } from "./Light/Residents"; /*HERANÇA */ //---------------------------------------------------------------------------------------------// @@ -29,14 +30,34 @@ import { Client } from "./Light/Client"; /*POLIMORFISMO */ //---------------------------------------------------------------------------------------------// //Exercício 1 -const client:Client = { - name: "Carlos", - registrationNumber: 123456789, - consumedEnergy: 25, - calculateBill : () => { - return 2 - } -} - -console.log(client) -console.log(client.calculateBill()) \ No newline at end of file +// const client:Client = { +// name: "Carlos", +// registrationNumber: 123456789, +// consumedEnergy: 25, +// calculateBill : () => { +// return 2 +// } +// } + +// console.log(client) +// console.log(client.calculateBill()) + +//Exercício 2 + +// const newPlace: Place = new Place("22222222222") //Não pode pois é abstract + +//Exercício 3 + +/*Agora, crie uma instância de cada uma das classes novas. +Imprima no console o CEP de cada uma delas, através do método getCep herdado da classe Place.*/ + +const newResidence: Residence = new Residence(5,"123456789") +console.log(newResidence.getCep()) + +const newCommerce: Commerce = new Commerce(5,"987654321") +console.log(newCommerce.getCep()) + +const newIndustry: Industry = new Industry(5,"213546879") +console.log(newIndustry.getCep()) + +