「プログラマが知るべき97のこと/ステートに注目する」の版間の差分

削除された内容 追加された内容
X meta (トーク | 投稿記録)
編集の要約なし
編集の要約なし
 
7行目:
| next =
| notes =Kevlin Henney(編)、和田卓人(監修)『プログラマが知るべき97のこと』(オライリー・ジャパン、2010年)を出典とする。各エッセイは[http://creativecommons.org/licenses/by/3.0/us/deed.ja CC-by-3.0-US]によってライセンスされている。
[[Category:プログラマが知るべき97のこと|すてえとにちゆうもくする]]
}}
「ステート(状態)」というものについて、世間の人は面白い感覚を持っているようです。
41 ⟶ 42行目:
コードを明解なものにするために、{{code|isComplete}}メソッドはやはり必要でしょうが、その内容は次のようなものにすべきです。
 
<syntaxhighlight lang="java">
{{スタブ}}
public boolean isComplete() {
return hasShipped();
}
</syntaxhighlight>
 
仕事をしていると、必要なチェックが抜けているコード、冗長なチェックをしているコードは頻繁に目にします。上の例は大したものではありませんが、キャンセルや払い戻しが絡んでくると、もっと複雑になるでしょう。ステートを適切に扱う必要性がさらに高まるからです。上の例の場合、注文のステートは次の3つに明確に分かれることになります。
 
* 進行中 : 注文の追加、削除はできない。商品の発送もできない。
* 決済済み : 注文の追加、削除はできないっ商品の発送は可能。
* 発送済み : 注文処理がすべて完了。変更は一切受けつけない。
 
ステートは非常に重要です。何か操作をしようとすれば、まず現在どのステートにいるかを確認する必要があります。その時々のステートによってできる操作とできない操作があるからです。しようとした操作が、そのステートではできないものであれば、ステートが変わるのを待つ必要があります。そうして、常にステートに合った操作だけが行われるようにすることで、オブジェクトを保護するわけです。
 
ステートに関しては、具体的にどういうことを注意すべきでしょうかの必要な処理を一つ一つ別のメソッドに分け、どれも必要な時だけ呼び出す、というのは、出発点としてはとても良いですが、あくまで出発点であり十分とは言えません。基本は、「ステートマシン」という考え方を理解することでしょう。そういえば学校でそういうことを習った覚えがあるけれど、もう何だか忘れてしまった、という人もいるでしょうが、そういう人もこれを機会に改めて勉強し直してください。さほど難しいものではありません。図を描くなどすれば、理解しやすくなるはずです。また、図があれば、他の人とステートマシンについて話をするのも簡単です。コードを書くときには、テスト駆動開発で個々の操作に適合するステート、適合しないステート、ステート間の遷移の適切さを確かめながら開発し、実行時に常にステートが正しく保たれるようにしましょう。Stateパターンについても学び、それが十分に理解できたら、「契約による設計 (Designby Contract)」などについても学ぶといいでしょう。そうした知識があれば、入力データをチェックし、ステートがそれに合ったものになっているかを確認するのに役立ちます。さらに、publicメソッドの処理開始時と終了時のオブジェクトのステートが妥当なものになっているかの確認などにも役立つはずです。
 
ステートが不適切になる時があるようなら、それはバグです。処理を中断しなければ、データが破壊されてしまう危険があります。ステートチェックのコードが多くて煩わしく感じられるなら、ツールを利用するか、コード生成、ウィーピング、アスペクト技術の使用等について検討するなどして、それが隠れるようにすればいいでしょう。どのようなアプローチをとるにしても、ステートに注目して考えれば、コードをよりシンプルに、そして堅牢にすることにつながります。