最近コードを書くときに考えていること

最近Rubyを書くことから少し離れてKotlinをメインに書くようになったので、最近どんな事を考えてコードを書いているか書いてみる。

ValueObjectに注目する

とにかくクラスをサボらず作る。そうすると大体はValueObjectになる。ロジックの置き場はとにかくValueObjectにおいていく(というか自然な場所を探すと大体そうなる気がする)
Listみたいなコレクションもクラスにラップする。区分の組み合わせから値を導き出すとかよくあるロジックだけど、抽象度がだいぶ低いので隠して名前をつけたい。
具体的な例で言うとOpenID Connectのresponse_typeとか。

response_typeの例

openid-foundation-japan.github.io

OpenID Connectの仕様によると、response_type(3種類の列挙値)は組み合わせ可能で、組み合わせによって選択されるフローがかわる。しかも存在しない組み合わせもある(!)
ResponseTypesにListみたいなのをもたせて GrantType grantType() みたいなメソッド生やすのが良いのかなーとか思ったり。

永続化層をできるだけ意識させない

RDBに保存するとかHibernateやMybatis使うとかそのへんをあまり意識させないようにする。infrastructure層から外にライブラリの都合を出したくないなー。ORMを置き換えたりデータストアを置き換えるのはそうそうないと思うけど、なんだか気持ち悪いや。
生やすメソッドはRDBのRepositoryならjava.util.Listっぽいかんじ。RedisみたいなKVSならMapっぽい感じのメソッドがあるとよさそう〜。あとfindByXXX系のfinder系のメソッド。
Transactionはapplication層でかけちゃうけどこれいいのかな・・・これってインフラ都合じゃね・・・?とか思わなかったり。

クラスの依存関係に気を配る

ArchUnitを入れてレイヤー間の依存関係、サブパッケージ間の循環依存に気を配れるようにする。テストが落ちたらなにかモデリングがまずそうなので考え直す。

値の範囲に気をつける

ValueObjectの取りうる範囲が分かっていると考えることが一気に減るので考えるのが楽になる。区分なら列挙だし、期間なら小さい日付から大きい日付の間、個数なら0以上、X以下になりそう。
システムのリプレースならGROUP BYやMIN/MAXをDBに打って値の取りうる範囲を見つける。まぁ大体変な値が入っていてDBのお掃除をするところから始まったりする。 GROUP BYを打ったら謎の区分が出てきて膝から崩れ落ちる回とかも発生しがちなので心を強く持つ。
BIG QUERYにデータが乗っているとかあれば、NOT LIKE '%XXX%' みたいな感じでバリデーションかけられるか調べてみても良さそう。BIG QUERYなら謎の技術でめっちゃ早い。indexとか存在しない世界なのでとりあえず殴っていける。

おわり

たぶんこんな事考えながらコードを書いたりしてる。ところでDDDの境界付けられたコンテキストの概念難しいんだけど、おれきゅーさんにおしえてくれませんか?😭