模块结构设计思路
- 创建项目结构:在Rust项目中,一般以
src
目录为源代码根目录。我们将创建不同的模块文件来组织代码。
- 定义敏感数据处理模块:这个模块负责处理敏感数据逻辑,将其内部细节隐藏起来,只暴露特定接口给外部模块。
- 定义公共接口模块:此模块提供外部模块可以调用的接口函数,这些函数内部调用敏感数据处理模块的逻辑。
代码实现
- 项目结构:
src/
main.rs
sensitive.rs
public_api.rs
sensitive.rs
代码:
// 定义敏感数据处理模块
mod sensitive {
// 假设这是一个处理敏感数据的函数,不希望外部模块直接调用
fn process_sensitive_data(data: &str) -> String {
format!("Processed sensitive data: {}", data)
}
// 定义一个供外部模块调用的接口函数
pub fn public_sensitive_api(data: &str) -> String {
process_sensitive_data(data)
}
}
// 使sensitive模块中的public_sensitive_api函数可以在crate根被访问
pub use sensitive::public_sensitive_api;
public_api.rs
代码:
// 公共接口模块,调用敏感数据处理模块的公共接口
pub fn call_sensitive_api(data: &str) -> String {
crate::sensitive::public_sensitive_api(data)
}
main.rs
代码:
mod sensitive;
mod public_api;
fn main() {
let data = "Some sensitive input";
let result = public_api::call_sensitive_api(data);
println!("{}", result);
}
解释
sensitive.rs
:
- 首先定义了一个内部函数
process_sensitive_data
,这个函数处理敏感数据,但由于没有pub
关键字,外部模块无法直接访问。
- 然后定义了
public_sensitive_api
函数并标记为pub
,它作为外部模块访问敏感数据处理逻辑的接口。
- 使用
pub use
将public_sensitive_api
函数提升到sensitive
模块的父级作用域(在这个例子中是crate根),方便其他模块调用。
public_api.rs
:
call_sensitive_api
函数作为更外层的公共接口,它调用crate::sensitive::public_sensitive_api
函数,这样进一步封装了敏感数据处理模块的调用,外部模块只需要调用public_api::call_sensitive_api
。
main.rs
:
- 引入
sensitive
和public_api
模块。
- 通过
public_api::call_sensitive_api
函数来处理敏感数据,无法直接访问sensitive
模块内部的process_sensitive_data
函数,实现了可见性控制。