Read, Write モード. クラスにモードを取り入れ、利用できるメソッドを制限する 〜クラス設計メモ

概略

  • 集約やEntityのような、状態変更のあるモデルを参照系で利用する際に、状態変更を起こすメソッドを呼び出せてしまうのが気になる
  • 参照系のユースケースの際や、計算用のモデルに集約を渡す際には同じモデルを参照用途のみで利用できるようにしたい
  • generalized typed constraint を利用して、状態変更のあるモデルに Read モード, Write モードを導入する

本文

実務では使ったことはないのですが、ちょっとしたアイデアとして考えてみようと思います。 やりたいイメージとしては、更新可能なモデルに対して、ReadモードとWriteモードを定義し、Writeモードの時だけ更新メソッドを呼べるようにしたいといった感じです。

まずは Mode を定義します。

gist.github.com

これと generalized typed constraints を利用して実現します。 ものすごくシンプルに作るとこんな感じですね。

gist.github.com

型パラメータに Mode を受け取っています。MWrite の時のみ、setValue メソッドは呼び出せます。 Read モードの時に setValue メソッドを呼ぼうとすると、コンパイルエラーになります。

Readモードの時は、setValueメソッドを呼ぶことができない

今回の例はシンプルなものでしたが、モードを使うことで不用意に呼び出せなくする方法を考えてみました。 個人的には結構面白いなと思いつつ、そんな不用意に更新しちゃう人いないよなという気もしてるので冗長な気もしてます。