2015-10-19 4 views
1

Я хочу начать применять передовую практику и видеть, как ученики манипулируют по-разному. В следующем примере я не знаю каких-либо тонких или существенных различий.При манипулировании элементами данных: какая из следующих считается лучшей практикой

Я хочу уточнить оптимальный подход, если какое-либо из двух или других предложений.

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? 
} 

ответ

2

Я бы рекомендовал третий подход. Он изолирует функцию от представления числителя и знаменателя.

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

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

    return (*this); 
} 
3

Второй подход выживает подклассы и возможное виртуальное redifinitions из методов , если это имеет значение для конкретного случая но более громоздкого и скучный.

3

В простом классе, представляющем рациональные числа, такие как ваши, я бы выполнил принцип KISS и пошел первым.

Если класс является более сложным и/или вам нужна гибкость (возможно, виртуальных) геттеры/сеттеры, это может быть хорошей идеей, чтобы быть последовательным и отвязать от представления полностью:

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

: Ли это стоит добавить сложность необходимо решить в каждом отдельном случае.

Смежные вопросы