重厚な名前をつけてみましたが、内容はゆるふわです。
Scalaには色々な革新的な機能が導入されていますが、あえて日々のプログラミングで一番重要な機能は?と考えていくとケースクラスですよね。
ケースクラスは便利なので、なんにでも使いたくなってしまいますが、最近原則めいたことが分かってきたので、日々のプログラミング時の個人的な指針としています。
ケースクラスは直積
ケースクラスの利用方法を考える上で重要な指針となるのは、ケースクラスは「直積」という点です。Scalaでは直積はProductというトレイトで表現しますが、ケースクラスもこのProductが自動的にmixinされます。
また、直積に関連して代数的データ型という観点も重要です。このあたりの事情は「クラウド温泉3.0 (3) / 代数的データ型 on Scala」にも書きました。
原則
直積、代数的データ構造といった数学的な構成要素がケースクラスの土台になっているすると、ケースクラスではこの土台を揺るがすようなコーディングは慎むのが安全策です。
土台を揺るがす要因は以下の2点です。
- 更新可能な変数を持っている
- インヘリタンスで後付で振る舞いの変更が可能
これを避けるためには、ケースクラスは以下の使い方に留めるのが安全策となります。
- ケースクラスは不変オブジェクトの実装に用いる。
- インヘリタンスはsealedを用いて適用範囲を限定する。
つまり、ケースクラスは純粋関数型の範囲で使うということですね。
逆に、ケースクラス的な使い方をするクラスでも、不変オブジェクトではない場合はあえてケースクラスにしないというコーディングをします。こうすることによって、このコーディング方針を知っていれば、プログラムの意図が明確になりプログラムの可読性があがります。
以上、ゆるふわ指針でした。
0 件のコメント:
コメントを投稿