繁体   English   中英

C ++:全局变量与局部变量。 使用什么?

[英]C++: Global variable vs local variables. What to use?

有时我想使用全局变量,但取而代之的是使用局部变量。 让我们有一些Font类:

class Font {
public:

    class Alignment {
    public:
        unsigned short currentAlignment;
        unsigned short FONT_ALIGN_LEFT = 0;
        unsigned short FONT_ALIGN_CENTER = 1;
        unsigned short FONT_ALIGN_RIGHT = 2;
        // etc....
    };

    Alignment alignment;

    void setFontAlignment( unsigned short fontAlignment ) {
        this->alignment.currentAlignment = fontAlignment;
    }

};

要使用此类,我们需要执行以下操作:

Font font;
font.setFontAlignment( font.alignment.FONT_ALIGN_CENTER );
// if we need to check currentAlignment we need to do:
if ( font.alignment.currentAlignment == font.alignment.FONT_ALIGN_CENTER ) {...} // looks a little bit awful :)

或者我们有另一种方法可以做到这一点:

= Font.h =
#define FONT_ALIGN_LEFT 0
#define FONT_ALIGN_CENTER 1
#define FONT_ALIGN_RIGHT 2 
// etc....

class Font {
public:
    unsigned short currentAlignment;
    void setFontAlignment( unsigned short fontAlignment ) {
        this->currentAlignment = fontAlignment;
    }
}

要使用此功能:

#include "Font.h"
...
Font font;
font.setFontAlignment( FONT_ALIGN_CENTER );
if ( font.currentAlignment == FONT_ALIGN_CENTER ) {...} // looks a little bit better :)

哪一个更适合内存优化,为什么? 您更喜欢使用哪一个? 或者,也许您知道一些更好的解决方案?

尽管总是有例外,但是我通常会遵循以下准则:

  • 尽可能避免使用全局变量。 限制在最小适用范围内(在合理范围内)。

  • 除非特别明显的情况,否则避免再次猜测编译器。

实际上,是它们的组合。 但是,让我们澄清一下。 您不会在问题中谈论任何全局变量。 全局变量是在全局范围内定义的变量。

使用面向对象编程的主要原因不是它的效率(因为它比纯粹的过程代码要慢),而是它对世界建模的能力。 因此,在创建oop设计时,您不必太在乎资源(时间,内存),而应该对世界建模有多好。

第二个版本很糟糕,因为它在全局范围内引入了许多常量,因此您要避免这种情况。 同样,它在封装数据方面做得很糟糕(Font类的用户不应在乎对齐的值)。

第一个版本更好,但是存在一些问题。 首先,您需要考虑应该拥有的对象吗? 您实际上是否需要一个Alignment对象? 您可能需要它,但是在此特定示例中,我不知道为什么。 因此,您可以使它按原样建模世界,而无需引入一些人为因素:

class Font {
public:

    unsigned short currentAlignment;
    void alignLeft() {
        this->currentAlignment = 0;
    }
    void alignCenter() {
        this->currentAlignment = 1;
    }
    void alignRight() {
        this->currentAlignment = 2;
    }  
};

现在,它非常易于使用。 我不必在全局范围内保留不必要的常量。 现在,问题是当用户读取currentAlignment的值时会发生什么? 当然,您不需要使用常量,但是您不需要。 这实际上取决于您要建模的世界。 由于这是一个Font类,因此它应该是唯一真正关心对齐值的类。 如果其他人需要该值,则可以使用isCenter()之类的方法,当字体居中对齐时返回true。 而且,我会考虑将currentAlignment设为私有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM