トラック
/
JavaScript
JavaScript
/
演習
/
工場のセンサー
工場のセンサー

工場のセンサー

学習演習

はじめに

エラー

プログラムやコードに何か問題があったり、予想外のことが起きたとき、それを報告するのにエラーは役立ちます。

エラーはJavaScriptのオブジェクトです。

このオブジェクトの主なプロパティはmessageです。

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

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

throw構文を使うと、エラーを投げることができます。

throw new Error('Oops');

エラーが投げられると、現在の実行は中断され、コールスタック内の最初のcatchブロックから再開されます。

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

継承

継承は、クラス間に親子の関係を作る方法です。 子クラス(_サブクラス_とも呼ばれます)は、親クラス(_スーパークラス_とも呼ばれます)で定義された振る舞いとデータにアクセスできます。

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.

子クラスの宣言にあるextendsキーワードは、プロトタイプチェーンを通じて親クラスとの関係を確立します。

子のコンストラクターで作られたオブジェクトは、プロトタイプチェーンに親クラスのプロトタイプを持つため、親クラスで定義されたメソッドやデータにアクセスできます。

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

JavaScriptの他のクラスと同様に、サブクラスはextendsキーワードを使ってErrorを継承し、カスタムエラーを作ることができます。 instanceof構文を使うと、捕まえたエラーが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');
  }
}

説明

エレナは新聞工場の新しい品質管理責任者です。入社したばかりの彼女は、工場のいくつかの工程を見直し、改善できる点がないか確かめることにしました。 調べてみると、技術者たちが多くの品質チェックを手作業で行っていることがわかりました。 彼女はそこに自動化の絶好のチャンスを見出し、フリーランスのエンジニアであるあなたに、いくつかの機械を監視するソフトウェアの開発を依頼します。

1. 部屋の湿度を監視する

最初の任務は、生産室の湿度を監視するソフトウェアを書くことです。社内のソフトウェアにはすでにセンサーが接続されていて、部屋の湿度のパーセンテージを定期的に返してくれます。

湿度のパーセンテージが高すぎる場合にエラーを投げる関数を、ソフトウェアに実装する必要があります。 関数の名前はcheckHumidityLevelとし、湿度のパーセンテージを仮引数として受け取ります。

湿度が70%を超えたらエラーを投げてください(メッセージの内容は重要ではありません)。

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

2. 過熱を検知する

エレナは最初の仕事をとても気に入り、次は機械の温度の監視を任せたいと言います。 技術者のグレッグと雑談していると、機械の温度が500°Cを超えると、技術者たちは過熱を心配し始める、と教えられます。

機械には、内部温度を測るセンサーが取り付けられています。 このセンサーはとても繊細で、よく壊れてしまうことを覚えておいてください。 壊れてしまった場合は、技術者が交換する必要があります。

あなたの仕事は、温度を仮引数として受け取り、センサーが壊れているとき、または機械が過熱し始めたときにエラーを投げる関数reportOverheatingを実装することです。 あとでエラーの種類に応じて違う対応をする必要があるので、2種類のエラーを区別する仕組みが要ります。 エラーメッセージに頼ることもできますが、メッセージが更新されると壊れてしまうので、コードがもろくなります。 そこで、きちんと区別できるように、異なるエラークラスのインスタンスを投げます。

  • センサーが壊れていると、温度はnullになります。 この場合は、ArgumentErrorを投げてください。
  • すべてが正常に動いているとき、温度が500°Cを超えたら、OverheatingErrorを投げてください。 このエラークラスは、温度を引数としてインスタンス化されます。 投げるOverheatingErrorに、temperatureプロパティが付いていることを確認してください。
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. 機械を監視する

機械がエラーを検知できるようになったので、次はそのエラーに応じてさまざまな対応をする関数を実装します。

  • センサーが壊れている場合は、技術者に警告する必要があります
  • 温度が高すぎる場合は、600°Cを超えていれば機械を停止し、それ未満であれば警告灯を点けます。
  • それ以外のエラーが起きた場合は、そのエラーをそのまま投げ直します。

引数actionsを受け取る関数monitorTheMachineを実装してください。

actionsは、4つのプロパティを持つオブジェクトです。

property description
check 関数。機械の温度をチェックします。さまざまなエラーを投げる可能性があります。
alertDeadSensor 関数。温度センサーが壊れていることを技術者に知らせます。
alertOverheating 関数。機械の警告灯を点けます。
shutdown 関数。機械の電源を切ります。

monitorTheMachine(actions)関数は、内部でcheck()を呼び出します。 問題なければ、この関数は何も返しません。 呼び出しでエラーがthrowされた場合は、次のように動作します。

exception expected behaviour
ArgumentError alertDeadSensor関数を呼び出します。
OverheatingError 過熱プロトコルを実行します。
(それ以外) エラーを投げ直します

過熱プロトコル 温度が600°C未満であれば、alertOverheating関数を呼び出して警告灯を点けます。 温度が600°Cを超えていれば状況は危機的なので、shutdown関数を呼び出します。

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
JavaScript Exercism

工場のセンサーを始める準備はできましたか?

Exercismに登録すれば、37個のコンセプト159個の演習、そして本物の人間によるメンタリングとともに、JavaScriptを学んでマスターできます。すべて無料です。