使用工作方法实现其他良好的编程习惯吗?

时间:2010-12-10 18:27:24

标签: objective-c ios methods computer-science code-reuse

我一直致力于在Obj-C中实现NSComparisonMethods协议的前6个功能。我正在为具有以下@interface

的Fraction对象实现它们
@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

现在,我从协议实现的功能是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;
    }
}

所有这些功能都是多余的,我相信有不同的方法来实现它们。我记得那时候教授们过去常常让学生们从头开始做所有事情,但是,这是不是违背了我们应该拥有的重复使用的代码心态?

1 个答案:

答案 0 :(得分:0)

你应该尽可能多地重复使用。

将所有肉类进行比较,如下所示:

-(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特别创建函数(你可能不应该),那么你需要在这里防止除零。

然后使用compare来实现其他的,如果你需要它们的话:

-(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)
}