Я работал над реализацией первых 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;
}
}
Все эти функции являются своего рода излишними, и я уверен, что есть разные способы для их реализации. Я помню, что в тот же день профессора привыкли делать все так, как если бы это было с нуля, но разве это не противоречит менталитету кода, который мы все должны иметь?
Я всегда думал, что == не следует использовать для значений с плавающей точкой. –
Это хорошее эмпирическое правило, но правдиво == это * точно * эквивалентно [a isEqual: b]. Внутри «оператора» - неправильное место для работы над такими концепциями. Если вы заботитесь об [a isEqual: b внутри: margin], внесите это тоже! –