2011-05-29 77 views
4
 int scalar = creature is SpecialCreature ? (creature.IsAwesome ? 700 : 500) : (creature is NotSoNormalCreature ? 
      (creature.IsAwesome ? (creature is IGreatCreature ? 450 : 280) : 240) : 
      (creature.IsAwesome ? (creature is IGreatCreature ? 300 : 200) : 160)); 

我該如何編寫代碼以使其更具可讀性?C#代碼可讀性問題

我以爲只是建立IFS的,但後來我想到了做某種「ConditionFactory」怎麼樣?這是否有意義,還是這樣簡單的任務太複雜了?

int scalar; 

if (creature is SpecialCreature) 
{ 
    scalar = creature.IsAwesome ? 700 : 500; 
} 
else if (creature is NotSoNormalCreature) 
{ 
    if (creature.IsAwesome) 
    { 
     scalar = creature is IGreatCreature ? 450 : 280; 
    } 
    else 
    { 
     scalar = 240; 
    } 
} 
else 
{ 
    if (creature.IsAwesome) 
    { 
     scalar = creature is IGreatCreature ? 300 : 200; 
    } 
    else 
    { 
     scalar = 160; 
    } 
} 
+7

讓我看看等價的if-then語法 - 這會讓我的眼睛受傷... – IAbstract 2011-05-29 00:50:28

+0

這些標量值在應用程序執行期間是否改變,或者它們對於每種生物類型都是永久的? – twk 2011-05-29 00:54:19

+0

當生物爲SpecialCreature並且IGreatCreature或不IGreatCreature時,它計數相同。 – twk 2011-05-29 01:01:41

回答

8

不知道你去爲完全的東西,但因爲你使用的是基本類型繼承鏈,您可能選擇這樣做

interface ICreature 
{ 
    bool IsAwesome { get; set; } 
    int GetScalar(); 
} 

abstract class Creature : ICreature 
{ 
    public bool IsAwesome { get; set; } 
    public virtual int GetScalar() 
    { 
     return 160; 
    } 
} 

class SpecialCreature : Creature 
{ 
    public override int GetScalar() 
    { 
     return this.IsAwesome ? 700 : 500; 
    } 
} 

class NotSoNormalCreature : Creature 
{ 
    public override int GetScalar() 
    { 
     return this.IsAwesome ? 450 : 280; 
    } 
} 

// more ICreatures... 

這將讓你有生物實現自己邏輯確定的標量,你的消費代碼可以失去照顧的併發症。

ICreature creature = GetCreatureFromSomewhere(); 
int scalar = creature.GetScalar(); 
+0

我喜歡你的想法,但是,這個標量是用來計算一個特定的下降的機會,並且在整個地方使用公式的想法會使它更難追蹤或改變未來 – bevacqua 2011-05-29 01:15:15

+1

+1做得好, 容易明白。 – twk 2011-05-29 01:25:30

+0

@尼科,抱歉,您覺得它不能解決您的具體需求。然而,對於某些處於類似情況的人來說這可能是有益的,如果不在這裏,您可能會發現這樣的模式對別處有用。 – 2011-05-29 01:28:35

0

我認爲真正的問題是,您正在對「配置數據」進行硬編碼。如果你在哪裏說,把這些「設置」翻出來放到一個XML配置文件中,那麼這個混亂不會消失?

這也可能看起來像是矯枉過正,直到你來調整你的各種配置,使遊戲更具可玩性......一個單獨的配置文件允許你輕鬆地播放(和恢復)。


編輯:

順便說一句,我就格式化爲低於嵌套terniary聲明......,以使其更具可讀性。

int scalar = 
    creature is SpecialCreature 
    ? creature.IsAwesome ? 700 : 500 
    : creature is NotSoNormalCreature 
    ? creature.IsAwesome 
     ? creature is IGreatCreature ? 450 : 280 
     : 240 
    : creature.IsAwesome 
     ? creature is IGreatCreature ? 300 : 200 
     : 160 
