我在想,在使用良好的编程实践方面,应该做什么更好。我有一堂课,帐户。它有一个数据记忆器,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" );
}一种做法比另一种更好吗?调用该函数是否需要更多的时间或其他什么?
如果这有意义的话。抱歉如果这让人困惑的话。我不太知道还能怎么解释。
发布于 2014-01-20 06:16:49
如果将实现放在一个离散的编译单元中,那么是的,可能会有访问该元素的开销,因为程序可能必须执行跳转和返回。但是,编译器/链接器也有可能在“链接时间优化”期间解决这个问题。
您还可以通过提供getter的内联实现来避免这种情况:
class Account {
double m_balance;
public:
...
double getBalance() const { return m_balance; }
...
};这主要是关于良好的封装。当您执行草率或部分封装时,您会给您的用户带来负担,让您了解类在简单访问其成员之外是如何工作的。例如,当您返回原始指针时,通常是这样的--最终用户现在负责知道是否、如何以及何时释放指针值。
另外,吸气器也是防止未来的好方法。也许在将来,您不会主动维护"m_balance“,或者您需要添加一些线程保护来防止访问它。如果您的用户都直接访问m_balance,他们只会得到错误和奇怪的行为。如果他们已经通过了getBalance,他们就不需要改变任何东西了。
发布于 2014-01-20 04:00:45
getBalance向程序保证,任何外部用户/调用者都不能错误地使用m_balance的值(即更改它,等等)。"getter“的概念确保了所有对该数据成员的公共使用都是”获取“,而不是设置。
“这需要更多时间吗?”不是以牺牲安全和良好的代码为代价。早熟的优化是有害的。优化是由于需要而产生的。如果使用函数访问变量会降低代码的速度,那么在运行时可能还有其他方法来降低这种复杂性。
https://stackoverflow.com/questions/21226021
复制相似问题