有时我想使用全局变量而不是它使用局部变量。我们有一些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 :)
哪一个更适合内存优化?为什么?你更喜欢哪一个?或者您可能知道更好的解决方案吗?
答案 0 :(得分:1)
虽然有始终例外情况,但我通常会遵循以下指南(其中包括:-):
尽可能避免使用全局变量。限制为最小适用 范围(在合理范围内)。
避免第二次猜测编译器,除非非常明显 的情况。
答案 1 :(得分:1)
实际上,它们的组合。但是,让我们澄清一些事情。你不会在你的问题中谈论任何全局变量。全局变量是在全局范围内定义的变量。
使用面向对象编程的主要原因不是它的效率(因为它比纯粹的程序代码慢),而是它对世界进行建模的能力。因此,在创建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设为私有。