这是一个新手问题。在我简单的学习摇滚剪刀纸游戏程序中,我有单个游戏实例类。游戏实例类有几个私有成员,如总转数,获胜数,领带数等。这些类成员仅用于公共游戏实例的类方法,它启动和处理游戏。我应该按照良好的代码风格为我的班级成员创建特殊的私有getter和setter方法吗?在游戏处理方法中直接与班级成员合作是否更好?
class GameInstance{
unsigned int m_totalTurns;
unsigned int m_wins;
unsigned int m_loses;
unsigned int m_ties;
int getWins() const; // is it a bad idea?
int getLoses() const; // is it a bad idea?
int getTotalTurns() const; // is it a bad idea?
int getTies() const; // is it a bad idea?
// some setters-like incrementing // is it a bad idea?
// same private members functions // is it a bad idea?
// .... // is it a bad idea?
void finishGame();
public:
explicit GameInstance():m_totalTurns(0), m_wins(0), m_loses(0), m_ties(0){};
void startGame();
};
答案 0 :(得分:4)
你可能会把吸气剂公之于众,或者没有任何意义。
对于任何getter或setter,它们都是该类接口的一部分。如果您不希望从外部直接获取这些成员或设置它们,请不要公开getter和setter。
有了你的,吸气鬼可能是一个想法,如果你宁愿让addResult()
指定一个胜利,平局或者失败并且在相关的统计数据中加一个,那么setter看起来可能是一个坏主意。
作为单个getter的替代方法,你可能会有一个“getGameStats()”,它可以一次性返回所有4个。
如果您询问getter而不是公开访问(而不是完全不提供访问权限),对于具有方法的类,通常应该将所有数据成员设为私有,并使用getter和必要的setter。调试使用它们的代码也更容易,因为您可以将断点插入到访问变量的位置。
在“纯数据”结构中,您可以将成员公开。实际上在这种情况下,您可能会有一个“GameStats”结构,您可以从getGameStats()函数返回该结构。 GameStats本身只包含数字,你可以公开这些数字。但是,您的类中的GameStats实例应该是一个私有实例。
答案 1 :(得分:1)
我认为这是一个很好的方法。它隐藏了实施。编辑起来比较简单。假设您有100个使用getTotalTurns()
的地方。有一天你需要改变吸气剂的逻辑。你需要改变一个地方而不是100个。不要考虑性能。编译器可能会内联所有这些功能。正如@CachCow所说,没有真正的理由让他们成为私人(塞特/吸气者)。您可以使它们受到保护,以授予派生类的访问权限。但大多数时间的吸气剂/制定者都是供公众使用的。
答案 2 :(得分:0)
如果您有单线程项目和主界面,并且与用户的交互都在GameInstance类中,则您无需在游戏过程中访问theese字段。 当游戏结束时,你可以通过struct获得所有这些:
struct GameInfo
{
unsigned int m_totalTurns;
unsigned int m_wins;
unsigned int m_loses;
unsigned int m_ties;
};
class GameInstance
{
private:
GameInfo gameInfo;
public:
GameInfo GetInfo() const;
};
这种方法仍然安全,但您不必编写烦人的吸气剂数量。
答案 3 :(得分:0)
关于何时/为什么要在这里使用getter和setter,有一个相当好的讨论:
SO Getters and Setters Question
但它经常值得使用它们,即使它只是供内部使用,它确保当您访问这些值时,您正在以统一的方式进行,确保在您编辑它们时您遵守您的规则如何修改它们。
基本上它有助于在大多数情况下使代码更清晰。
编辑:
我应该指出,在使用私人吸气剂和制定者时,它更多的是个人选择,所以没有真正的“错误”答案,除非有一些我不知道的东西