操作数据成员时:以下哪项被认为是最佳实践

When manipulating data members: which of the following is considered best practice

我想开始采用最佳做法,并且看到 class 成员以不同的方式被操纵。我不知道以下示例中有任何细微或显着的差异。

如果这两个或另一个建议中的任何一个,我想澄清一个最佳方法。

const Fraction & Fraction::timesEq(const Fraction & f) {

  //First approach
  numerator *= f.numerator;
  denominator *= f.denominator;

  //Second approach
  numerator *= f.getNumerator();
  denominator *= f.getDenominator();

  return (*this); //would 'return' statement this be considered best practice?
}

我推荐第三种方法。它将函数与分子和分母的表示隔离开来。

onst Fraction & Fraction::timesEq(const Fraction & f) {

  this->getNumerator() *= f.getNumerator();
  this->getDenominator() *= f.getDenominator();

  return (*this);
}

第二种方法在方法的子类化和可能的虚拟重新定义中幸存下来如果这对特定情况很重要但更麻烦和无聊。

在一个简单的 class 中表示像你这样的有理数,我会遵循 KISS 原则并选择第一个。

如果 class 更复杂 and/or 您需要(可能是虚拟的)getters/setters 的灵​​活性,最好保持一致并与表示完全分离:

const Fraction & Fraction::timesEq(const Fraction & f) {
    setNumerator(getNumerator() * f.getNumerator());
    setDenominator(getDenominator() * f.getDenominator());
    return *this;
}

是否值得增加复杂性需要根据具体情况来决定。