2016-09-29 36 views
1

我想優化以下順序,因爲運行時間線性增長,更多的是我添加的操作。有沒有更聰明的方法來實現這個在同一個類中,而不使用更多的輔助類/模式? 在此先感謝(並對編輯感到抱歉..)!如何用空檢查優化一系列操作?

public void SomeMethod(ClassZero foo) 
{ 
    var targetName = ""; 

    var a = foo as ClassA; 
    if (a != null) targetName = a.DoSomething(); 

    var b = foo as ClassB; 
    if (b != null) targetName = b.DoSomethingElse(); 

    var c = foo as ClassC; 
    if (c != null) targetName = c.DoSomethingEntirelyElse(); 

    var d = foo as ClassD; 
    if (c != null) targetName = d.DoSomethingInAnotherParallelWorld(); 

    var furtherUse = localVariable.Process(targetName); 
} 
+3

強烈建議您考慮是否可以使用抽象基類或接口來代替。另外,假設你找到一個匹配,你可能會'返回',你的代碼不會這樣做。這可以防止任何無關的類型檢查。除此之外,如果你需要檢查類型,那麼你將不得不花時間去做。我懷疑你會在你的類型檢查中發現性能瓶頸。 –

+0

我會重新考慮我的設計,你可以簡單地在這個地方的界面上工作,並在這裏注入你正在調用的方法的具體實現。基本上ClassA和ClassB實現了IDoWork,它包含一個void DoWork()方法。你直接在上面的代碼 – Xeun

+0

'中直接調用它'而不使用更多的helper類/模式?'當你需要改進代碼時,你很可能會想要使用某種輔助類/模式來實現它。任何時候當你爲自己提供這樣的限制時,你基本上都禁止你的問題的最佳解決方案。當面對這樣的問題時,你應該問的是,我如何利用助手類或模式來封裝我的程序的機制/行爲。 – Servy

回答

4

理想的情況下,而不是詢問的基類的類型,並選擇一個不同的公共方法,你就必須在基類中的一個方法調用(或者甚至更好,一個接口),可以不管被稱爲的基礎實施。

一般來說,這稱爲多態性,其中可以將多個派生類視爲其基類進行交互時使用相同的對象。

public void SomeMethod(ClassZero foo) 
{ 
    var targetName = ""; 

    targetName = foo.GetTargetName(); 

    var furtherUse = localVariable.Process(targetName); 
} 

和其他地方:

public abstract class ClassZero 
{ 
    public abstract string GetTargetName(); 
} 

public class ClassA : ClassZero 
{ 
    public override string GetTargetName() 
    { 
     return DoSomething(); 
    } 
} 

public class ClassB : ClassZero 
{ 
    public override string GetTargetName() 
    { 
     return DoSomethingElse(); 
    } 
} 

或者,你可以使用一個接口。這通常是首選,因爲它是一個關於類的顯式合約,它提供了一個函數,在這種情況下,獲得一個TargetName。與抽象基類上的抽象方法相比,它稍微混淆了一點。如果您不擁有ClassZero基類,那也很好。

public interface ITargetNameGenerator 
{ 
    string GetTargetName(); 
} 

public void SomeMethod(ITargetNameGenerator foo) 
{ 
    var targetName = ""; 

    targetName = foo.GetTargetName(); 

    var furtherUse = localVariable.Process(targetName); 
} 


public class ClassA : ClassZero, ITargetNameGenerator 
{ 
    public string GetTargetName() 
    { 
     return DoSomething(); 
    } 
} 
//etc... 
+0

我絕對同意這是正確的解決方案,但是如果他們沒有ClassZero的所有權,那麼展示如何使用接口來實現它可能會有所幫助。像公共ClassA:ClassZero,IGetTargetNames等。 –

+0

@TJRockefeller非常好的一點。我也會補充一點。 –