面倒臭いオブジェクト詰め替え
オニオンアーキテクチャ、クリーンアーキテクチャなどの階層化されたアーキテクチャを使用する際、レイヤーの境界でオブジェクトの値を詰め替える必要性が発生します。 オブジェクトを詰め替えることでレイヤーの依存関係を断ち切り、一度書いた後の保守性を高めることに大きく貢献するのですが、筆者の観測範囲では単調作業に感じるせいかかなり嫌われる傾向があるように感じます。
そして、そのような詰替を嫌うばかりにオブジェクト詰め替えをやめてしまうこともありますが、それは非常にもったいないことです!!
なぜなら、「初期実装の数分の重要性 <<<< その後の保守性の重要性」だからです。
なので、できればきちんと詰め替えしてレイヤーの依存関係を保って欲しい、ということで、そのために詰め替えが超簡単にできる方法をご紹介します。
まずはデモご覧ください。
class Entity( val propertyA: String, val propertyB: String, val propertyC: String, val propertyD: String ) class Dto( val propertyA: String, val propertyB: String, val propertyC: String, val propertyD: String )
属性は4つと、比較的項目数が少ないオブジェクトですが、これを詰め替えるのにどれくらいかかるでしょうか。
IDEのマルチカーソル機能を使うと、10秒でできます。
まずは動画をご覧ください。IntelliJでのデモです。
(10秒は若干盛ってます、すみません。笑)
いかがでしょう。これくらい簡単であれば、手間を惜しまずやる気持ちになれるのではないでしょうか。
解説
MacでのIntelliJの場合のコマンドを紹介します。
(機能としてはIntelliJに限りません。例えばVS Codeであればこちらの記事で紹介されています。他のIDEやエディタの場合はコマンドを読み替えてください。)
使用する機能は以下の機能です。
マルチカーソル(Add Selection for Next Occurrence)
マウスを使ったマルチカーソル(Multiple Cursors)
まず、Ctl + G
でval
を同時選択します。
その後カーソルを1回右にずらしてからoption + shift + →
でプロパティ名を同時選択し、Cmd + C
でコピーします。
次に、Dto内に貼り付けたら、option
を2回押したまま↑
で複数行選択状態にし、=
を入力します。
最後に、entity.
と入力後にCmd + V
で貼り付けます。この際、マルチカーソルでのコピーが残っているので複数行にそれぞれの行の値が貼り付けられます。
この方法を使えば、属性数が倍になってもほぼ同等の時間で実装できます。
他の手法との比較
なお、コードを手で書かずにライブラリを使って詰め替えをするケースもあります。 もちろんその方法でも問題ないのですが、内部的にリフレクションを使っているため、属性の増減や変数名変更による問題がランタイムでしか発見できないことがあります。 直接詰め替えるとそのような場合にコンパイルですぐに気づけるという利点があるので、私は今回紹介した方法で直接詰め替えを実装するのがおすすめです。
好みの問題もあると思いますので、まずはお手元で試してみてください!
アーキテクチャについての解説
「詰め替えが必要」とだけ言及したアーキテクチャに関しては、こちらを読んでいただけるとわかりやすいと思います。
初めてDDDを学ぶ方、もしくは実際に着手して難しさにぶつかっている方向けの書籍です。 迷子になりがちな「DDDの目的」や「モデル」の解説からはじめ、具体的なモデリングを行い実装まで落とす事例を元に、DDDの魅力や効果を体感することを目指します。よろしければお求めください。
現場での導入で困ったら
DDDを導入しようとすると結構試行錯誤に時間がかかります。
現場で導入してすぐに効果を発揮したい!!という方向けに、基礎解説とライブモデリング/コーディングを行う勉強会の開催や、設計相談を受付ております。
事例紹介もあるのでご関心あれば覗いてみてください。開催形式は柔軟に対応できるのでお気軽にご相談ください。
YouTubeで10分でわかるDDD動画シリーズをアップしています。概要を動画で理解したい方はこちらもどうぞ。チャンネル登録すると新しい動画の通知を受け取ることができます。