【问题标题】:Is using a working method to implement others good programming practice?是否使用一种工作方法来实现其他良好的编程实践?
【发布时间】:2010-12-10 18:27:24
【问题描述】:

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

所有这些功能都是多余的,我相信有不同的方法来实现它们。我记得过去教授曾经让学生做任何事情都好像从头开始一样,但是,这不违背我们所有人都应该拥有的重用代码的心态吗?

【问题讨论】:

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


    【解决方案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 创建函数(您可能不应该),您需要在此处防止除以零。

    然后使用 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)
    }
    

    【讨论】:

    • 我一直认为 == 不应该用于浮点值。
    • 这是一个很好的经验法则,但实际上 == 完全 等价于 [a isEqual: b]。在“操作员”内部是解决此类概念的错误位置。如果您关心 [a isEqual:b within:margin],也请实施!
    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多