; 

乾杯。基思。

+3

-1:它不能真正解決問題 – twk 2011-05-29 01:04:11

+0

爲什麼我會使用xml?這些都是靜態的,只是物品掉落的公式,而不是綁定到生物上的配置值。 -1 – bevacqua 2011-05-29 01:05:10

4

這不是很你需要什麼在這裏,但我使用擴展方法來實現這種鏈法時的條件就可以解決到Or的或與公司的名單。

喜歡的東西

if (true.IfOr(condition1 == a, condition2 == b) 
{ 
    something(); 
} 

擴展方法則很簡單:

public static bool IfOr(this bool result, params bool[] tests) 
{ 
    foreach (bool test in tests) 
    if (!test) 
     return !result; 
    return result; 
} 

,可以工作,雖然它可能不是非常最佳的另一種方法是使用在謂詞委託。網絡並定義執行您的個人邏輯單元的方法列表。然後,您可以用lambda替換嵌套的第三級操作符。 我沒有這個代碼示例,雖然手,抱歉。

最後雖然有時只是沒有什麼比一個很好的舊switch語句更好。我認爲,淨趨於編譯這些在跳轉表所以只要你通過最整除的人安排你的測試,然後再實際上你可以得到相當高性能和可讀的代碼。它是可維護的,而不是用技巧來隱藏邏輯或實現。

0

這是怎麼了我重新做了代碼,並使其可讀

// Original code spread apart 
int scalar = creature is SpecialCreature ? (
    creature.IsAwesome ? 700 : 500 
) : (
    creature is NotSoNormalCreature ? (
     creature.IsAwesome ? (
      creature is IGreatCreature ? 450 : 280 
     ) : 240 
    ) : (
     creature.IsAwesome ? (
      creature is IGreatCreature ? 300 : 200 
     ) : 160 
    ) 
); 

// Readable code with hybrid if() and ? : 
if (creature is SpecialCreature) 
{ 
    scalar = creature.IsAwesome ? 700 : 500; 
} 
else if (creature is NotSoNormalCreature) 
{ 
    if (creature.IsAwesome) 
    { 
     scalar = creature is IGreatCreature ? 450 : 280; 
    } 
    else 
    { 
     scalar = 240; 
    } 
} 
else 
{ 
    if (creature.IsAwesome) 
    { 
     scalar = creature is IGreatCreature ? 300 : 200; 
    } 
    else 
    { 
     scalar = 160; 
    } 
} 

我想推薦每個類中移動這樣計算如果可能,覆蓋了不同的分支。

+1

你剛纔編輯的問題看起來就像我的答案..真棒! – ja72 2011-05-29 01:25:40

+0

我還沒有看到你的答案 – bevacqua 2011-05-29 01:32:03

0

如何歷久彌新:

if (creature is SpecialCreature) 
{ 
    scalar=getSpecialCreatureScalar(creature); 
} 
else if (creature is NotSoNormalCreature) 
{ 
    scalar=getNotSoNormalCreatureScalar(creature); 
} 
else 
{ 
    scalar=getScalar(creature); 
} 

..和再

int GetSpecialCreatureScalar(SpecialCreature creature) 
{ 
    return creature.IsAwesome ? 700 : 500; 
} 

int GetNotSoNormalCreatureScalar(NotSoNormalCreature creature) 
{ 
    if (creature.IsAwesome) 
    { 
     return creature is IGreatCreature ? 450 : 280; 
    } 
    else 
    { 
     return 240; 
    } 
} 

int GetScalar(Creature creature) 
{ 
    if (creature.IsAwesome) 
    { 
     return creature is IGreatCreature ? 300 : 200; 
    } 
    else 
    { 
     return 160; 
    } 
} 

..Gives的,如果是一個意思。使不同的國際海事組織。

+0

你爲什麼要這樣的功能?我會把第一個字母大寫。 – bevacqua 2011-05-29 02:02:52