Rustの問題点(依存性の注入)
WIP
要旨
公共性の高いモジュールを抽象化して扱おうとすると、実装が冗長になる
暗黙的なインターフェイスの実装ができないことに起因
例えば、こんなコードを想像
code:relationships.rs
struct Relationship {
friends: graph::Graph
}
code:graph.rs
pub struct Graph {
node: Vec<usize>
}
impl Graph {
add_edge() {...}
delete_edge() {...}
...
}
Relationshipsは、人間関係friendsを管理するためのグラフを保持
relationships.rsはgraph.rsに依存
この依存性を逆転すると
code:relationship.rs
pub trait FriendGraph {
add_edge()
delete_edge()
...
}
struct Relationship<G:FriendGraph> {
friends: G
}
code:graph.rs
pub struct Graph {
node: Vec<usize>
}
impl Graph for relationship::FriendGraph {
add_edge() {...}
delete_edge() {...}
...
}
逆転させるだけなら問題なし
しかし、どちらか片方が片方に必ず依存することになる
各モジュールを独立させようとする(依存性は別のモジュールから注入する)と
code:relationship.rs
pub trait FriendGraph {
add_edge()
delete_edge()
...
}
struct Relationship {
friends: Graph
}
code:graph.rs
pub struct Graph {
node: Vec<usize>
}
code:di.rs
struct FriendGraphProvider {
g graph::Graph
}
impl relationship::FriendGraph for FriendGraphProvider {
add_edge() {...}
delete_edge() {...}
...
}