Trilhas
/
JavaScript
JavaScript
/
Exercícios
/
Sensores de fábrica
Sensores de fábrica

Sensores de fábrica

Exercício de aprendizagem

Introdução

Erros

Os erros são úteis para avisar quando algo está errado ou inesperado em um programa ou em um trecho de código.

Eles são objetos do JavaScript.

A principal propriedade desse objeto é message:

const error = new Error('Oops, something went wrong');

console.log(error.message);
// => "Oops, something went wrong"

Com a sintaxe throw, você pode lançar um erro.

throw new Error('Oops');

Quando um erro é lançado, a execução atual é interrompida e continua no primeiro bloco catch da pilha de chamadas.

try {
  throw new Error('Oops');
} catch (error) {
  console.log(error.message);
  // => "Oops"
}

Herança

Herança é uma forma de criar relações pai-filho entre classes. A classe filha (às vezes chamada de subclasse) tem acesso ao comportamento e aos dados definidos pela classe pai (às vezes chamada de superclasse).

class Pet {
  constructor(name) {
    this.name = name;
  }

  introduce() {
    console.log(`This is my pet, ${this.name}.`);
  }
}

class Dog extends Pet {}

const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.

A palavra-chave extends na declaração da classe filha estabelece uma relação com a classe pai por meio da cadeia de protótipos.

Os objetos criados pelo construtor da classe filha terão o protótipo da classe pai em sua cadeia de protótipos, o que dá acesso a quaisquer métodos ou dados definidos pela classe pai.

const dog = new Dog('Otis');

Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true

Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false

Assim como qualquer classe em JavaScript, as subclasses podem herdar de Error para criar erros personalizados usando a palavra-chave extends. A sintaxe instanceof verifica se o erro capturado é uma instância de uma subclasse específica de Error.

class CustomError extends Error {}

try {
  // ... Code that may throw an error
} catch (error) {
  if (error instanceof CustomError) {
    console.log('The error thrown is an instance of the CustomError');
  }
}

Instruções

Elena é a nova gerente de qualidade de uma fábrica de jornais. Como acabou de chegar à empresa, ela decidiu revisar alguns dos processos da fábrica para ver o que poderia ser melhorado. Ela descobriu que os técnicos fazem muitas verificações de qualidade à mão. Ela vê aí uma boa oportunidade de automação e pede a você, desenvolvedor freelancer, que crie um software para monitorar algumas das máquinas.

1. Monitore o nível de umidade da sala

Sua primeira missão é escrever um software para monitorar o nível de umidade da sala de produção. Já existe um sensor conectado ao software da empresa que retorna periodicamente a porcentagem de umidade da sala.

Você precisa implementar uma função no software que lance um erro se a porcentagem de umidade estiver alta demais. A função deve se chamar checkHumidityLevel e receber a porcentagem de umidade como parâmetro.

Você deve lançar um erro (a mensagem não é importante) se a porcentagem passar de 70%.

checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error

2. Detectar superaquecimento

Elena ficou muito satisfeita com sua primeira tarefa e pede que você cuide do monitoramento da temperatura das máquinas. Enquanto conversa com um técnico, Greg, você fica sabendo que, se a temperatura de uma máquina passar de 500°C, os técnicos começam a se preocupar com superaquecimento.

A máquina é equipada com um sensor que mede sua temperatura interna. Você deve saber que o sensor é muito sensível e quebra com frequência. Nesse caso, os técnicos precisarão trocá-lo.

Sua tarefa é implementar uma função reportOverheating que recebe a temperatura como parâmetro e lança um erro se o sensor estiver quebrado ou se a máquina começar a superaquecer. Sabendo que mais tarde você precisará reagir de forma diferente dependendo do erro, você precisa de um mecanismo para diferenciar os dois tipos de erro. Você poderia se basear nas mensagens de erro, mas isso deixaria seu código frágil, pois ele quebraria se a mensagem fosse atualizada. Então, para conseguir fazer isso direito, você vai lançar instâncias de classes de erro diferentes.

  • Se o sensor estiver quebrado, a temperatura será null. Nesse caso, você deve lançar um ArgumentError.
  • Quando tudo funcionar, se a temperatura passar de 500°C, você deve lançar um OverheatingError. Essa classe de erro será instanciada com um argumento de temperatura. Certifique-se de que o OverheatingError que você lançar tenha uma propriedade de temperatura anexada a ele.
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. Monitorar a máquina

Agora que sua máquina consegue detectar erros, você vai implementar uma função que reage a esses erros de maneiras diferentes:

  • Se o sensor estiver quebrado, você precisa avisar um técnico
  • Se a temperatura estiver alta demais, você vai desligar a máquina se a temperatura passar de 600°C ou acender uma luz de aviso se for menor que isso.
  • Se outro erro acontecer, você vai relançá-lo.

Implemente uma função monitorTheMachine que recebe um argumento actions.

actions é um objeto que tem 4 propriedades:

propriedade descrição
check uma função. Verifica a temperatura da máquina. Pode lançar vários erros.
alertDeadSensor uma função. Avisa um técnico de que o sensor de temperatura da máquina morreu.
alertOverheating uma função. Vai acender uma luz de aviso na máquina.
shutdown uma função. Vai desligar a máquina.

A função monitorTheMachine(actions) deve chamar check() internamente. Se isso passar, a função não deve retornar nada. Se isso throw um erro, espera-se um comportamento diferente:

exceção comportamento esperado
ArgumentError chamar a função alertDeadSensor.
OverheatingError executar o protocolo de superaquecimento.
(qualquer outra) relançar o erro

Protocolo de superaquecimento Se a temperatura for menor que 600 °C, acenda a luz de aviso chamando a função alertOverheating. Se a temperatura passar de 600 °C, a situação é crítica, então chame a função shutdown.

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
Editar via GitHub O link abre em uma nova janela ou aba
JavaScript Exercism

Tudo pronto para começar Sensores de fábrica?

Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.