memo
module

自分用メモ: DDDのモジュールと、その他モジュールとサブモジュール、パッケージ、リポジトリについて


目的

この記事の目的は、DDDのdomain modelやモジュールの構築をする際に、より上手く構築できるよう、理解を助ける為の前提知識を整理するための内容です。


モジュールとは

そもそもモジュールとはなんでしょう。

wikiでは冒頭にこう書かれています。


モジュール(英: module)とは、工学などにおける設計上の概念で、システムを構成する要素となるもの。いくつかの部品的機能を集め、まとまりのある機能を持った部品のこと。モジュールに従っているものをモジュラー (英: modular)という。


なるほど、つまり「機能」の「集合」であり、その「機能」の「集合」はシステムを構成する為の要素である。

この場合の「機能」と「集合」は当て字みたいにAとBみたいな感じで使われている所をよく見かけます。

一応jsやpythonでもmoduleを実装しています。

Pythonの場合、moduleは「再利用」を達成するためにあるそうです。jsも多分似たようなものでしょう。

jsとpythonの文脈に限って言えばimportできる奴がmodule自身です。

この場合のmoduleとは、「関数やクラス、変数等」の「集合」です。

この仕組みにより、「再利用」「配布」「クラス名の衝突回避」...etc等の恩恵を受けることができます。

しかし、jsとpythonが「関数やクラス、変数等」の「集合」みたいだからと言って、他の言語や設計、文脈ではmoduleの具体的な意味合いが異なることはよくあります。

DDDの文脈でもmoduleって用語はでてきます。

自分はこのmodule === pythonのパッケージシステムと受け取ってましたが、DDDは特定の言語に依存するものではありません。

「pythonの」って考えてる時点でpythonに依存してるマインドだったということです。


では、「DDDの文脈が言うmodule」とは

DDDの言うmoduleは「概念」の「凝集」であり、その「概念」の「凝集」はシステムを構成する為の要素です。

DDDの文脈が言うmoduleとは、「概念の凝集性」と「概念同士の疎結合性」を実現するためのデザインパターンのようです。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3838392f38343031653832392d353135362d316239662d313866612d3632323362343334306464362e706e67.png

この図の場合は電源タップももちろん料理で使うケースはありますが、キッチン引き出しとガレージ工具箱のどっちに入れるかと言われると、ガレージ工具箱の方が近いのかなぁと思います。もしかしたら将来的にはもっと適したモジュールが出てきて、そこに入れる可能性もあります。



ここから以下の内容はpythonやjsにおけるモジュールとパッケージのメモです。DDDとは関係ないです


サブモジュールについて

javascriptとpythonの場合も同じように特定のimportできる奴より深い所にあるimportできるやつがサブモジュール


補足

moduleは入れ子になる

import 'A'もできれば、import 'A/B'もimport 'A/B/C'もできる

AもモジュールでBとCはAのサブモジュールとして作られる事が多い。


パッケージについて (クリーンアーキテクチャ本だとコンポーネントと呼ばれてる

さっきの補足ではimport 'A'ができるとは言ったが、できない場合もある。

それの具体例が以下のような構成の場合だ。

https://www.npmjs.com/package/@vue/cli-plugin-e2e-cypress

https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue

この場合だとimport 'A'はできないが、import 'A/B'又はimport 'A/B/C'ができる事がある

この場合はAはモジュールのコンテナとして働くパッケージであり、Bはモジュールであり、CはBのサブモジュールである。


補足

基本的に1つのgitリポジトリで1つのパッケージを作ることが多い。

だがtsの@typesやvue-cliの@vue等、1つのリポジトリで複数のパッケージを管理するのも結構多い。


ケーススタディ


1. このディレクトリはパッケージである

https://github.com/k-okina/book-management/tree/master/src/domain/model/user


2. このファイルはモジュールである

https://github.com/k-okina/book-management/blob/master/src/domain/model/user/FirebaseUserRepository.ts


3. このファイルはモジュールである

https://github.com/k-okina/book-management/blob/master/src/store/containers/index.ts


4. このファイルは3のサブモジュールである

https://github.com/k-okina/book-management/blob/master/src/store/containers/loginForm/index.ts