1

有时我会为是否应该将代码留在更大的块中或将它们分解为函数而感到痛苦。函数可以使其更清晰,因为它将代码分开,但我觉得有时使用注释可以使清晰度相同。我下面的代码是我正在初始化控件的 C# 代码。

在这里,我可以让它成为一个块或将它分成函数。您更喜欢这 3 种类型中的哪一种,为什么?如果代码的每个部分/类别(启用控件、初始标签值、控件属性)更大,您的答案会改变吗?也许每个 5-15 行?让我们假设里面的代码Initialize()除了通过 function 之外不会被太多重用Initialize()。也欢迎任何其他批评。谢谢。

protected void Initialize()
{
    for (int i = 0; i < numOfTrackBars; i++)
    {
        //Enable controls
        trackBarList[i].Enabled = true;
        trackBarLabelList[i].Enabled = true;
        trackBarFieldList[i].Enabled = true;

        //Initial label values
        trackBarLabelList[i].Text = trackBarNames[i];
        trackBarFieldList[i].Text = Convert.ToString(0);

        //Control properties
        trackBarList[i].Maximum = trackBarMaxValues[i];
        trackBarList[i].Minimum = trackBarMinValues[i];
    }
}

或者:

protected void Initialize()
{      
    for (int i = 0; i < numOfTrackBars; i++)
    {
        EnableControls(i);
        InitializeLabelValues(i);
        SetControlProperties(i);
    }
}

private EnableControls(int i)
{
    trackBarList[i].Enabled = true;
    trackBarLabelList[i].Enabled = true;
    trackBarFieldList[i].Enabled = true;
}

或者:

private void EnableControls()
{
    for(int i = 0; i < numOfTrackBars; i++)
    {
        trackBarList[i].Enabled = true;
        trackBarLabelList[i].Enabled = true;
        trackBarFieldList[i].Enabled = true;
    }
}

其他功能相同,因此 3 个 for 循环。

4

2 回答 2

3

评论是邪恶的。引用 R. Martin 的话:“评论是你的失败”。如果你需要写注释,说明你的代码写得不可读,需要一些额外的解释。

为什么评论不好:

  • 它们是用自然语言编写的,因此本质上不如代码精确并且通常模棱两可(尤其是在多语言团队中,或在不同级别的非母语人士中)。

  • 它们过时了。很少有人快速修复错误也会修复评论。而且没有办法验证它。

  • 它们是噪音 - 额外的字符会分散您阅读实际代码的注意力。

  • 它们为您的应用程序代码带来了另一个自由度。即使您浪费大量时间来设计评论政策、建立评论格式以及引入关于何时何地放置评论的精确规则,它们也会因开发人员而异。第一点提到了一个可能的原因,另一个是很难为自然语言编写精确的规则,这本质上是不精确的。评论标准的精确定义需要大量的规则和指南,给开发者带来了巨大的负担。

有时很难以可读的方式编写一些东西。有时事情本身就是复杂的,即使是实现它们的最简单的代码也不容易理解。有时您需要编写一些不明显的 hack 来满足 3rd 方库的一些奇怪要求。然后你写评论,知道这是通讯失败但没有别的办法。

这种罕见的注释将有其价值——如果有人阅读了没有任何注释的干净易读的代码,突然发现一个注释,那么他们就会知道这肯定是需要他们注意的重要事情,他们需要在这里小心。

当有很多评论时,它们只是被忽略了,您将无法告知真正重要的事情-您的评论将丢失在其他评论的海洋中。

恕我直言,您的代码的第二个和第三个版本之间的区别毫无意义。如果这些版本在代码重复方面没有一个更好,那么在我看来,您将使用哪个版本并不重要。您可以使用InitializeLabelValues而不是Initialize例如。

于 2013-10-19T11:41:47.117 回答
1

我的优先顺序是#2、#1、#3。

我发现#2 最清楚,因为它准确地显示了您在做什么:启用、标记和设置每个项目的属性。如果您需要详细信息,很容易深入了解每个操作,但您不会被它们分心。

#1 是下一个,因为它也简单、直接且易于遵循。您已经在视觉上分离了每个步骤,因此,如果您需要详细信息,则可以使用它们,但很容易跳过任何不立即相关的部分。

我发现#3 既难读又效率低。对我来说,迭代每个项目,完全初始化它比对所有项目执行一个操作,然后是下一个操作,等等更清楚。

于 2013-10-19T13:32:04.200 回答