簡體   English   中英

靜態班級和班級設計

[英]Static Classes & Class design

在設計數據訪問層時,我希望將所有類都設置為靜態,以便不需要對象實例化,並且可以使用類名訪問該類的所有成員。

這是一個好方法。 如果是,那為什么我們需要一個實例類類型呢? 這將對n個客戶端想要訪問我的DAL的應用程序的性能產生影響,然后因為根本沒有創建對象而導致管理請求的問題?

我知道靜態類無法實例化,應該用於Logging,Utility方法等,因為所有對象都必須以類似的方式運行。假定所有DAL類都以相同的方式運行是否合法?具有相同的功能),因此使其成為靜態對象而不是實例化。

請指教。

類型要么在概念上代表與實例相關的操作,要么不代表。 在此不考慮性能。

如果您的方法沒有狀態,或者其狀態被設計為在整個應用程序中所有方法調用之間共享,則該方法應該是靜態的。 如果需要在成員之間共享單獨的狀態,但不與整個應用程序共享,則它們必須是非靜態的。 該類型通常需要根據其概念上的表示來選擇一個或另一個。 這不是一個實際的選擇。

通常最好避免使用靜態類,因為它們會將緊密耦合引入您的代碼中。 它們使單元測試變得更加困難,因為這些呼叫是“硬連線”的,並且不容易被打斷。

更好的辦法是使它們成為實例,但僅實例化單個實例。 如果將其與依賴項注入結合在一起(即,將DAL對象傳遞到需要它的類中),則會得到松散的耦合,並且可以通過存根版本進行單元測試-查找Unity或Castle Windsor或其他IoC框架,看看如何作品。

這會對性能產生影響-靜態方法調用比實例方法調用快,尤其是在處理后期綁定時。 但這也是面向對象編程的最大優勢。

如果僅使用靜態類,因此僅使用靜態方法調用,則無法“交換對象”,而我認為這是面向對象編程中最重要的部分。 看看面向對象設計的SOLID原理,您將了解這種編程風格的真正好處。 當然,這可能會帶來性能上的損失,但是通常,您無需考慮它,除非您想對例如實時應用程序進行編程。 正確使用OOP和OOD可以使您的代碼極其靈活並且(某種程度上)易於理解。

一個有用的設計模式是單例的變體。 設置您的靜態實現,將靜態方法保留為private ,通過對象實例將其公開,如下所示:

class MySingletonClass
{
    //-----------------------------------------
    // here, we hide the static implementations
    //-----------------------------------------
    private static int privateFoo()
    {
        /* do something useful here */
    }
    private static string privateBar()
    {
        /* do something useful here */
    }

    //---------------------------------------
    // and expose them via an object instance
    //---------------------------------------
    public int Foo()
    {
        return privateFoo() ;
    }
    public string Bar()
    {
        return privateBar() ;
    }
}

現在,您的靜態類具有與普通對象實例相同的語義。 因此,將調用靜態方法:

SomeStaticClass.SomeStaticMethod() ;

因此,非靜態類是引用:

SomeNonStaticClass instance = new SomeNonStaticClass() ;
instance.SomeNonStaticMethod() ;

通過實例方法公開[private]靜態方法,您已經對對象的用戶隱藏了實現 然后,當您意識到靜態方法不再起作用(出於某種原因)並且類必須變為非靜態時,您要做的就是修改類的內部實現。

如果類的用戶直接引用靜態方法,則必須更改代碼庫中的每個引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM