以前ご紹介した通り、ギルドワークスではドメイン駆動設計(DDD)の勉強会を社内で行っています。その中で出てきた指摘に、ハッとする物があったので、今回はそれについて、ご紹介します。「それ、ソースコードに書いてないじゃん」それは、DDDを前提においたコードレビューで飛び出した指摘でした。コードはかなりシンプルな、ユーザからの投稿とそれに関する感想を閲覧する、といったサービスに関するものでした。いった場合、当然のように、『”投稿”がトップレベルのオブジェクトにあり、それにぶら下がる形で”感想”オブジェクトがある』という様なモデル化をしていました。このドメインにおいては、投稿もさることながら、投稿に対する感想の方がドメインにおける重要な関心事、なのでした。実装に構造を語らせるためにこの時、僕は軽く衝撃を受けました。「だって、ソースコード見てそのドメインの関心事が分からなければ、3年後見た時にわかると思う?」...はい、分かりませんよね。エヴァンスのDDD本に書いてあった、以下の一節は、そういうことを言っています。ある種の意思決定をすることによって、モデルと実装の協調が保たれ、互いがもう一方の効果を高めるようになる。第二章の導入よりモデルと実装が、協調している。モデル通りの実装になっているし、実装からモデルがわかる。そのモデルというのは、ただの設計構造ではなく、顧客の関心ごとを反映した「ドメイン」である、ということ。すればいいのか?「それに答えなんかないですよ。実験してみることです。確かに、ソースコードで物を語るには、クラスの所有関係を表すのが一番です。なんとなく、理屈で収まりがいいツリー構造を考えてしまいますが、勇気を持って構造を組み替えたりして、色々実験しなければなりません。確かに、DDDではリポジトリという形で、永続化処理をドメインから分離しています。することで、永続化層の理屈をドメインから分離し、ドメインの中で腹落ちするようなモデルを構築していくのですね。ドメインの設計を、ソフトウェアシステムにおけるその他の大量の関心事から分離することで、設計とモデルとのつながりが非常に明確になる。第二章の導入よりと、偉そうなことを書いていますが、私もまだまだ勉強中の身。これからも色々と実験を重ねていきたいと思います。ギルドワークスでは、こうやってドメインのあるべき構造を追い求めてくれるような、ギルドメンバーを引き続き募集中です!興味を持たれた方は、こちらからどうぞ。岳大コメントする井上です。DDD)のリファレンス本について紹介致しました。おかげさまで非常に多くの方にご覧頂いたようで、DDDの注目度を改めて感じました。出版され、日本におけるDDDへの注目度がさらに増しているように思います。私自身、普段からDDDを用いた開発を行っているので、日本語で多くのDDD情報が入手できることはとても嬉しい限りです。Design私自身、まだ購入したばかりで流し読みしか出来ていないのですが、簡単に紹介したいと思います。DDDパターン・原則・プラクティス本とは本書は、大きく4つのパートから構成されています。概要は以下の通りです。ついて戦術的パターンより戦略的パターンが先に紹介される構成となっており、その点はDDD実践本と同じですね。本書は792ページと非常にボリュームがあります。656ページであることと比較しても、そのボリュームがわかると思います。DDD本とDDD実践本のサンプルコードはJavaで記述されていましたが、本書はC#で記述されています。各パート・章のタイトルを見ていただければ、どのような内容になっているのかある程度想像がつくのではと思います。Book」で、本書の想定読者について触れています。以下、上記からの引用です。depth.ここでは、本書が「DDD本の代用品ではない」と明確に述べていますね。」という記述もあります。いう言い回しを使うことで、分かりやすさを強調しているのかなと解釈しました。本書は「DDD本を読むだけでは分かりづらかったDDDの概念を、わかりやすい文章と実践的なコード例を用いて解説する」という内容になっていると思います。著者が述べている通り、DDD本を既に読まれた方が、理解を深めるための副読本として読むのが良いのかもしれませんね。まとめ今回は、DDDパターン・原則・プラクティス本について簡単に紹介しました。DDDへの理解を深めるために有用そうな内容になっているので、少しづつ読み進めていきたいと思います。康廣コメントするギルドワークスさんとパートナーとして一緒にお仕事させていただいています木目沢(@pilgrim_reds)と申します。このような場で記事を書かせていただけることになりまして大変緊張しております。Beckが書いた「実装パターン」という本を紹介したいと思います。出版社の都合で絶版になってしまっているのですが、素晴らしい本ですので、もし手に取る機会がありましたらぜひ読んでみてください。この本のテーマは、「よいコードを書く方法」です。190ページという薄い本ながら、「よいコードを書く」ためのパターンが100個近く掲載されています。なにより素晴らしいのは、パターンを紹介するだけでなく、そもそもよいコードとは何か?なぜよいコードを書く必要があるのか?パターンとは何か?どのようにパターンを選択し、適用すればよいのか?という本のテーマの「前提」となる部分がきちんと説明されていることです。(まえがき、1章〜4章)全てをこの場では紹介しきれませんので、今回はこのなかから、「よいコードを書くためのはじめの2歩」を紹介します。はじめに」で紹介されています。1歩目・・・プログラミングを行うと同時に意識的になること。Beckがこの本を執筆しはじめたころの話だそうですが、当時、すでに、何年もプログラミングの経験があり、プログラミング上の決定はスムーズにすばやく行われているのに、なぜメソッド名をその名前にしたのか、そのオブジェクトにそのロジックを含ませるべきだと確信した理由は何なのかを説明できなかったことに気がついたそうです。そこで、よいコードを書くための第一歩は「自分で何を考えているかを意識できるぐらいに思考速度を落とす」こと、直感でコードを書く「振り」をやめることを挙げています。2歩目・・・他人の重要性を認識すること。プログラミングというのは、1人の人間と1台のマシンとの孤独なコミュニケーションであることは、ほとんどありません。他人を気に掛けるということは、意識的な決定であって、練習しないと身につかないものです。第2版」の原書出版が2004年。「実装パターン」原書出版が2007年ですから、当時、すでに達人の域に入っていたといってもいいでしょう。新人でも中級者・上級者であっても気がつかなければ最初の一歩も踏み出せないということです。ここまで、こんなことを言っておいてなんですが、私自身、はじめの2歩を忘れてコードを書いていることが未だに多いです。誤解していただきたくないのは、「常にゆっくり」コードを書けといっているわけではありません。トレーニングの一環といったところです。最終的にはよいコードを書くことを「習慣化」するというのが、そもそもの本書の目的であります。最後にこの「実装パターン」ですが、ギルドワークスの増田さんが、ドメイン駆動設計を実践する中で、何度も読み返して参考になさっている文献のなかの一冊に挙げられています。亨ドメイン駆動設計を実践されている方にもぜひ手に取っていただきたい一冊です。河上晴司コメントする河上です。ラムダ式が使えるようになって喜んでいる今日このごろですが、業務アプリケーション・プログラミングであるドメイン駆動設計という文脈でどういった変化がおこるのかを考えてみます。適用できそうなところとして思いつくのは以下です。Specificationパターンの実装ファーストクラスコレクション内部のコレクション操作それぞれの実装例として幾分恣意的ではありますが、シンプルな要件を、ラムダ式を利用しないバージョンと、利用するバージョンでそれぞれ実装してみたいと思います。要件:「ある会員制サイトで、年収800万円以上、且つ、正社員、且つ、課長以上、というステータスを持つ会員を幹部候補として区別し、絞込などをおこないたい」まずは、年収800万円以上、且つ、正社員、且つ、課長以上という、複合条件をSpecificationパターンの実装方法の1つである、「Compositeパターンによる条件ツリー方式」で記述してみます。}}ラムダ式を利用しない場合に比べてコードにあるノイズがほぼ消えていることがわかります。次は、このSpecificationを使って、実際に会員を絞り込むコレクション操作部分です。}}こちらではラムダ式を利用しない場合に比べて絞り込むという部分がfilterというメソッドとしてより直接的に表現出来ている部分に好感がもてます。コードの例としては以上となります。コードの細かい解説などはなく不親切とは思いますが、雰囲気だけでも感じていただければと思います。上記例以外にもソートなどの記述がシンプルになったりと、メリットが多いと感じるラムダ式ですが、実を言うと、上記の例も含めて、私がドメインモデルのコードでラムダ式を使う部分は局所的です。それは、例えば「ドメインモデルの外部からラムダ式を注入するようなモデルの汎用化をおこなう事」が、「用途や文脈に合わせた特殊化を行う」というドメイン駆動設計の思想と相反するのではないかという考えがあるからで、今のところそれを変えるような経験に出会っていません。ドメインモデルの外のインフラストラクチャやフレームワーク内部ではラムダ式をつかった汎用化がかなりの武器になることに疑問はありません。他につっこみや「ドメインモデル内でのラムダ式活用例」としてなにか事例等あればご意見ください。Blog.投稿先:キャンセル。