Является ли использование метода работы для реализации других хорошей практики программирования? - PullRequest
0 голосов
/ 10 декабря 2010

Я работал над реализацией первых 6 функций протокола NSComparisonMethods в Obj-C.Я реализую их для объекта Fraction, который имеет следующее @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

Теперь функция, которую я реализовал из протокола, - 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 голосов
/ 11 декабря 2010

Вы должны использовать как можно больше.

Положите все мясо в сравнение, примерно так:

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