Я хочу начать применять лучшие практики и видел, как учениками манипулировали по-разному. Я не знаю ни тонких, ни существенных различий в следующем примере.
Я хотел бы уточнить оптимальный подход, если любое из двух или другого предложения.
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?
}
Второй подход переживает создание подклассов и возможные виртуальные переопределения методов если это имеет значение для конкретного случая но более громоздким и скучным.
В простом классе, представляющем такие рациональные числа, как ваш, я бы следовал принципу KISS и перешел к первому.
Если класс более сложный и / или вам нужна гибкость (возможно, виртуальная) методов получения / установки, может быть хорошей идеей быть последовательным и полностью отделенным от представления:
const Fraction & Fraction::timesEq(const Fraction & f) {
setNumerator(getNumerator() * f.getNumerator());
setDenominator(getDenominator() * f.getDenominator());
return *this;
}
Стоит ли это дополнительной сложности, нужно решать в каждом конкретном случае.
Я бы порекомендовал третий подход. Он изолирует функцию от представления числителя и знаменателя.
onst Fraction & Fraction::timesEq(const Fraction & f) {
this->getNumerator() *= f.getNumerator();
this->getDenominator() *= f.getDenominator();
return (*this);
}