TypeScriptでDDDを学ぶためのOSS紹介
- Published on
この記事では、TypeScript で DDD が実践された OSS であるstemmlerjs/ddd-forumを紹介します。
ドメイン駆動設計を TypeScript で学びたい
ドメイン駆動設計(DDD)とは、エリック・エヴァンスの提唱したソフトウェア設計手法です。エリック・エヴァンスのドメイン駆動設計の原著が発売されたのは 2004 年ですが、2021 年現在においても、DDD の解説書籍の発売やカンファレンスが開かれるなど、勢いを増し続けています。
DDD にまつわる書籍では、サンプルコードとして、Java や C#が用いられることが多いです。例えば、Evans 本と実践ドメイン駆動設計は Java で書かれています。
僕は普段は、バックエンドもフロントエンドも TypeScript で書くことが多いです。 TypeScript は、Java や C#と大きく離れた言語ではないと思うので、同じような雰囲気でなんとなくは読めると思います。それでも、当然ですが各言語にそれぞれ特性があるので、慣れている言語で設計手法(ここでは DDD)に触れたいです。
なお、DDD を構成する設計の要素には、戦略的設計・戦術的設計が、挙げられますが、当記事では主に後者の戦術的設計(主にアプリケーションコードを対象とした設計)を想定しています.
stemmlerjs/ddd-forum について
ddd-forum は、TypeScript で、DDD で作った HackernewsLike な WebApp です。
README を参照すると Backend には、以下が使われています。
- Sequelize
- Express.js
- Redis
Frontend は、以下が使われています。
- React.js
- Redux
- Sass
アーキテクチャとして採用されているのは、CleanArchitectureです。
作者の stemmlerjs さんは、ブログにて、設計に関する記事を多く執筆されています。 また、SOLID 原則をテーマとした Node.js での設計についての本を書かれています。
ddd-forum を読む
Frontend は、React が使われていますが、ClassComponent のままであるため、FC 中心 の現在、あまり熱心に読む必要は無いと思います。
僕は主に Backend(src/)のみを読んでいます。
DDD をなす要素である Entity や ValueObject,Aggregator,Identifier などのベースが、shared/core に用意されています。modules 配下に置く subdomain 内にて、shared/core のベースを利用しています。
Guard というクラスを用意し、そのメソッドに複数のバリデーションが記述されています。 この Guard クラスを様々なところから利用し、リクエストなどに対するバリデーションを一元的に行っています。
undefined や null、値の大小や境界値の判別などを行うコードの数はどうしても多くなりがちだと思います。それ故、チーム開発だとメンバー各人の条件が用意され、コードに統一感がなくなってしまいます。
コードの各所で、統一されたバリデーションを用いることで、スッキリするなと思いました。
以上、ddd-forum の紹介でした。