我在Rust中实现了Repository模式。
我需要两个(或更多)文件:
entity.rs
- 数据描述repository.rs
- 数据访问方法问题:
一个文件意味着一个mod。这意味着,repository.rs
中的某个函数可以访问entity.rs
中的struct字段,field
必须为pub
。有没有办法避免这种情况?
答案 0 :(得分:5)
在Rust中,模块是独立的。与C ++或Java不同,friend
或使用反射都不会作弊。
因此,如果您(任意)尝试将struct
的定义与负责维护其封装的方法分开,您将与该语言作斗争。
解决方案1:首选非会员非朋友功能
定义绝对需要访问entity.rs
中字段的方法;如果您遵循C ++中的“首选非成员非朋友功能”指南,您应该看到实际上大多数方法不需要直接访问这些字段。例如,empty
可以用len
:
fn empty(c: &Container) -> bool { c.len() == 0 }
然后,如果需要,repository.rs
可以添加许多其他方法,但必须通过entity.rs
导出的“最小”接口来实现其需求。由于您可以控制这两个模块,因此您可以随意调整entity.rs
的方法,因此它不应该是一个问题。
我会指出封装方式,这是 明智的决定:减少可能访问对象内部的方法数量会减少可能将此对象放入的方法数量无效的状态。
这种解决方案很有用,因为你没有对抗语言。
解决方案2:总拆分
另一种解决方案是复制您的实体:
这是通过以下方式实现的:
pub struct SomeEntImpl {
pub field0: i32,
}
pub struct SomeEnt {
inner: SomeEntImpl,
}
授权模块将被引用SomeEntImpl
,而其他模块将必须使用SomeEnt
提供的受限制接口。控制谁看到通过谨慎出口将实现的目标。
这个解决方案可能会让你疯狂。