我想知道在使用良好的编程习惯方面做得更好。我有一个班级,帐户。它有一个数据memeber,m_balance。我的问题是,在我的成员函数中,我应该直接使用m_balance,还是成员函数Account :: get_balance(),当我需要使用帐户余额进行比较或其他任何时候。
例如......
int Account::get_balance() const
{
return m_balance;
}
void Account::debit( int money_value )
{
if( money_value > 0 && money_value <= m_balance )
m_balance -= money_value;
else if( money_value == 0 )
throw std::invalid_argument( "Invalid debit value" );
else if( money_value > m_balance )
throw std::invalid_argument( "Debit amount exceeds account balance" );
}
或者我应该定义成员函数......
void Account::debit( int money_value )
{
if( money_value > 0 && money_value <= get_balance() )
m_balance -= money_value;
else if( money_value == 0 )
throw std::invalid_argument( "Invalid debit value" );
else if( money_value > get_balance() )
throw std::invalid_argument( "Debit amount exceeds account balance" );
}
一种做法是否优于另一种做法?调用函数需要花费更多时间吗?
如果这是有道理的。对不起,如果它令人困惑。我不太清楚如何解释它。
答案 0 :(得分:2)
getBalance确保程序没有外部用户/调用者可以毫不费力地使用m_balance的值(即更改它等)。 “getter”的想法确保该数据成员的所有公共使用都是“获取”,而不是设置。
“需要更多时间吗?” 不以安全和良好的代码为代价。预成熟优化是邪恶的。由于需要更多的优化而产生优化。如果使用函数访问变量会降低代码速度,那么可能还有其他方法可以在运行时降低复杂性。
答案 1 :(得分:1)
如果将实现放在离散编译单元中,则是,访问该元素可能会有开销,因为程序可能必须执行跳转并返回。但是,编译器/链接器也可以在“链接时优化”期间解决此问题。
通过提供getter的内联实现,您也可以首先避免这种情况:
class Account {
double m_balance;
public:
...
double getBalance() const { return m_balance; }
...
};
这主要是关于良好的封装。当您进行草率或部分封装时,您会给用户带来负担,以便在简单地访问其成员之外了解该类的工作方式。例如,当您返回原始指针时通常会出现这种情况 - 最终用户现在负责了解是否,如何以及何时释放指针值。
Plus getters是一种适合未来发展的好方法。也许将来你不会主动维护“m_balance”,或者你需要添加一些线程保护来防止访问它。如果您的用户都直接访问m_balance,他们只会遇到错误和奇怪的行为。如果他们已经通过getBalance,他们将不需要改变任何东西。