依存関係アーキテクチャ改善レポート
[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。
概要
EvoSpikeNetの依存関係を分析し、インターフェース層を導入して保守性とテスタビリティを向上させました。
実施内容
1. 依存関係の可視化
ツール
- pydeps: Pythonパッケージの依存関係可視化ツール
- カスタム分析スクリプト:
scripts/analyze_dependencies.py
分析結果
{
"total_modules": 53,
"total_dependencies": 80,
"average_dependencies_per_module": 1.51,
"circular_dependencies_count": 0
}
依存関係が多いモジュール(Top 10)
- evospikenet.models - 9依存
-
依存先: memory_manager, audio, transformer, vision, text, encoding, core, attention, tensor_cache
-
evospikenet.services - 6依存
-
evospikenet.rag_milvus - 5依存
-
依存先: elasticsearch_client, rag_backends, encoding, models, insight
-
evospikenet.model_selector - 3依存
-
evospikenet.plugins.builtin - 3依存
主要な発見
- ✅ 循環依存なし: 現在のアーキテクチャは健全
- ⚠️ 高結合モジュール:
models.pyが9つのモジュールに依存(リファクタリング推奨) - ⚠️ 暗黙的インターフェース: Protocolやベースクラスが不足
2. インターフェース層の導入
新しいevospikenet/base/パッケージを作成し、以下を定義:
2.1 Protocolの定義 (base/protocols.py)
Duck Typingをサポートしつつ型安全性を確保:
- NeuronLayerProtocol: ニューロン層の基本インターフェース
- EncoderProtocol: エンコーダーのインターフェース
- PlasticityProtocol: 可塑性メカニズムのインターフェース
- AttentionProtocol: アテンション機構のインターフェース
- TransformerProtocol: Transformerブロックのインターフェース
- ModelProtocol: モデル全体のインターフェース
- CommunicatorProtocol: 分散通信のインターフェース
- MemoryManagerProtocol: メモリ管理のインターフェース
2.2 抽象基底クラス (base/base_classes.py)
具象クラスが継承すべきベースクラス:
- BaseNeuronLayer: ニューロン層の抽象基底クラス
- BaseEncoder: エンコーダーの抽象基底クラス
- BasePlasticity: 可塑性メカニズムの抽象基底クラス
- BaseAttention: アテンション機構の抽象基底クラス
- BaseTransformer: Transformerブロックの抽象基底クラス
- BaseModel: モデル全体の抽象基底クラス
- BaseCommunicator: 分散通信の抽象基底クラス
- BaseMemoryManager: メモリ管理の抽象基底クラス
各ベースクラスには: - 共通の初期化ロジック - デフォルト実装(オプション) - 状態管理メソッド(reset_state等)
2.3 型定義 (base/types.py)
型ヒントとエイリアス:
- SpikeTensor: スパイク列テンソル
- WeightTensor: 重み行列テンソル
- ConfigDict: 設定辞書
- MetricsDict: メトリクス辞書
- NodeID: ノード識別子(NewType)
- TaskID: タスク識別子(NewType)
- ModelID: モデル識別子(NewType)
3. 循環依存の検出と予防
現状
- ✅ 循環依存は0件検出
- 既存コードでは遅延インポート(関数内import)で回避している箇所あり
予防策
-
レイヤーアーキテクチャの明確化
evospikenet/ ├── base/ # 最下層(依存なし) ├── core/ # コア機能(baseのみに依存) ├── models/ # モデル実装(base, coreに依存) └── services/ # 高レベルサービス(全てに依存可) -
依存方向の制約
- 上位層 → 下位層のみ許可
- 同一層内の循環依存禁止
-
インターフェース経由の疎結合
-
継続的監視
- CIパイプラインに依存関係チェックを追加推奨
- pre-commitフックで循環依存検出
アーキテクチャ改善の利点
1. 保守性の向上
- 明確なインターフェース定義により、実装の変更が容易
- モジュール間の結合度が低下
2. テスタビリティの向上
- Protocolを使用したモック作成が容易
- 依存性注入(DI)パターンの適用が可能
3. 拡張性の向上
- 新しいニューロンモデルやエンコーダーの追加が容易
- プラグインアーキテクチャとの親和性が高い
4. 型安全性の向上
- mypyによる静的型チェックの精度向上
- IDEの補完とリファクタリング支援の改善
次のステップ
短期(推奨)
- 既存コードのリファクタリング
core.py,models.py等をベースクラス継承に移行-
遅延インポートをインターフェース依存に置き換え
-
CI/CDへの統合
# .github/workflows/ci.yml に追加 - name: Check circular dependencies run: python scripts/analyze_dependencies.py -
ドキュメント更新
- アーキテクチャ図の追加
- インターフェース使用ガイドの作成
中期
- 依存性注入コンテナの導入
-
python-dependency-injector等の検討 -
レイヤー分離の強化
-
evospikenet/core/,evospikenet/models/のサブパッケージ化 -
インターフェース準拠の検証
- pytest用のテストヘルパー作成
長期
- マイクロサービス化の検討
-
サービス境界の明確化
-
型システムの拡張
- Generics/TypeVarの活用
生成ファイル
evospikenet/base/__init__.py- パッケージ初期化evospikenet/base/protocols.py- Protocol定義evospikenet/base/base_classes.py- 抽象基底クラスevospikenet/base/types.py- 型定義scripts/analyze_dependencies.py- 依存関係分析スクリプトartifacts/dependency_analysis.json- 分析結果(JSON)artifacts/dependencies.dot- 依存関係グラフ(Graphviz)
実行コマンド
依存関係分析
python scripts/analyze_dependencies.py
Graphviz可視化(要graphvizインストール)
dot -Tpng artifacts/dependencies.dot -o artifacts/dependencies.png
pydepsによる可視化(要graphvizインストール)
pydeps evospikenet --max-bacon=2 --cluster --noshow -o artifacts/pydeps_graph.png
作成日: 2026年1月10日