好的编程实践?

时间:2014-01-20 03:57:26

标签: c++

我想知道在使用良好的编程习惯方面做得更好。我有一个班级,帐户。它有一个数据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" );
}

一种做法是否优于另一种做法?调用函数需要花费更多时间吗?

如果这是有道理的。对不起,如果它令人困惑。我不太清楚如何解释它。

2 个答案:

答案 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,他们将不需要改变任何东西。