## 1
ムニエルと申します。
よろしくお願いします。
## 2
先日、このようなニュースを目にしました。
全国の約半数の公立小中学校では、いまだにエアコンがない教室で授業を受けているのだそうです。
日本の夏は徐々に暑くなっているという話もありますし、エアコンのない生活は考えられませんよね。
僕も、家にいるときは基本的にエアコンをつけて過ごしています。
## 3
エアコンといえば、子供の頃、エアコンの動作について疑問に思っていたことがあります。
## 4
それは、「エアコン本体とリモコンの温度設定にズレが生じるのではないか」ということです。
「何を馬鹿なことを」とお思いかもしれませんが、具体例をお見せしましょう。
## 5
現在、エアコンとリモコンの温度はともに28度です。
## 6
ここで、エアコンのほうを向かずに……
## 7
リモコンの下ボタンを押しました。
## 8
すると、リモコンの温度が1度下がり、27度になりました。
エアコンの温度は変わりません。
## 9
ここで、エアコンのほうを向いたうえで……
## 10
改めて、リモコンの上ボタンを押しました。
## 11
すると、リモコンの温度が1度上がり、28度になりました。
そして、エアコンの温度も1度上がり、29度になりました。
## 12
結果として、エアコン本体とリモコンの温度設定にズレが生じてしまいました。
## 13
このような動作を、Node.jsによるプログラムで再現してみました。
## 14
なんちゃってオブジェクト指向で、5つのクラスが登場します。
エアコン、リモコンの抽象クラス、それらを継承する普通のリモコン、ポンコツリモコン、そしてそれらを使うユーザーです。
それでは、順番に見ていきましょう。
## 15
こちらはエアコンのクラスです。
エアコンは、電源と温度の2つの状態を持っています。
初期状態はオフで、28度です。
## 16
こちらはリモコンの抽象クラスです。
リモコンは、エアコンと紐づいています。
初期状態はエアコンと同じです。
リモコンには、3つのボタンがあります。
電源ボタン、上ボタン、下ボタンです。
ただしこのクラスは抽象クラスですので、直接呼び出すとエラーを投げるようにしています。
## 17
こちらは、普通のリモコンのクラスです。
先程のリモコンクラスを継承しています。
電源ボタンを押したとき、「エアコンの電源の状態を自身、つまりリモコンと同じ状態にする」という信号を送ります。
上ボタンを押したとき、「エアコンの温度の状態をリモコンと同じ状態にする」という信号を送ります。
下ボタンを押したときも同じです。
## 18
つまり、普通のリモコンでは、リモコンと同じ状態にする信号を送信します。
## 19
一方こちらは、ポンコツリモコンのクラスです。
電源ボタンを押したとき、「エアコンの電源の状態を今の状態の反対にする」という信号を送ります。
つまり、電源がオンのときはオフにして、オフのときはオンにするということです。
上ボタンを押したとき、「エアコンの温度の状態を1度上げる」という信号を送ります。
下ボタンを押したとき、「エアコンの温度の状態を1度下げる」という信号を送ります。
## 20
つまり、ポンコツリモコンでは、エアコンの状態を相対的に変化させる信号を送信します。
## 21
こちらは、エアコンを使うユーザーのクラスです。
ユーザーはできることが多いので、一つずつ見ていきましょう。
## 22
ユーザーは、「エアコンのほうを向いているか」というステータスを保持しています。
最初はエアコンのほうを向いていません。
## 23
こちらは、「エアコンとリモコンの温度を見る」という動作です。
一般的なエアコンでは本体に温度表示はないかもしれませんが、この人は謎の力で見ることができます。
## 24
こちらは、「エアコンのほうを向く」という動作です。
そのままですね。
## 25
こちらは、「エアコンの電源ボタンを押す」という動作です。
エアコンの電源の状態を、今の状態の反対にします。
## 26
こちらは、「リモコンの電源ボタンを押す」という動作です。
まずリモコンの電源の状態を、今の状態の反対にします。
そしてもしエアコンのほうを向いていれば、電源ボタンを押したという信号をエアコンに送ります。
信号の中身がどういうものなのかは、使っているリモコンが普通のリモコンなのか、ポンコツリモコンなのかによります。
## 27
こちらは、「リモコンの上ボタンを押す」という動作です。
まずリモコンの温度を1度上げます。
そしてもしエアコンのほうを向いていれば、上ボタンを押したという信号をエアコンに送ります。
## 28
こちらは、「リモコンの下ボタンを押す」という動作です。
まずリモコンの温度を1度下げます。
そしてもしエアコンのほうを向いていれば、下ボタンを押したという信号をエアコンに送ります。
## 29
これらのクラスを用いて、普通のリモコンとポンコツリモコンの動作を比較してみましょう。
現在、エアコンの温度とリモコンの温度はともに28度です。
ここで、リモコンの下ボタンを押します。
すると、リモコンの温度が1度下がり、27度になりました。
エアコンの温度は変わりません。
おっと、エアコンのほうを向いていなかったぞということで、エアコンのほうを向いたうえで、今度はリモコンの上ボタンを押します。
すると、リモコンの温度が1度上がり、28度になりました。
普通のリモコンでは、 エアコンの温度がリモコンに合わせて28度になりました。
一方ポンコツリモコンでは、エアコンの温度も1度上がり、29度になりました。
## 30
結果として、ポンコツリモコンでは、エアコン本体とリモコンの温度設定にズレが生じてしまいました。
## 31
今回の結論としては、プログラムを実装するときは期待される仕様をよく考えようということです。
## 32
ちなみに、実際のエアコンでは、リモコンのボタンを押したときすべての状態をまとめてエアコンに送っているらしいです。
## 33
* [エアコン本体とリモコンの温度設定にズレが生じる問題〜プログラムによる再現〜 - ムニエルブログ](https://blog.munieru.jp/entry/2017/07/30/015754)
* [エアコンのリモコン学習で知っておくべき事](https://greenworksjp.com/blog/learn-aircon/)