正在使用一种工作方法来实现其他良好的编程习惯吗?
问题描述:
我一直致力于在Obj-C中实现NSComparisonMethods
协议的前6项功能。我在执行他们具有以下@interface
正在使用一种工作方法来实现其他良好的编程习惯吗?
@interface Fraction : NSObject <NSComparisonMethods> {
int numerator;
int denominator;
}
@property int numerator, denominator;
+(int)addCounter;
-(Fraction *)addWithCount:(Fraction *)f;
-(void)print;
-(void)setTo:(int)n over:(int)d;
-(double)convertToNum;
-(int)gcd:(int)d1:(int)d2;
-(int)compare:(Fraction *)f;
// NSComparisonMethods Protocol Methods
-(BOOL)isEqualTo:(Fraction *)f;
-(BOOL)isLessThanOrEqualTo:(Fraction *)f;
-(BOOL)isLessThan:(Fraction *)f;
-(BOOL)isGreaterThan:(Fraction *)f;
-(BOOL)isGreaterThanOrEqualTo:(Fraction *)f;
-(BOOL)isNotEqualTo:(Fraction *)f;
@end
现在Fraction对象,我已经从协议实现的功能是isEqualTo
。简单地使用一个编程实践是不是很好,或者在这种情况下使用两种工作方法来实现其余的?
我对这些方法实现如下:
// NSComparisonMethods Protocol Methods
-(BOOL)isEqualTo:(Fraction *)f{
[self reduce];
[f reduce];
return ((self.numerator==f.numerator)&&(self.denominator==f.denominator));
}
-(BOOL)isLessThan:(Fraction *)f{
return ([self compare:f]==-1);
}
-(BOOL)isLessThanOrEqualTo:(Fraction *)f{
return (([self compare:f]==-1) || ([self isEqualTo:f]));
}
-(BOOL)isGreaterThan:(Fraction *)f{
return ([self compare:f]==1);
}
-(BOOL)isGreaterThanOrEqualTo:(Fraction *)f{
return (([self compare:f]==1) || ([self isEqualTo:f]));
}
-(BOOL)isNotEqualTo:(Fraction *)f{
return (![self isEqualTo:f]);
}
而且我比较功能如下:
-(int)compare:(Fraction *)f{
int value = [self gcd:denominator :f.denominator];
if ([self isEqualTo:f]) {
return 0;
} else if ((numerator * (f.denominator/value))>(f.numerator * (denominator/value))) {
return 1;
} else {
return -1;
}
}
所有这些功能都是一种多余的,我相信有很多不同的方法执行它们。我记得当时教授们曾经让学生做所有事情,好像它从头开始,但是,这不符合我们都应该有的重用代码思想吗?
答
您应该尽可能重复使用。
把所有的肉切成比较,这样的事情:
-(NSComparisonResult)compare:(Fraction *)f{
float myValue = ((float)numerator/denominator);
float theirValue = ((float)f.numerator/f.denominator);
if (myValue == theirValue) {
return NSOrderedSame;
} else if (myValue > theirValue) {
return NSOrderedDescending;
} else {
return NSOrderedAscending;
}
}
我不知道你试图在你的比较做的,所以我写了基于一个什么,我想你应该尝试去做。为了比较分数,你需要做的就是将它们解析成浮点数。最简单的方法应该是分子/分母。不应该找到最大公分母,因为1/4 = 0.25和2/8 = 0.25。如果我过于简单化,对不起。如果你允许使用分母0来创建函数(你可能不应该这样做),那么你需要在这里用零来防止分割。
然后使用比较来实现别人,如果你需要他们都:
-(BOOL)isEqualTo:(Fraction *)f{
return ([self compare:f] == NSOrderedSame);
}
-(BOOL)isLessThan:(Fraction *)f{
return ([self compare:f] < NSOrderedSame);
}
-(BOOL)isLessThanOrEqualTo:(Fraction *)f{
return ([self compare:f] <= NSOrderedSame);
}
-(BOOL)isGreaterThan:(Fraction *)f{
return ([self compare:f] > NSOrderedSame);
}
-(BOOL)isGreaterThanOrEqualTo:(Fraction *)f{
return ([self compare:f] >= NSOrderedSame);
}
-(BOOL)isNotEqualTo:(Fraction *)f{
return ([self compare:f] != NSOrderedSame)
}
我一直认为==不应该被用于浮点值。 – 2010-12-30 00:44:04
这是一个很好的经验法则,但如实==完全等同于[a isEqual:b]。在“运营商”的内部是解决这个问题的错误地方。如果你关心[aEqual:b在:margin]内,也要实现它! – 2011-01-31 20:46:06