【DDD・ドメイン駆動設計】Scalaでリポジトリ・IDなどを型パラメータで縛る意味
- k_bigwheel
- 6996
- 15
- 3
- 0
@Tanaka9230 @j5ik2o 大きいのはカプセル化を破壊するという点でしょうか。github.com/ixias-net/ixia… 例えば今回のixiasの件ですと、Idは何らかのTaggedTypeであるという制約がついてます。この制約は本来Entityのユーザーは意識する必要がないものですが、型引数だとRepositoryの実装などに漏れだしています。(続
2019-03-07 09:59:24@Tanaka9230 ああ、その要約すごくいいですね! まさに僕の気持ちはそんな感じです 👍
2019-03-07 10:01:23@Tanaka9230 @j5ik2o 継)もし後の改修でIdに制約を追加したいとなった場合、本来関知する必要が無いクラスまで修正する必要が出てきます。型メンバーを使った場合、これをEntityに閉じる事が可能です。アンチパターンというより、同じことをやるのにより適した方法があるよ、という感じですね。(続
2019-03-07 10:03:42@Tanaka9230 @j5ik2o で、じゃあJavaでどうするの?って件ですが、これは型引数でやるしかなくて、典型的なのはStream APIのCollectorの第二型引数ですね。 docs.oracle.com/javase/jp/8/do… Collectorsの殆どで第二型引数が?になっています。これは本来使う側が知る必要の無い実装詳細を関知させなければならないあらわれですね
2019-03-07 10:13:03@j5ik2o @Tanaka9230 全面的にかとじゅんさんの意見に賛成します。 基底クラスとして捉えるのではなくて機能のmix-inとして捉えれば十分有用に機能すると思います。 僕の2回の失敗は、両方共Repositoryの基底クラスとして置いてしまったことにありました。
2019-03-07 11:24:12@j5ik2o @Tanaka9230 mix-inとして捉えたときの「リスコフの置換原則」上どう捉えるかですが、オブジェクト指向的な継承ではなくコード断片(メソッド)のmix-inになるので「リスコフの置換原則」の範疇外となり問題ない、というのが今の僕の考えです。
2019-03-07 11:27:44@k_bigwheel @Tanaka9230 こう考えると”継承”は使う機会減りましたね。extendsですがmix-inしてるというのもすこし違和感を覚えることが増えました。RustというかScala3みたいな委譲に誘導する設計スタイルのほうがいいですね。
2019-03-07 12:00:58@j5ik2o @Tanaka9230 そうなんですそうなんです! mix-inなので A is B である必要はないんですが、scala2では構文上mix-inの場合でも A is B にならざるを得ないんですよねー。 でもScala3でなにか改善入りそうなんですか、それは期待だ 😄
2019-03-07 12:16:34@tototoshi こちら社内弁護士に確認しました。該当のソースコードヘッダー部分にApacheのライセンス明記と、再利用元、参考にした箇所の明記を追加させていただきますね。よろしくお願いします。
2019-03-07 14:39:18DDDで貢献といえばこれ github.com/scalikejdbc/dd… いくつか言ったようにEntityやIdentifierのtraitあるの特にすごく良いとも思ってないが、依存ライブラリの更新だけ自分ずっとやってるけど、そう思ってるなら中途半端に更新やらずに、(他の人がこれ以上改善する気ないなら)アーカイブとかするべきか?
2019-03-07 16:06:17