2015-04-02 105 views
2

我正在編寫一個程序,它有一個SecretNumber這個類持有一個數字並且有一個方法返回猜測是否太低,太正確或者正確。
該方法返回三個對象之一的對象,這樣的定義:使用空類作爲數據類型

@interface TooHigh : NSObject 
@end 
@implementation TooHigh 
@end 
@interface TooLow : NSObject 
@end 
@implementation TooLow 
@end 
@interface JustRight : NSObject 
@end 
@implementation JustRight 
@end 

SecretNumber推測法,然後像這樣實現的:

@implementation SecretNumber 
{ 
    int Secret; 
} 
-(id) guessSecret:(int)g 
{ 
    if (g>Secret) { 
     return [[TooHigh alloc] init]; 
    } else { 
     if (g<Secret) { 
      return [[TooLow alloc] init]; 
     } else { 
      return [[JustRight alloc] init]; 
     } 
    } 
} 

所以我的問題存在這被認爲是好的編程形式,還是我最好送回1,2,3或3個隨機字符(一個意思是太高,另一個太低等)?

回答

0

你的解決方案是面向對象編程,並採取多態的優勢很好的例子。然而,我認爲這並不是什麼錯誤,對於你的簡單例子來說,它是最「複雜」的做法。讓我們來討論迄今已投入解決您的情況,從最簡單的選擇:

  1. 簡單地返回一個int:這是行代碼方面的簡單。 SecretNumber將返回-1,0或1,並且調用代碼將不得不打開這些值,從而提供處理每種情況的邏輯。這種方法的意義在於返回的整數的含義並不明顯,新的情況將意味着修改調用SecretNumber類的所有類。

  2. 返回一個枚舉:這比返回一個int的唯一目的是附加返回值的含義要好。可讀性和理解力增加。但是,您仍然必須打開返回的枚舉類型,併爲每個枚舉大小寫提供邏輯。

  3. 封裝每個返回值在類中的行爲並返回一個接口。這就是你所做的,減去行爲部分(你的類是'空')。這是三個中最「OO」(不一定意味着更好或更差),因爲你避免了返回類型的切換。這種方式傾向於成爲三者中最靈活的一種。如果將來有不同的情況(例如,對於WAY值較高或WAY值較低),則不必觸摸調用SecretNumber的代碼。

無論哪種方式的作品。但是,如果情況足夠複雜,我會一直使用enum返回值,如果情況足夠複雜,請執行#3而不是#2

+0

偉大的總結!我將在每個類中封裝每個返回值的行爲,這樣我可以稍後添加更多的功能。 – TheInnerParty 2015-04-02 18:58:02

1

你可以使用-101指示太低正確分別太高。這會減少你的代碼大小,並且相對容易理解。

在這種情況下,可以使用條件< 0== 0> 0

好程序是簡單的,並且可以通過能夠與給定的程序(通用)來解決的任務的數量來測量,並且它是多麼小的(可以測量作爲代碼+文檔大小)

1

你需要的是一個枚舉類型 - 這是一個簡單的值類型(例如像int,而不是像NSObject那樣的引用類型),它使用一組固定的字面值定義。例如:

typedef enum { TooLow, JustRight, TooHigh } GuessClasification; 

定義新類型,GuessClasification,其具有三個值TooLowJustRightTooHigh

您可以將此類型聲明放在您的類頭文件中。

使用這個你的方法變爲:

- (GuessClassification) guessSecret:(int)g 
{ 
    if (g>Secret) 
     return TooHigh; 
    else if (g<Secret) 
     return TooLow; 
    else 
     return JustRight; 
} 

您同樣使用這種類型的整數和其他值類型,所以你可以==測試平等,使用文字作爲case值在switch聲明等。

HTH