エンジニア的なネタを毎週書くブログ

東京でWebサービスの開発をしています 【英語版やってみました】http://taichiw-e.hatenablog.com/

持論:Application Layerがシンプルなコードは読みやすい

DDDでは全てのビジネスロジックドメインクラスに、とのことなので当然プログラムの肝はドメインクラスなのですが、

コードの読みやすさは8割がたアプリケーションレイヤで決まると思っています。
Springで言えば、Controllerから呼ばれるServiceクラスの、はじめに呼ばれるメソッドです。
f:id:taichiw:20171112172552p:plain

ここがいかにスッキリ、整然と、必要なことのみが書かれているかで、プログラム全体の可読性が決まると言っても過言ではないと思います。
具体的には、このメソッドの行数が10行を超えていたら、既に随分怪しい香りがしている…と思います。


何故ならば、このクラスは(一般的なWebページ、あるいはWeb APIを想定した時に)、
そのURLに対して実行されるふるまいが書かれる箇所であり、普通そのふるまいは、せいぜい3-4ステップで説明できるからです。

例えば、

1. 条件に合う「A」を(DBなどから)検索
2. 同じく、条件に合う「B」を検索
3. AとBをルールに合わせて結合・加工
4. 出来上がった結果を返却

と言った感じです。

(細かく見れば内部はもっと複雑でしょうが、この程度の長さで説明できないふるまいであれば、そもそも一つのURLで扱うには重すぎです)

さて、例えば上記のように4ステップで表されるふるまいであれば、アプリケーションレイヤの(最初のメソッドの)コードは理想的には4行で書かれるべきです。


人がコードを通しで読む場合、普通は頭から読んでいくケースが多いと思います。
その際、アプリケーションの先頭がスッキリ書かれていることで、そのエンドポイント全体の振る舞いを把握することができ、それ以降の理解がしやすくなると思います。


【追記】
1. 「普通は頭から読んでいくケースが多いと思います」ということで、当然一番上のコントローラがスッキリしていることも重要です。ただし、コントローラはサービスクラスと違って明確にロールが決められているため、そこまで酷いことにはなりにくいように思われます。*1
2. 主役たるドメインクラスはもちろん重要です。…が、適切な命名がなされたメソッドがあれば*2、最悪中が多少複雑だったりゴチャゴチャしていても概要をつかむことは可能です。一方、外側が整理されていないと、まず概要をつかむことができません。

*1:Struts時代には酷いActionクラスをたくさん見ました。酷いものはインフラ層が滲み出ていました。 …とはいえ、さすがに今時はそんなことはないかと

*2:ドメインクラスに適切な名前がつけられる人のアプリケーションレイヤはそもそもきっときれいなのですが…(逆も然り)