メモこの記事を読んでなるほどな〜と思ったので記事にしてみる。medium.com依存性逆転とは雑にいうと実装ではなくインターフェイスに依存させ、モジュール間の依存関係を疎結合にする手法。Principleと呼ばれ、頭文字をとってDIPとすることが多い。www.martinfowler.comElmではDIPをどう表現するか一般的な静的型付け言語ではインターフェイス相当の言語機能が提供されている。Scalaだとtraitだし、Javaだとinterfaceあたり。Elmにはそれらがない。msg上のPersistScoreがインターフェイス相当になっている。Scoreを受け取り、なんらかの手段で永続化を行うCmd型に変換するインターフェイスである。詳しくellieで用意されているTODOアプリを例にする。実際のコードのリンクは以下。https://ellie-app.com/7Z52XPNmbfca1IncrementとDecrementに加えて、データの永続化を行うSaveというメッセージが新しく定義されている。Saveメッセージを受け取ると、何らかの方法で現在のcountの永続化を実行する。)update関数は第一引数に永続化のためのアダプタを受け取るため、main関数での繋ぎこみの際に実装を差し込む。ここでは実装はlocalStorageへの永続化を行うlocalStoragePersisterになる。}この実装はupdate関数がPortに依存しないため、テストの際に以下のようなモックの関数を渡してupdate関数内部でのPort呼び出しの挙動などをテストできるようになる。Portに依存しなくなることでピュア度が増すし、テストもしやすくなる。Cmd.noneこのようなPortの抽象化は、Portをたくさん使うプロダクトになればなるほど、意外に必要な場面が出てくる。完全な抽象化は難しいしかし、この抽象化はあまり完全なものであるとは言えない。実際にありえるかは分からないが「開発環境ではLocalStorageへ永続化するが、本番環境ではWebAPIへ永続化する」のような機能を抽象化するのは少し無理がある。そもそも、PortはElmランタイムに処理を投げて終わりであるのに対して、HTTPリクエストの場合にはTaskの結果としてResult型を受け取る必要がある。メッセージとしてリクエストの結果を受け取らないことが許されてないため、そもそもPortとTaskでモノが違うだろというハナシになってくる。PortとのデータのやりとりがTaskで行えるようになればちょっとは可能性が出てくるが、あまり可能性はないと考えてよいだろう。Repositoryさーて、お待ちかねのROM.rb入門の第3回はRepositoryから。(8)はてなブログをはじめよう!IzumiSyさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。