【问题标题】:Why is accessing a non static method from static method is Bad design为什么从静态方法访问非静态方法是糟糕的设计
【发布时间】:2019-07-25 06:12:04
【问题描述】:

我正在从静态方法访问非静态方法。下面是代码。我读到了它糟糕的设计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();
}

【问题讨论】:

  • 我看不出你的代码有什么问题。无论如何,大多数设计问题要么是意见问题,要么取决于具体情况。
  • 单例和全局状态通常可以说是糟糕的设计。从静态成员函数调用非静态成员函数只是一个装饰细节,根本不是设计问题。
  • 你的GetInstance方法应该使用函数级静态变量来存储和初始化单例,这样更简单,代码更少,更安全
  • 在这种情况下甚至有理由使用单例吗?

标签: c++ c++11 static-methods non-static


【解决方案1】:

为什么从静态方法访问非静态方法是不好的设计

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

然而,这段被剪掉的代码太死板了,太他妈过度设计了。这意味着一旦新的需求开始发挥作用,就更有可能出现问题,变得一团糟。

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

【讨论】:

    【解决方案2】:

    由于问题是针对一般情况的,因此引用Wikipedia

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2011-03-02
      • 2018-05-30
      • 2011-11-03
      • 1970-01-01
      相关资源
      最近更新 更多