2010-12-10 2 views
0

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

Все эти функции являются своего рода излишними, и я уверен, что есть разные способы для их реализации. Я помню, что в тот же день профессора привыкли делать все так, как если бы это было с нуля, но разве это не противоречит менталитету кода, который мы все должны иметь?

ответ

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 в частности (вы, вероятно, не должны), вам нужно будет защитить от деления на ноль здесь.

Затем использовать сравнение для реализации других, если вы нуждаетесь в них вообще:

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

Я всегда думал, что == не следует использовать для значений с плавающей точкой. –

+0

Это хорошее эмпирическое правило, но правдиво == это * точно * эквивалентно [a isEqual: b]. Внутри «оператора» - неправильное место для работы над такими концепциями. Если вы заботитесь об [a isEqual: b внутри: margin], внесите это тоже! –

 Смежные вопросы

  • Нет связанных вопросов^_^