I tried to explain to a coworker the gravity of having duplicate code in a project, on this piece of code:
+ (void)createIapInParse:(SKPaymentTransaction *)transaction {
Reachability *reach = [Reachability reachabilityWithHostname:@"www.facebook.com"];
if ([Social getFBUser]) {
NSString *iapId = [Util getBundleNameFromIdentifier:transaction.payment.productIdentifier];
PFObject *iap = [PFObject objectWithClassName:@"Iap"];
iap[@"iapId"] = iapId == nil ? [NSNull null] : iapId;
iap[@"userId"] = [Social getFBUser].objectID == nil ? [NSNull null] : [Social getFBUser].objectID;
iap[@"email"] = [Social getFBUser][@"email"] == nil ? [NSNull null] : [Social getFBUser][@"email"];
iap[@"country"] = [Util getDeviceCountry];
iap[@"installationId"] = [Util getInstallationId];
iap[@"score"] = [NSNumber numberWithLong:[GameScore getTotalScore]];
NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeSpentInApp"];
iap[@"timeSpentInApp"] = [NSNumber numberWithDouble:interval];
iap[@"retries"] = @0;
iap[@"transactionIdentifier"] = transaction.transactionIdentifier;
iap[@"transactionDate"] = transaction.transactionDate;
iap[@"transactionSource3G"] = [NSNumber numberWithBool:[reach isReachableViaWWAN]];
[iap saveInBackgroundWithBlock:^(BOOL succeded, NSError *error) {
NSString *query =[NSString stringWithFormat: @"...", iap.objectId, transaction.payment.productIdentifier];
[ZeeSQLiteHelper executeQuery:query];
}];
NSLog(@"Save in parse: %@", iap);
} else {
NSString *iapId = [Util getBundleNameFromIdentifier:transaction.payment.productIdentifier];
PFObject *iap = [PFObject objectWithClassName:@"Iap"];
iap[@"iapId"] = iapId == nil ? [NSNull null] : iapId;
iap[@"userId"] = @"-";
iap[@"email"] = @"-";
iap[@"country"] = [Util getDeviceCountry];
iap[@"installationId"] = [Util getInstallationId];
iap[@"score"] = [NSNumber numberWithLong:[GameScore getTotalScore]];
NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeSpentInApp"];
iap[@"timeSpentInApp"] = [NSNumber numberWithDouble:interval];
iap[@"retries"] = @0;
iap[@"transactionIdentifier"] = transaction.transactionIdentifier;
iap[@"transactionDate"] = transaction.transactionDate;
iap[@"transactionSource3G"] = [NSNumber numberWithBool:[reach isReachableViaWWAN]];
[iap saveInBackgroundWithBlock:^(BOOL succeded, NSError *error) {
NSString *query =[NSString stringWithFormat: @"...", iap.objectId, transaction.payment.productIdentifier];
[ZeeSQLiteHelper executeQuery:query];
}];
NSLog(@"Save in parse: %@", iap);
}
}
I refactored it to:
+ (void)createIapInParse:(SKPaymentTransaction *)transaction {
Reachability *reach = [Reachability reachabilityWithHostname:@"www.facebook.com"];
NSString *iapId = [Util getBundleNameFromIdentifier:transaction.payment.productIdentifier];
PFObject *iap = [PFObject objectWithClassName:@"Iap"];
NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeSpentInApp"];
iap[@"iapId"] = iapId == nil ? [NSNull null] : iapId;
iap[@"country"] = [Util getDeviceCountry];
iap[@"installationId"] = [Util getInstallationId];
iap[@"score"] = [NSNumber numberWithLong:[GameScore getTotalScore]];
iap[@"timeSpentInApp"] = [NSNumber numberWithDouble:interval];
iap[@"retries"] = @0;
iap[@"transactionIdentifier"] = transaction.transactionIdentifier;
iap[@"transactionDate"] = transaction.transactionDate;
iap[@"transactionSource3G"] = [NSNumber numberWithBool:[reach isReachableViaWWAN]];
if ([Social getFBUser]) {
iap[@"userId"] = [Social getFBUser].objectID == nil ? [NSNull null] : [Social getFBUser].objectID;
iap[@"email"] = [Social getFBUser][@"email"] == nil ? [NSNull null] : [Social getFBUser][@"email"];
} else {
iap[@"userId"] = @"-";
iap[@"email"] = @"-";
}
[iap saveInBackgroundWithBlock:^(BOOL succeded, NSError *error) {
NSString *query =[NSString stringWithFormat: @"...", iap.objectId, transaction.payment.productIdentifier];
[ZeeSQLiteHelper executeQuery:query];
}];
NSLog(@"Saved in parse: %@", iap);
}
and he kept arguing with me that it's the same thing.
His primary argument was that "he's a good programmer and he can understand and read even the first version fast enough" so he doesn't care if it's written like that or not.
The question is, am I really wrong? Is this not so important for everyone? It's a subjective matter or he doesn't understand that's not the same thing?