繁体   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