为什么从静态方法访问非静态方法是糟糕的设计
Why is accessing a non static method from static method is Bad design
我正在从静态方法访问非静态方法。下面是代码。我读了它糟糕的设计 source。为什么这个糟糕的设计请帮助我理解。
如果可以,如何实现。
#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();
}
由于问题是针对一般情况的,这里引用 Wikipedia:
Static methods are meant to be relevant to all the instances of a class rather than to any specific instance.
A static method can be invoked even if no instances of the class exist yet.
因此,您应该考虑将静态方法放在 class 命名空间中,用于在 class 上进行操作,而不是在 class 的 instances/objects 上操作。
在创建单例的情况下,您不是从静态方法访问非静态方法,而是在静态方法中初始化该(静态)对象的实例initialiser
。
Why is accessing a non static method from static method is Bad design
它本身不是,因为您实际上是在使用静态方法中的静态成员
然而,这段被剪掉的代码太死板了,太他妈的过度设计了。这意味着一旦新需求开始发挥作用,更有可能出现错误,变得一团糟。
- 缺陷:此代码不是线程安全的。您应该实例化
initializer
,而不是在 GetInstance
中,而是使用 Base* Base::initialiser{new Base()};
,它保证从 c++11 开始是线程安全的。
- 缺陷:像这样的 class 应该极其谨慎地导出。或添加
final
以防止这种可能性。
- 设计:此代码仍然具有零行功能。你还在管道。您想重新考虑这是否是解决问题的最佳设计。
- design : 目的是提供一个单例。我们开发者喜欢强制执行不必要的约束,例如唯一性。当需要在为单例设计的系统中支持两个实例时,我们必须重构很多东西。
我正在从静态方法访问非静态方法。下面是代码。我读了它糟糕的设计 source。为什么这个糟糕的设计请帮助我理解。 如果可以,如何实现。
#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();
}
由于问题是针对一般情况的,这里引用 Wikipedia:
Static methods are meant to be relevant to all the instances of a class rather than to any specific instance.
A static method can be invoked even if no instances of the class exist yet.
因此,您应该考虑将静态方法放在 class 命名空间中,用于在 class 上进行操作,而不是在 class 的 instances/objects 上操作。
在创建单例的情况下,您不是从静态方法访问非静态方法,而是在静态方法中初始化该(静态)对象的实例initialiser
。
Why is accessing a non static method from static method is Bad design
它本身不是,因为您实际上是在使用静态方法中的静态成员
然而,这段被剪掉的代码太死板了,太他妈的过度设计了。这意味着一旦新需求开始发挥作用,更有可能出现错误,变得一团糟。
- 缺陷:此代码不是线程安全的。您应该实例化
initializer
,而不是在GetInstance
中,而是使用Base* Base::initialiser{new Base()};
,它保证从 c++11 开始是线程安全的。 - 缺陷:像这样的 class 应该极其谨慎地导出。或添加
final
以防止这种可能性。 - 设计:此代码仍然具有零行功能。你还在管道。您想重新考虑这是否是解决问题的最佳设计。
- design : 目的是提供一个单例。我们开发者喜欢强制执行不必要的约束,例如唯一性。当需要在为单例设计的系统中支持两个实例时,我们必须重构很多东西。