Percursos
/
JavaScript
JavaScript
/
Exercícios
/
Sensores da fábrica
Sensores da fábrica

Sensores da fábrica

Exercício de aprendizagem

Introdução

Erros

Os erros são úteis para assinalar quando algo corre mal ou acontece algo inesperado num programa ou num excerto de código.

São objetos JavaScript.

A principal propriedade deste objeto é message:

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

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

Com a sintaxe throw, podes lançar um erro.

throw new Error('Oops');

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

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

Herança

A herança é uma forma de criar relações pai-filho entre classes. A classe filha (por vezes designada subclasse) tem acesso ao comportamento e aos dados definidos pela classe pai (por vezes designada 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 através da cadeia de protótipos.

Os objetos criados pelo construtor da classe filha terão o protótipo da classe pai na 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

Tal como acontece com qualquer classe em JavaScript, as subclasses podem herdar de Error para criar erros personalizados com a palavra-chave extends. A sintaxe instanceof verifica se o erro capturado é uma instância de uma determinada subclasse 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

A Elena é a nova responsável pela qualidade de uma fábrica de jornais. Como acabou de chegar à empresa, decidiu analisar alguns dos processos da fábrica para ver o que poderia ser melhorado. Descobriu que os técnicos fazem muitos controlos de qualidade à mão. Vê aí uma boa oportunidade de automatização e pede-te a ti, um programador independente, para desenvolveres um software que monitorize algumas das máquinas.

1. Monitoriza o nível de humidade da sala

A tua primeira missão é escrever um software para monitorizar o nível de humidade da sala de produção. Já existe um sensor ligado ao software da empresa que devolve periodicamente a percentagem de humidade da sala.

Precisas de implementar uma função no software que lance um erro se a percentagem de humidade for demasiado alta. A função deve chamar-se checkHumidityLevel e receber a percentagem de humidade como parâmetro.

Deves lançar um erro (a mensagem não é importante) se a percentagem exceder 70%.

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

2. Deteta o sobreaquecimento

A Elena ficou muito satisfeita com a tua primeira tarefa e pede-te para tratares da monitorização da temperatura das máquinas. Enquanto conversas com um técnico, o Greg, ele diz-te que, se a temperatura de uma máquina exceder 500 °C, os técnicos começam a preocupar-se com o sobreaquecimento.

A máquina está equipada com um sensor que mede a sua temperatura interna. Deves saber que o sensor é muito sensível e avaria com frequência. Nesse caso, os técnicos terão de o substituir.

A tua tarefa é implementar uma função reportOverheating que recebe a temperatura como parâmetro e lança um erro se o sensor estiver avariado ou se a máquina começar a sobreaquecer. Como vais precisar mais tarde de reagir de forma diferente consoante o erro, precisas de um mecanismo para distinguir os dois tipos de erro. Podias basear-te nas mensagens de erro, mas isso tornaria o teu código frágil, pois deixaria de funcionar se a mensagem fosse atualizada. Por isso, para o fazeres corretamente, vais lançar instâncias de classes de erro diferentes.

  • Se o sensor estiver avariado, a temperatura será null. Nesse caso, deves lançar um ArgumentError.
  • Quando tudo funciona, se a temperatura exceder 500 °C, deves lançar um OverheatingError. Esta classe de erro será instanciada com um argumento de temperatura. Certifica-te de que o OverheatingError que lanças tem uma propriedade throw associada.
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. Monitoriza a máquina

Agora que a tua máquina consegue detetar erros, vais implementar uma função que reage a esses erros de formas diferentes:

  • Se o sensor estiver avariado, tens de avisar um técnico
  • Se a temperatura for demasiado alta, ou desligas a máquina se a temperatura exceder 600 °C, ou acendes uma luz de aviso se for inferior a isso.
  • Se ocorrer outro erro, voltas a lançá-lo.

Implementa 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 está avariado.
alertOverheating uma função. Acende uma luz de aviso na máquina.
shutdown uma função. Desliga a máquina.

A função monitorTheMachine(actions) deve chamar internamente check(). Se isso correr bem, a função não deve devolver nada. Se isso lançar um erro, espera-se um comportamento diferente:

exceção comportamento esperado
ArgumentError chamar a função alertDeadSensor.
OverheatingError executar o protocolo de sobreaquecimento.
(qualquer outra coisa) voltar a lançar o erro

Protocolo de sobreaquecimento Se a temperatura for inferior a 600 °C, acende a luz de aviso chamando a função alertOverheating. Se a temperatura exceder 600 °C, a situação é crítica, por isso chama a função shutdown.

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Sensores da fábrica?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.