我正在编写一些使用Temperatures的代码。所以我想要一个能够保持使用比例(C / F)和值的类。我使类不可变(通过在实现类中使用类别)。我想要一个转换器。在Java中,我们通常会执行一个静态方法并让它返回一个新实例,但是你不能在O-C中这样做,因为+方法是类方法,并且不能访问实例属性。
所以我做了一个init方法,它接受当前的Temperature实例和我们希望它转换为的比例。完成C ++很长一段时间后,这就像一个复制构造函数。
这里的问题是,是否有更好的方法或某些东西被视为标准做法。所以为了得到转换你会做:
Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32.0];
Temperature *freezingC = [[Temperature alloc]initWith:freezingF andScale:Celsius];
assertThat(freezingC.value, is(@0));
(缩短变量名以限制滚动...)
答案 0 :(得分:3)
我会将支持值存储为开尔文或C,然后使用setters
和getters
,setKValue:
setFValue:
和kValue
,fValue
。因为它们在不同的单位中基本上是相同的值
答案 1 :(得分:2)
为什么不添加一个convertTo:
实例方法,该方法在新单元中返回一个新的不可变温度实例?
- (Temperature *)convertTo:(TemperatureScale)scale {
float newValue = ... // calculate new value
return [[Temperature alloc] initWithScale:scale andValue:newValue];
}
然后您的代码变为:
Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32.0];
Temperature *freezingC = [freezingF convertTo:Celsius];
答案 2 :(得分:0)
根据此处的讨论,另一种选择是:
+(Temperature *)convert:(Temperature *)from toScale:(TemperatureScale)newScale;
会像这样调用:
Temperature *freezingF = [[Temperature alloc]initWithScale:Fahrenheit andValue:@32];
Temperature *freezingC = [Temperature convert:freezingF toScale:Celsius];
这是基于NSNumber类方法示例:numberWithFloat,Int等。