PBLとPBFにおける依存関係
Package by LayerとPackage by Featureにおける依存関係の考察
単純化すると、PBLとPBFではファイルの配置が異なっているだけで、依存の方向性は全く変わらない
同じものを別のviewで表示しただけなので
PBL
code:dir
src/
├── presentation/
│ ├── UserController
│ └── OrderController
├── usecase/
│ ├── CreateUserUseCase
│ └── CreateOrderUseCase
├── domain/
│ ├── User
│ └── Order
└── infrastructure/
├── UserRepository
└── OrderRepository
ディレクトリ単位で依存関係を可視化する
https://gyazo.com/4ae65514565bd5b4ee9709cb8ea439f5
ディレクトリとLayerが一致するので、大局的に見ると、依存の方向が揃っている様に見える
ファイル単位で依存関係を可視化する
https://gyazo.com/7d65afac736d2824e3d57e72254ee30f
PBF
code:dir
src/
├── user/
│ ├── UserController
│ ├── CreateUserUseCase
│ ├── User
│ └── UserRepository
└── order/
├── OrderController
├── CreateOrderUseCase
├── Order
└── OrderRepository
ディレクトリ単位で依存関係を可視化する
https://gyazo.com/c9815ec95bbb2c9421b329071808d129
ファイル単位で依存関係を可視化する (PBLと全く同じ)
https://gyazo.com/f4a0df38a08db06e98f2cc925a2b750d
この例は単純なので起きていないが、feature間での相互依存は発生しうる
ただ、ファイル単位で見れば、依存の方向性を揃えることはできるだろう
ファイル間の循環参照も避けられるだろう
比較
「packageが公開するもの」はPBFの方が圧倒的に少なくなるはずmrsekut.icon
この例でのControllerはPackage内でのみ使用されているため、Package外に公開する必要がない
PBLの場合は、Layerを超えると別Packageになるので、何でもかんでも公開しないといけなくなる
同じ能力であれば、interfaceは狭い方が良い(Deep Modules)ので、この点ではPBFの方が優れていると言えそう
依存の方向性をLinterなどで揃えられるか?
これは両者ともに変わらないはず
PBLの場合は、usecases/ → repoositories/みたいなディレクトリ単位のルールを用意すれば良く、
PBFの場合は、usecase.ts → repository.tsみたいなファイル単位のルールを用意すればよいだけ