2013-02-15 46 views
1

這是一個關於如何儘可能少地使用代碼進行高效編碼的問題。它已經工作,但我需要參與numberOfShapes參數。如果1返回■,如果2■■,如果3■■■等...Objective-C:使用最少代碼的多個if和return語句

我可以做一些額外的if語句和額外的返回語句。如果Square-> if number = 1> return■,如果number> 2返回等等​​。但是對於非常簡單的事情來說,這是很多代碼。

用最少的代碼編碼這種方法的最佳方式是什麼?

- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number 
{ 
    if ([shape isEqualToNumber:[NSNumber numberWithInt:SQUARE]]) return @"■"; 
    if ([shape isEqualToNumber:[NSNumber numberWithInt:CIRCLE]]) return @"●"; 
    if ([shape isEqualToNumber:[NSNumber numberWithInt:TRIANGLE]]) return @"▲"; 

    return @"?"; 
} 
+0

永遠不要少量的代碼,而是要找到最好的代碼。 – 2013-02-15 16:24:01

+1

@AKV並非總是如此。重構對於可讀性很重要,過早優化是邪惡的。 – 2013-02-15 16:25:09

+0

switch case dud – Radu 2013-02-15 16:26:36

回答

3
- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number 
{ 
    unsigned shapeInt = [shape unsignedIntValue]; 
    if (shapeInt >= 3) 
     return @"?"; 
    NSString *shapeStr = [@"■●▲" substringWithRange:NSMakeRange(shapeInt, 1)]; 

    // Add autorelease here, if using MRR... 
    NSMutableString *result = [[NSMutableString alloc] init]; 

    unsigned numberInt = [number unsignedIntValue]; 
    for (unsigned i = 0; i < numberInt; i++) 
     [result appendString:shapeStr]; 
    return result; 
} 

我沒有看到使用NSNumber對象傳遞的參數是這樣,因爲他們不能做任何事情,一個簡單的NSUIntegerunsigned就可以了,而且使用更昂貴的地步。

+0

我更喜歡你的解決方案!因爲它全部侷限於一種方法!我更喜歡代碼中稀疏的方法。 – 2013-02-15 16:46:12

+0

@TomLilletveit請注意,我的代碼假定'SQUARE == 0','CIRCLE == 1'和'TRIANGLE == 2'! – trojanfoe 2013-02-15 16:47:18

2

輸入循環的概念。另外,爲什麼你使用NSNumber?普通的舊int是足夠好的。

- (NSString *)getShape:(int)shape numberOfShapes:(int)number 
{ 
    if (shape == SQUARE]) return [self shapeRepeated:@"■" nTimes:number]; 
    if (shape == CIRCLE]]) return [self shapeRepeated:@"●" nTimes:number]; 
    if (shape == TRIANGLE]]) return [self shapeRepeated:@"▲" nTimes:number]; 

    return @"?"; 
} 

- (NSString *)shapeRepeated:(NSString *)shape nTimes:(int)n 
{ 
    return [@"" stringByPaddingToLength:n withString:shape startingAtIndex:0]; 
} 
+0

+1這很容易閱讀和理解。 – 2013-02-15 16:31:47

+0

@GavinMiller這就是爲什麼我選擇了這個:) – 2013-02-15 16:32:14

+0

漂亮的代碼,我喜歡。 NSNumber被使用,因爲這些值傳遞給數組等使用很多... – 2013-02-15 16:32:45

3

是否存在與代碼證明性能問題?否則,我認爲一個開關很清楚。或者,較少的行和O(1)是...

// declare this earlier 
static NSArray *shapeChars = @[ @"■", @"●" /* etc. */ ]; 

// then 
return [shapeChars objectAtIndex:[shape intValue]]; 
6

重要的是味道的問題,除非你有一些非常重的性能要求。

做到這一點的一種方法可能是建立一個包含數字到字形的地圖的字典。

假設你有一個靜態變量glyphs,在類initialize方法初始化:

static NSDictionary *glyphs; 

+ (void)initialize 
{ 
    glyphs = @{ 
     @(SQUARE):@"■", 
     @(CIRCLE):@"●", 
     @(TRIANGLE):@"▲" 
    }; 
} 

然後,所有你需要做的是:

- (NSString *)shapeForNumber:(NSInteger)shape 
{ 
    NSString *glyph = [glyphs objectForKey: [NSNumber numberWithInteger: shape]]; 

    return glyph ? glyph : @"?"; 
} 
0
- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number 
{ 
    switch([number intValue]): { 
     case SQUARE: return @"■"; 
     case CIRCLE: return @"●"; 
     case TRIANGLE: return @"▲"; 
     default: return @"?"; 
    } 
} 

要合併「編號「:

- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number 
{ 
    NSString* result = nil; 
    switch([number intValue]): { 
     case SQUARE: result = @"■"; break; 
     case CIRCLE: result = @"●"; break; 
     case TRIANGLE: result= @"▲"; break; 
     default: result = @"?"; 
    } 
    NSString* realResult = @""; 
    for (int i = 0; i < number; i++) { 
     realResult = [realResult stringByAppendingString:result]; 
    } 
    return realResult; 
} 

你可以通過使用char值來獲得結果,但我太懶惰了。