Resultパターン(仮称)のモデリングの進捗状況

この記事は予備原稿です。

Resultパターン(仮称)は、もともとバリデーターを実装するときに、バリデーションの成功と失敗をクラスで表現するために考案したものですが、処理結果に「成功」と「失敗」があるロジックに広く応用が効くモデルであることが確認でき、共有したら有益だろうと考えたため、Qiita原稿にし共有する予定です。

原稿作成にあたって、Resultパターン(仮称)をモデリングしていきますが、本稿はその過程と頂いた質問をツイートを元にまとめたものです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これをベースにもっと単純化する <a href="https://twitter.com/hashtag/phper_oop?src=hash&amp;ref_src=twsrc%5Etfw">#phper_oop</a> <a href="https://t.co/BOuU3NTPh3">pic.twitter.com/BOuU3NTPh3</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062664972302376962?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターン(仮称)のモデルバージョン1ができた！進捗、ダメです…… <a href="https://twitter.com/hashtag/phper_oop?src=hash&amp;ref_src=twsrc%5Etfw">#phper_oop</a> <a href="https://t.co/wWuHjeuabY">pic.twitter.com/wWuHjeuabY</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062671952152645632?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターン(仮称)すこし進捗した😊<br>バージョン2はFailure Reasoning(失敗の理由付け)ができるようになったモデル <a href="https://twitter.com/hashtag/phper_oop?src=hash&amp;ref_src=twsrc%5Etfw">#phper_oop</a> <a href="https://t.co/hD4M3jRGcc">pic.twitter.com/hD4M3jRGcc</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062676705628762112?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">|｡･ω･) 。o (カンニング中…… <a href="https://twitter.com/hashtag/phper_oop?src=hash&amp;ref_src=twsrc%5Etfw">#phper_oop</a> <a href="https://t.co/ztyxC4I9oV">pic.twitter.com/ztyxC4I9oV</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062680134107332608?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターン(仮称)v3までできた。SuccessのときActionが作った値をクライアントが取得できるようになったモデル。あと10分しかないぞ。 <a href="https://twitter.com/hashtag/phper_oop?src=hash&amp;ref_src=twsrc%5Etfw">#phper_oop</a> <a href="https://t.co/dWr9b6LfrS">pic.twitter.com/dWr9b6LfrS</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062682172438413312?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">SuccessクラスのgetFailureReasonは例外を投げる以外にないよな……。ScalaのEitherもthrowしているからいいかな <a href="https://twitter.com/hashtag/phper_oop?src=hash&amp;ref_src=twsrc%5Etfw">#phper_oop</a> <a href="https://t.co/oAEWSRia84">pic.twitter.com/oAEWSRia84</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062683705737506816?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターン(仮称)が解決する問題は、<br>・結果がtrue/falseで暗黙的→意味のある型で表現<br>・PHPの戻り値型宣言はUnion型がないため型表明にできない→できる<br>・想定内なのに例外を使わざるを得ない→例外を使わなくて済む</p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062731825984851968?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">&gt;　想定内なのに例外を使わざるを得ない→例外を使わなくて済む<br><br>これだけでもありがたみが深い。<br>例内処理(想定内)で例外投げてるコード見るとげんなりします。。</p>&mdash; hiro (@hirodragon112) <a href="https://twitter.com/hirodragon112/status/1062735477315330048?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PHPだったらclassにしたいですが、TypeScriptなら成功時の型をinterfaceで型宣言した上でオブジェクトリテラルにするのがスマートな気がしますね</p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062732745971982336?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">TypeScriptでResultパターン(仮称)を実装したらジェネリクスやUnion型が使えるからもっと再利用性の高いパターンになると思う。PHPはそれらが無いから、似たようなコードを量産するのが現実論っていうジレンマはあるね。</p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062738314241830912?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターン(仮称)、PHPではGenericsがなくてデザインパターンのモデルを再利用しにくいと書いたけど、Genericsがある言語ならデザインパターンのモデルは二度と実装しなくてもいいくらい汎用的にできる。 <a href="https://t.co/93p6adJYcv">pic.twitter.com/93p6adJYcv</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062748973545353217?ref_src=twsrc%5Etfw">2018年11月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ResultパターンでRuntimeExceptionとLogicExceptionどっちを投げるか悩んでたが、RuntimeExceptionはコードを修正しても100%解決するわけでないとき、LogicExceptionはバグが原因なのでコードを修正したら100%直るやつという認識に至った。こちらの記事におせわになりました<a href="https://t.co/27knMUjEnr">https://t.co/27knMUjEnr</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062976924639621120?ref_src=twsrc%5Etfw">2018年11月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターンのv3はLogicExceptionを投げるように修正っと。 <a href="https://t.co/FBDjwvEQGv">pic.twitter.com/FBDjwvEQGv</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1062977230085664768?ref_src=twsrc%5Etfw">2018年11月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターンを値のバリデーションに応用したシンプルなモデルを作りました。他にも応用例を考えていきます。 <a href="https://t.co/524AtmxJTz">pic.twitter.com/524AtmxJTz</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1063789625112649728?ref_src=twsrc%5Etfw">2018年11月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Astah Professionalを使っています。StarUMLはUIが素敵なので使っていましたが、canvasの広さに上限があり大きな図を描くのに限界を感じたため、Astah Professionalに戻ってきました😅<a href="https://t.co/5rwi7CN312">https://t.co/5rwi7CN312</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1063794332283498496?ref_src=twsrc%5Etfw">2018年11月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターン(仮称)を認証ロジックに適応したモデルです。メールアドレスとパスワードで認証に成功したらアクセストークンがもらえるような認証を想定しました。 <a href="https://t.co/mWRUwh7iYc">pic.twitter.com/mWRUwh7iYc</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1063802517350318080?ref_src=twsrc%5Etfw">2018年11月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターンの大事な主目的をひとつ忘れていた。それは、プログラマにエラーへの注意を向けさせること。例外はcatchが任意なのに対し、Resultパターンは成功時の値を取り出す前に、処理結果がそもそも成功なのか失敗なのかを確認する必要があるため、エラーハンドリングへの注意が働きやすくなる。</p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1064916003866300416?ref_src=twsrc%5Etfw">2018年11月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PEAR::isError($result)の再来だ。Resultパターンを作りたくなる気持ちはめっちゃわかるんだけど、戻り値をfalseで返すとエラーメッセージが取れないって理由だけだったりするから、staticに呼び出せるMessageManager::addError()みたいなの作っても解決できると思う。嫌いな人はいるだろうけど。 <a href="https://t.co/XPIqY5IErE">https://t.co/XPIqY5IErE</a></p>&mdash; ひとフリ (@hitofuri140) <a href="https://twitter.com/hitofuri140/status/1064915994152394752?ref_src=twsrc%5Etfw">2018年11月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Resultパターンはエラー情報を格納するためのパターンと思われがちですが、このパターンの目的は、成功時の値を取り出すためには、エラーハンドリングをちゃんとしないといけないところにあります。それが例外や後付で呼び出せるエラーチェック関数とは設計理念が異なるところですね😊</p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1064918926398636032?ref_src=twsrc%5Etfw">2018年11月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>