在编码时查看多种方法以实现相同结果时应考虑什么?

What to consider when looking at multiple methods to achieve the same result while coding?

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

我目前遇到的困难是因为我仍在学习我们称之为程序员的职业。

我有几种方法可以达到一个结果。我很好奇我是否应该选择一种方法,它清楚地说明了它是如何在代码中达到这一点的;或者更短的方法——同时不牺牲任何可读性。

下面我发布了我的 class 中的片段,展示了我的意思。

这个函数使用 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;
}

这两个功能都经过测试,并且总是return准确的结果。当谈到编码标准时……我们是否选择了更长且更容易遵循的标准?还是更短更容易理解?

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

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

第二个优先级很重要的原因是:

  • 这是防止您首先编写错误的关键
  • 以后更容易发现bug
  • 以后修复bug更容易
  • 不管你怎么想,6个月后你就不会记住细节了。

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

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