作为Rust和编程的新手,我有一个可能很容易回答的基本问题。假设我有一个矩形对象,它有一个宽度和一个高度,就像这样:
struct Rectangle1 {
width: u32,
height: u32,
}
我可以用一种新方法创建这样一个对象:
fn new(width: u32, height: u32) -> Self {
Rectangle1 {
width,
height,
}
}
现在,假设我想稍后使用该对象,并且需要它的面积,什么是更好的练习?这个领域有领域或方法吗?
所以要么我就实现这个:
fn area(&self) -> u32 {
self.width * self.height
}
或者,由于面积是该对象固有的,所以我给该对象一个"面积";区域";字段:
struct Rectangle2 {
width: u32,
height: u32,
area: u32,
}
并实现这样的新方法:
fn new(width: u32, height: u32) -> Self {
Rectangle2 {
width,
height,
area: width * height,
}
}
现在,在代码的其他地方,当需要该区域时:
let rect1 = Rectangle1::new(30, 50);
let rect2 = Rectangle2::new(30, 50);
println!(
"The area of the rectangle 1 is {} square pixels.",
rect1.area()
);
println!(
"The area of the rectangle 2 is {} square pixels.",
rect2.area
);
在这个简单的例子中,我看不出什么时候一个会比另一个更好。无论如何,应该首选什么?有没有一种方式因为我不知道的事情而不那么常见?
TLDR;这取决于用例
IMHO
这很快就开始变得固执己见。一般来说,您的答案将由用例驱动。
在现代系统中,经验表明,最好将依赖参数作为函数,只在特殊情况下优化结果的缓存。
示例1:
长度和高度在矩形的使用寿命内保持不变;预先计算可能是有用的。(考虑必须对10^6个矩形进行此操作,例如(
示例2:
你的身高和长度会有所改变。。。那么你会预先计算吗?你缓存结果了吗?
示例3:
根据用户更新其他两个参数中的任何一个,您不断更新第三个参数:-(
@prog fh评论说,访问内存很昂贵。我想说,你必须从两个方面考虑。在CPU中获取两个值并进行计算可能比只访问一个预先计算的值更昂贵。
所以IMHO,按照每个人的说法,
这取决于:-(