在编写多种方法时要考虑什么来实现相同的结果?

时间:2017-05-02 22:15:09

标签: c++ standards

我目前正在使用C ++编写代码,创建一个全方位的计算器,完成后,将能够处理所有主要和常见的数学过程。

我正在打击的当前墙是因为我还在学习职业,我们称之为程序员。

我有几种方法可以实现单一结果。我很好奇我是否应该选择一种方法,该方法清楚地分析了代码中的这一点;或者更短的方法 - 同时不牺牲任何可重复性。

下面我发布了课堂上的片段,显示了我的意思。

这个函数使用if语句来确定是否需要一个公分母,但是它是多行。

Fraction Fraction::addFraction(Fraction &AddInput)
{
    Fraction output;

    if (m_denominator != AddInput.m_denominator)
    {
        getCommonDenominator(AddInput);

        output.setWhole(m_whole + AddInput.m_whole);
        output.setNumerator((m_numerator * firstchange) + (AddInput.m_numerator * secondchange));
        output.setDenominator(commondenominator);
    }
    else
    {
        output.setWhole(m_whole + AddInput.m_whole);
        output.setNumerator(m_numerator + AddInput.m_numerator);
        output.setDenominator(m_denominator);
    }

    output.simplify();

    return output;
}

下面的这个函数有一个共同点;重复分子上的步骤;然后简化到最低的条件。

Fraction Fraction::addFraction(Fraction &AddInput)
{
    getCommonDenominator(AddInput);

    Fraction output(m_whole + AddInput.m_whole, (m_numerator * firstchange) + (AddInput.m_numerator * secondchange), commondenominator);

    output.simplify();

    return output;
}

这两个功能都经过测试,并始终返回准确的结果。在编码标准方面......我们选择更长时间并且可以跟随吗?还是更简单易懂?

1 个答案:

答案 0 :(得分:0)

您对代码的首要任务应该是正确 你的第二个代码优先应该是“如果以前从未见过这个人的人会做出微小的改变,哪一个他不太可能破坏?

实际上有很多内容。在高层次上理解有多难?如何抽象出来是神秘的细节?有什么惊喜吗?你必须知道什么怪癖?是否有必须处理的边缘情况?

第二优先事项很重要的原因是:

  • 这是阻止你首先编写错误的关键
  • 以后更容易发现错误
  • 以后更容易修复错误
  • 不管你怎么想,你都不会记得6个月内的细节。

两个实现在每个分支的复杂性方面看起来同样困难,但第一个实现了分支,所以我倾向于第二个用于理解。细节似乎在两者中被抽象出来,如果有惊喜或怪癖,我不会立即看到它们(但这有点重要,它们很容易被忽视)。我没有看到边缘情况的任何特殊处理,因此如果边缘情况存在,则评论会很好。

与选择无关,但在审查代码的主题时,目前还不清楚如何处理没有小数部分的分数,但这可能是完整类文档的一部分,这很好。两个代码路径都通过可变引用获取AddArgument,这是不好的,并且要求this也是可变的,这也是不好的。两者都有名为get*()的方法似乎修改(getCommonDenominator),这很糟糕。该代码似乎使用外部变量(firstchangesecondchange?),这是防止错误的重大打击。