- プログラムやシステムを機能・役割ごとに分割した独立した構成単位のこと。関数・クラス・ファイル・パッケージ・ライブラリなど粒度はさまざまだが「一つのまとまった機能を担う独立した部品」という概念は共通だ
- モジュールに分割することで「再利用できる・変更の影響範囲が小さい・単体テストしやすい・チームで分担しやすい」という4つのメリットが生まれる
- プログラミング言語のimport文・require文でモジュールを読み込む操作は日常的に行われており、npmのパッケージ・Pythonのpipでインストールするライブラリも「モジュール」の一形態だ
【深掘り】これだけ知ってればOK!
Webフロントエンドでのモジュールの活用:JavaScriptのESModuleは`export`と`import`文でモジュールを定義・読み込みする仕組みだ。Reactでは各コンポーネントが独立したモジュールとして設計されており、再利用可能なUIパーツのライブラリ(shadcn/ui・Material UI)もモジュールの集合体だ。
Pythonのモジュールとパッケージの違い:モジュールはPythonの1つのファイル(.py)。パッケージは複数のモジュールをフォルダにまとめたもの(__init__.pyを含む)。ライブラリは再利用可能なパッケージの集合。`import numpy as np`はnumpyというパッケージをインポートしている。
Nodeモジュールシステムの変遷を理解しよう。JavaScriptはもともとモジュールシステムを持たなかったが、Node.jsがCommonJS(require/module.exports)・後にECMAScript 2015でESModule(import/export)が標準化された。現在はブラウザでもNode.jsでもESModuleが主流だが、既存プロジェクトではCommonJSが残っている場合がある。
よくある誤解
モジュールは関数と同じだと思っている
関数はプログラム内の処理手順をまとめたものだ。モジュールはより大きな概念で、複数の関数・クラス・定数をまとめた独立したファイルや単位だ。モジュールの中に複数の関数が含まれることが一般的だ。
モジュールを細かく分割すれば分割するほど良いと思っている
過剰なモジュール分割は逆に複雑さを増す。「3つのルール(同じコードが3回出てきたらモジュール化)」を参考に適切な粒度で分割することが重要だ。
会話での使われ方

このコード、ユーザー認証・DB操作・メール送信が1ファイルに混在しています。モジュールに分割してそれぞれを独立したファイルに切り出しましょう。
エンジニアがコードのモジュール分割によるリファクタリングを提案している場面。




npmのパッケージをインストールするとnode_modulesフォルダに入りますよね。これらが全部モジュールで、importで読み込んで機能を使える仕組みです。
エンジニアがnpmのモジュール仕組みを初心者に説明している場面。




このモジュール、高凝集・低結合が実現できています。変更しても他の機能に影響が出にくい設計です。
コードレビューでモジュール設計の品質を評価しているエンジニアの場面。
【まとめ】3つのポイント
- 機能・役割ごとに分割した独立した構成単位で再利用性・保守性を高める:高凝集(モジュール内の関連性が高い)・低結合(モジュール間の依存が少ない)を実現することで変更に強く再利用しやすいソフトウェア設計が可能になる
- JavaScriptのESModule・Pythonのimportなどモダンなプログラミングはモジュールシステムが基盤:npmのパッケージ・Pythonのpipライブラリも全てモジュールの形で提供されており日常的にimportして利用する操作がモジュール活用の実践だ
- 適切な粒度でモジュール化することが「3つのルール」の経験則:同じコードが3回出てきたらモジュール化するという経験則が過剰分割と不足分割の両方を避けて適切な粒度のモジュール設計につながる
よくある質問
-
QESModuleとCommonJS(require)はどう違いますか?
-
A
ESModule(import/export)はES6で導入されたモジュールの標準仕様です。CommonJS(require/module.exports)はNode.jsが採用していた従来の方式です。
-
QPythonのモジュールとパッケージの違いは何ですか?
-
A
モジュールはPythonの1つのファイル(.py)です。パッケージは複数のモジュールをフォルダにまとめたもの(__init__.pyを含む)です。
-
Qモジュールのテストはどうやりますか?
-
A
単体テスト(ユニットテスト)でモジュールの関数・クラスを個別にテストします。JestやPytestなどのテストフレームワークを使います。
-
Qモジュール設計のアンチパターンにはどんなものがありますか?
-
A
God Class(全ての処理を1つのクラスに詰め込む)・循環参照・密結合(モジュール間の依存が強すぎる)などが代表的なアンチパターンです。
【出典】参考URL
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules :MDNのJavaScriptモジュールの解説
https://docs.python.org/ja/3/tutorial/modules.html :Pythonの公式モジュールドキュメント




コメント