我目前正在使用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;
}
这两个功能都经过测试,并始终返回准确的结果。在编码标准方面......我们选择更长时间并且可以跟随吗?还是更简单易懂?
答案 0 :(得分:0)
您对代码的首要任务应该是正确 你的第二个代码优先应该是“如果以前从未见过这个人的人会做出微小的改变,哪一个他不太可能破坏?
实际上有很多内容。在高层次上理解有多难?如何抽象出来是神秘的细节?有什么惊喜吗?你必须知道什么怪癖?是否有必须处理的边缘情况?
第二优先事项很重要的原因是:
两个实现在每个分支的复杂性方面看起来同样困难,但第一个实现了分支,所以我倾向于第二个用于理解。细节似乎在两者中被抽象出来,如果有惊喜或怪癖,我不会立即看到它们(但这有点重要,它们很容易被忽视)。我没有看到边缘情况的任何特殊处理,因此如果边缘情况存在,则评论会很好。
与选择无关,但在审查代码的主题时,目前还不清楚如何处理没有小数部分的分数,但这可能是完整类文档的一部分,这很好。两个代码路径都通过可变引用获取AddArgument
,这是不好的,并且要求this
也是可变的,这也是不好的。两者都有名为get*()
的方法似乎修改(getCommonDenominator
),这很糟糕。该代码似乎使用外部变量(firstchange
?secondchange
?),这是防止错误的重大打击。