UNV

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 について

stemmlerjs/ddd-forum-GitHub

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 の紹介でした。