little hands' lab

ドメイン駆動設計を布教したい

オブジェクト詰め替えが面倒臭い?マルチカーソルを使えば10秒でできます

面倒臭いオブジェクト詰め替え

オニオンアーキテクチャ、クリーンアーキテクチャなどの階層化されたアーキテクチャを使用する際、レイヤーの境界でオブジェクトの値を詰め替える必要性が発生します。 オブジェクトを詰め替えることでレイヤーの依存関係を断ち切り、一度書いた後の保守性を高めることに大きく貢献するのですが、筆者の観測範囲では単調作業に感じるせいかかなり嫌われる傾向があるように感じます。

そして、そのような詰替を嫌うばかりにオブジェクト詰め替えをやめてしまうこともありますが、それは非常にもったいないことです!!

なぜなら、「初期実装の数分の重要性 <<<< その後の保守性の重要性」だからです。

なので、できればきちんと詰め替えしてレイヤーの依存関係を保って欲しい、ということで、そのために詰め替えが超簡単にできる方法をご紹介します。

まずはデモご覧ください。

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でのデモです。

www.youtube.com

(10秒は若干盛ってます、すみません。笑)

いかがでしょう。これくらい簡単であれば、手間を惜しまずやる気持ちになれるのではないでしょうか。

解説

MacでのIntelliJの場合のコマンドを紹介します。
(機能としてはIntelliJに限りません。例えばVS Codeであればこちらの記事で紹介されています。他のIDEやエディタの場合はコマンドを読み替えてください。)

使用する機能は以下の機能です。

マルチカーソル(Add Selection for Next Occurrence)

マウスを使ったマルチカーソル(Multiple Cursors)

まず、Ctl + Gvalを同時選択します。
その後カーソルを1回右にずらしてからoption + shift + →でプロパティ名を同時選択し、Cmd + Cでコピーします。

f:id:little_hands:20210927091455g:plain

次に、Dto内に貼り付けたら、optionを2回押したままで複数行選択状態にし、=を入力します。

f:id:little_hands:20210927092230g:plain

最後に、entity.と入力後にCmd + Vで貼り付けます。この際、マルチカーソルでのコピーが残っているので複数行にそれぞれの行の値が貼り付けられます。

f:id:little_hands:20210927092803g:plain

この方法を使えば、属性数が倍になってもほぼ同等の時間で実装できます。

他の手法との比較

なお、コードを手で書かずにライブラリを使って詰め替えをするケースもあります。 もちろんその方法でも問題ないのですが、内部的にリフレクションを使っているため、属性の増減や変数名変更による問題がランタイムでしか発見できないことがあります。 直接詰め替えるとそのような場合にコンパイルですぐに気づけるという利点があるので、私は今回紹介した方法で直接詰め替えを実装するのがおすすめです。

好みの問題もあると思いますので、まずはお手元で試してみてください!

アーキテクチャについての解説

「詰め替えが必要」とだけ言及したアーキテクチャに関しては、こちらを読んでいただけるとわかりやすいと思います。

little-hands.booth.pm

初めてDDDを学ぶ方、もしくは実際に着手して難しさにぶつかっている方向けの書籍です。 迷子になりがちな「DDDの目的」や「モデル」の解説からはじめ、具体的なモデリングを行い実装まで落とす事例を元に、DDDの魅力や効果を体感することを目指します。よろしければお求めください。



また、ログラス社ではDDDを社として取り組んでいます。ご興味がある方は応募フォームからお問い合わせください。

求人詳細はこちら