isyumi_netブログ

isyumi_netがプログラミングのこととかを書くブログ

状態を管理しよう

プログラムには実行中にどんどん書き換わっていく変数と、使い捨てにされる変数がある。イメージしてほしいのは博士の愛した数式だ。あなたは日中に考えたことはすべて記憶しているが、毎晩寝る度に全部忘れてしまうとする。しかし、机にメモがおいてあり寝る前にそのメモに書き置きをする。そのメモに書いてあることは翌日必ず思い出すことができる。今日の話は、そのメモを整理整頓しようということだ。

例えば、おにぎりを売る会話のプログラムを考えてほしい。

  1. 相手からこんにちはというメッセージが送られてくる
  2. それに対してこんにちはと返事をし、あいさつ済フラグをTrueにする
  3. おにぎり3個くださいとメッセージが届く
  4. それに対して○○円ですと返事をし会話を終了する
  5. 挨拶していない人がおにぎりを要求してきたら無視する
  6. おにぎりの値段は時々変わる

大体のプログラムはこのように

  1. 何かの処理が始まるきっかけを待ち受ける
  2. 何かが起きたら特定の処理をする
  3. 終わったらまたきっかけを待ち受ける

という流れになっている。この時処理を始めるきっかけをイベントと呼ぶ。イベントには

  • ユーザーが画面をクリックした
  • ブラウザがサーバにアクセスした
  • サーバーがクライアントにプッシュ通知をした
  • 指定時刻に仕掛けて置いたタイマーが発動した

等がある。そして、イベンドが起きてから処理が終わり次のイベントの待ち受に入るまでを、ここでは1サイクルと呼ぶことにする(そんな一般用語はないので外で使うときには注意)。今日はサイクルとサイクルをまたぐ変数について話したい。とりあえず下記のコードを見てほしい。

状態変数にいろんなところからアクセスしている

 

aisatuとonigiriPriceはサイクルの度にどんどん書き換わっていく変数だ。ここでは状態変数と呼ぶことにする。おにぎりの合計金額を計算するところで使ったsum変数は使い捨ての変数だ。肌感覚で知っておいてほしいこととして、この状態変数の読み書きが散乱していると高確率でバグる。もしあなたが今までプログラミングをしてきて、なぜかそんなに難しいことをしているつもりはないのにだんだん機能修正が難しくなってくるように感じているなら、おそらくこの状態変数の持ち方が悪い。自分の中で「ソースコード上のどこで状態変数を読み書きするか」についてマイルールを作ることをお勧めする。下のコードを見てほしい。

 

状態変数の読み込みと書き込みを局所化

このコードは

  • onMessageの最初に状態変数を読み取り
  • 途中で新しい状態変数を生成し
  • 最後に上書きする

というルールで書き換えてみた。この程度の長さではあまり恩恵を実感しづらいが、このように「全体に影響する変数をどこで読み込みどこで書き込むか」をしっかり管理することが安全なコードを書くテクニックだ。参考にしてほしい。