为什么从静态方法访问非静态方法是糟糕的设计

Why is accessing a non static method from static method is Bad design

本文关键字:静态方法 访问 为什么      更新时间:2023-10-16

>我正在从静态方法访问非静态方法。下面是代码。我读了它糟糕的设计来源。为什么这个糟糕的设计请帮助我理解。 如果是这样,如何实现它。

#include<iostream>
class Base 
{
public :
static Base* initialiser;
void BaseMethod() 
{
std::cout<<"Non static method Invoked"<<std::endl;
}
static  Base* GetInstance() 
{
if (!initialiser)
initialiser = new Base();
return initialiser;
}
};
Base* Base::initialiser = nullptr;
class Service 
{
public: 
void ServiceMethod()
{
Base::GetInstance()->BaseMethod();
}
};
int main()
{
Service obj;
obj.ServiceMethod();
}

为什么从静态方法访问非静态方法是 糟糕的设计

它本身不是,因为您实际上是在使用静态方法中的静态成员

然而,这个被剪掉的代码太死板了,太该死的过度设计了。这意味着一旦新要求发挥作用,更有可能出现错误,变得一团糟。

  • 缺陷:此代码不是线程安全的。你应该实例化initializer而不是在GetInstance,而是使用Base* Base::initialiser{new Base()};,这保证在 c++11 中是线程安全的。
  • 缺陷:像这样的类应该非常谨慎地派生。或者添加final以防止这种可能性。
  • 设计:此代码的功能仍然为零行。你还在管道。您需要重新考虑这是否是要解决的问题的最佳设计。
  • 设计:目的是提供一个单例。我们喜欢强制实施不必要的约束,例如唯一性。当需要在为单例设计的系统中支持两个实例时,我们必须重构很多东西。

由于这个问题是针对一般情况的,以下是维基百科的引述:

静态方法旨在与类的所有实例相关,而不是与任何特定实例相关。

即使尚不存在该类的实例,也可以调用静态方法。

因此,您应该将静态方法视为类命名空间中,用于对类而不是对类的实例/对象进行操作。

在创建单例的情况下,您不是从静态方法访问非静态方法,而是在静态方法中初始化该(静态)对象的实例initialiser