arcanum_jp’s blog

おっさんの日記

「第21回 DDD(ドメイン駆動設計)勉強会in仙台 」に参加しました

ブログ書くまでが勉強会です!書くの忘れてました!どうも、この手の知識はなんと2010年近辺に仕入れた知識を使いまわしていて、いい加減ヤバイと思いつつあるarcanum_jpです。

DDD(ドメイン駆動設計)についての勉強会です。

今回は「オブジェクト指向エクササイズ」を取り上げます。

オブジェクト指向エクササイズを通じて、優れたオブジェクト指向設計の原理を学び、、DDD実践に役立てましょう。

http://connpass.com/event/28737/?utm_campaign=event_reminder&utm_source=notifications&utm_medium=email&utm_content=title_link

こちらに参加しました。オブジェクト指向エクササイズと言うものが面白そうだなと思い。ソシラボで毎週DDD関連をやっているのは知っていつつ、なかなかいけなかったのもありますが。


前半はコンパスの説明にも会ったとおり、オブジェクト指向エクササイズの9つの指針を説明です。


1.1つのメソッドにつきインデントは1段階までにすること
2.else 句を使用しないこと
3.すべてのプリミティブ型と文字列型をラップすること
4.1行につきドットは1つまでにすること
5.名前を省略しないこと
6.すべてのエンティティを小さくすること
7.1つのクラスにつきインスタンス変数は2つまでにすること
8.ファーストクラスコレクションを使用すること
9.Getter, Setter, プロパティを使用しないこと

どれもウンウンとうなるようなことばかりです。え?そう思います?アナタ!自分は2、9は少なくとも「なんで?」って思いました。だって、CheckStyleなんか起動していると、、else句無ぇのがーー悪い子イネがー!って警告でますもん。これは単発のifとelseのようなものではなく、ifとelse ifでつながったような文(たぶんswitchもですね)なんかは、オブジェクト指向の多態を使った設計があるんでないの?って事です。まぁそうだよね。if書いたら負けだと思っている。


 Getter/Setterについても、当日イミュータブルについての言及はありましたが、たとえばgetXX()と言う表現は、その変数を管理しているクラスが変数の処理を他のオブジェクトに任せると言う事で、処理を書く場所が実は間違っているんジャマイカというところまで行き着きまっせってことでした。


 たとえば、バスケのゲームを作るとして、スコアの値を管理しているのがBoardクラスとすると、そこにgetScore()とsetScore()を定義する。なんの変哲もないようだけど、バスケにおいてはスコアを足しこむのは、通常のゴール、3ポイントシュート、フリースローとあったりしますが、これらの処理をBoardクラスではなく、他のクラスがsetScore(getScore() + 1)としてしまい、本来、スコアを管理すべきクラスはどこでんねん!って事です。素直にBoardクラスにthreePoint(),freeThrow(), goal()てメソッドを用意してスコアの管理をBoardクラスに任せなさいって事です。


 自分が面白いと思ったのは「すべてのプリミティブ型と文字列型をラップすること」と言うルールで、以前、enumJavaに取り入れられる前にint型の定数を定義するのだったら、個別のクラスの型を定義した定数を作った方がいいよ(静的に解決できて分かりやすい)って雑誌で読んで、なるほどーーって思ったのがあったりして、面白かったです。ぜひとも(自分の中に)取り入れたいなと思いました。


 といいつつ、舌の根が乾かないうちに、現実問題、プロジェクト内でこういったオブジェクト指向のそもそも論をどのように取り入れていくかってのが難しいよね・・とか思いました。たしかにプリミティブ型を一掃していったら、型による解決が出来るけど、自分がいるようなSierなんかでは設計書とコードの管理コストのほうが上がってしまうなと思ったり、そもそもそういう設計を理解してくれる人がいるかどうか?とか思ったりと色々と感じることはありました。

 でも、そういう事を思うこと自体が実は自分の限界なんだろうなと、そう思うことによって、設計の天井を下げていたりしているのかもと思ったりもしました。知識自身をアップデートしなきゃならんですね。いくつか勉強会の中で本が紹介されたので、読んでみようかと思います。