2016-01-04 46 views
1

我在Rust中處理Repository模式的實現。模塊中有多個文件

我需要有兩個(或更多)文件:

  • entity.rs - 數據說明
  • repository.rs - 數據訪問方法
  • ...

問題:

一個文件意味着一個mod。這意味着要使repository.rs中的函數有權訪問entity.rs的結構字段,則需要fieldpub。有沒有辦法避免這種情況?

+1

爲什麼要讓字段'pub'成爲您的問題? (補充閱讀:https://doc.rust-lang.org/reference.html#visibility-and-privacy) –

+0

某些字段必須不能直接訪問,如以獲取者或設置者爲例 – Gedweb

+0

因此,如果我明白,字段在內部應該是'pub'(在2/3個模塊內),但是對於包裝箱的外部客戶端(或者包裝箱中的其他模塊)是私有的? –

回答

5

在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

我希望我有一個額外的+1只爲最後的評論... –

+0

第二個解決方案更靈活,認爲有什麼需要我。謝謝! =) – Gedweb

相關問題