「天気に応じてLEDの点灯パターンを変える - Mae向きなブログ」では、Raspberry PiからYahoo天気予報のピンポイント天気にアクセスし、現在の時刻の天気に応じてLEDの点灯パターンを変えるスクリプトを作成しました。
このスクリプトでは、まだ「曇り」の場合しか実装していませんが、今後、「晴れ」、「雨」、「雪」などといろんな天気を追加していくにつれ、case文の条件が長くなってしまいます。実は前回作成したときにこの問題点に気付いてはいたのですが、つい安易な実装で済ませていました。
このような場合には、デザインパターンのStateパターンを使った方が良いと思い改善してみました*1。
get_yahoo_weather2.rb
天気の状態を増やすには
「晴れ」のとき、LEDを5回点滅させるという動作を追加したいとき、Stateクラスを継承した「S晴れ」クラスを作成し、動作をdoメソッドの中に書いていくことになります。
class S晴れ < State def do io 5.times { io.digital_write(LED, WiringPi::HIGH) sleep 0.5 io.digital_write(LED, WiringPi::LOW) sleep 0.5 } end end
前回のプログラムでは、天気の状態を増やす場合は、以下のcase文を増やしていく必要がありましたが、
weather = get_weather case weather when "晴れ" # …
Rubyでは、文字列から動的にクラスを取得しインスタンスを生成することができるので、天気の状態を増やしても以下(63,64行目)は変更する必要がありません。ただクラス名はアルファベットの大文字で始まらなければならないので、'S'を天気の前に追加しています。
weather = get_weather Object.const_get("S#{weather}").new.do(io)
参考
*1:Contextの役が出てきてないので、厳密にいうとStateパターンではないのかもしれません