正在使用一种工作方法来实现其他良好的编程习惯吗?

问题描述:

我一直致力于在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) 
} 
+0

我一直认为==不应该被用于浮点值。 – 2010-12-30 00:44:04

+0

这是一个很好的经验法则,但如实==完全等同于[a isEqual:b]。在“运营商”的内部是解决这个问题的错误地方。如果你关心[aEqual:b在:margin]内,也要实现它! – 2011-01-31 20:46:06