我在Rust中處理Repository模式的實現。模塊中有多個文件
我需要有兩個(或更多)文件:
entity.rs
- 數據說明repository.rs
- 數據訪問方法- ...
問題:
一個文件意味着一個mod。這意味着要使repository.rs
中的函數有權訪問entity.rs
的結構字段,則需要field
爲pub
。有沒有辦法避免這種情況?
我在Rust中處理Repository模式的實現。模塊中有多個文件
我需要有兩個(或更多)文件:
entity.rs
- 數據說明repository.rs
- 數據訪問方法問題:
一個文件意味着一個mod。這意味着要使repository.rs
中的函數有權訪問entity.rs
的結構字段,則需要field
爲pub
。有沒有辦法避免這種情況?
在Rust中,模塊是自包含的。與C++或Java不同,不存在通過friend
或使用反射作弊。因此,如果您(任意)試圖將負責維護其封裝的方法的定義分開,您將與語言對抗。
解決方案1:不想非成員非朋友功能
定義絕對需要訪問字段entity.rs
方法;如果您遵循C++中的「優先考慮非成員非朋友功能」指南,您應該看到實際上大多數方法不需要直接訪問這些字段。例如,empty
可以在len
來定義:
fn empty(c: &Container) -> bool { c.len() == 0 }
然後,如果需要,但要經過由entity.rs
導出的「最小」的接口,以實現其需求repository.rs
可以添加許多其它方法。既然你在控制這兩個模塊,你可以隨意調整entity.rs
的方法,所以它不應該成爲一個問題。
我要指出的是封裝的角度來看,這是的明智的決定:減少可能會訪問一個對象的內部方法的數量減少了,可能把這個對象處於無效狀態的方法數。
這種解決方案是有利的,因爲你不是在與語言作鬥爭。
解決方案2:總分裂
另一種解決方案是,以複製實體:
這是實現的通過粘彈性阻尼器:
pub struct SomeEntImpl {
pub field0: i32,
}
pub struct SomeEnt {
inner: SomeEntImpl,
}
授權模塊將給予一個SomeEntImpl
引用,而其他人將不得不通過SomeEnt
使用可用的限制接口。控制誰會看到通過認真出口會達到什麼目的。
這個解決方案可能會讓你瘋狂。
我希望我有一個額外的+1只爲最後的評論... –
第二個解決方案更靈活,認爲有什麼需要我。謝謝! =) – Gedweb
爲什麼要讓字段'pub'成爲您的問題? (補充閱讀:https://doc.rust-lang.org/reference.html#visibility-and-privacy) –
某些字段必須不能直接訪問,如以獲取者或設置者爲例 – Gedweb
因此,如果我明白,字段在內部應該是'pub'(在2/3個模塊內),但是對於包裝箱的外部客戶端(或者包裝箱中的其他模塊)是私有的? –