設計における状態遷移の考え方
設計するときにクラスの責務とかドメインでの振る舞い方とかそういうのでクラスを分割するっていうのはやってたけど、状態遷移は考えてなくて、そういうの考えるといいよって教えてもらったので、状態遷移を考える上で大切なことをめも
状態、状態遷移とは
ここで言う状態は一番小さい単位だと変数、大きい単位だとインスタンスのプロパティの組み合わせとかを指す
状態遷移は、取りうる状態の変化を表す
状態を複雑にしない
大切なこと一つ目は、クラスの状態を複雑にしないこと
例をしめす
// 複雑なクラス
class Price {
int price;
int tax;
int price;
int taxInPrice;
String priceText;
}
// 良いクラス
class Price {
int price;
int tax;
}
上の2つのクラスの違いは何かというと、不正な状態があり得るのか否か
複雑なクラスだと、price=1000、priceText=2000円みたいな不正な状態になりえる
そうならないように必要最低限の変数を持ち、他のほしい値は持ってる変数の組み合わせで表現するようにする
先程の例だとtaxInPriceとかgetTaxInPriceをはやして、その中で税込みかかくを返すようにする
冪等性を持つ
ここでいう冪等性とはメソッドを実行したときに同じ結果が返ってくる、常に同じ状態になることを指す
冪等性を持つことでクラスの状態遷移を隠蔽する事ができ、利用者側の処理を必要以上に複雑にすることがなくなる
循環をなるべく持たない or 循環を小さくする
ここでいう循環とはある状態から別の状態に遷移したあとに、またもとの状態に戻ることを指す
循環がある場合、先程の冪等性の話ともかぶるが今どの状態なのかを利用者側側は都度確認しなければならない
例えば音楽プレイヤーは再生中、停止中という循環する状態も持っており、再生ボタンを押したときに、状態に応じて挙動が変わる
循環を持たないことで利用者側の実装をシンプルにすることができる
またどうしても循環を持たないと行けないというときは循環を可能な限り小さくしたほうが利用者の実装がシンプルになる
まとめ
状態遷移を考えるときは以下の3つを気をつけるとシンプルな実装になる
- 状態を複雑にしない
- 冪等性をもつ
- 循環をさせない
この記事が気に入ったらサポートをしてみませんか?