如何防止重复代码

时间:2014-05-29 15:48:01

标签: c#

我是一名初学程序员,感觉我正在重复代码(DownloadFiles()),如下例所示:

var files = DownloadFiles();
var retryCount = 0;

while (files == null && retryCount < 3)
{
    retryCount++; 
    Console.WriteLine("Retrying {0} time", retryCount);
    files = DownloadFiles();       
}

我的应用程序基本上是通过HttpWebrequest`下载文件,并且如果没有检索到文件,则应该重试下载3次。

我需要你的专家意见:

我正在使用DownloadFiles()

重复代码

这段代码能否更有效地编写?

这看似微不足道,但我想开发出良好的编程实践。

5 个答案:

答案 0 :(得分:1)

你可以使用do ... while作为Ben Aaronson的建议:

TypeOfFiles files;
var retryCount = 0;

do
{
    files = DownloadFiles();       

    if (retryCount > 0)
    {
        Console.WriteLine("Retrying {0} time", retryCount);
    }
}
while (files == null && retryCount++ < 3)

我将retryCount++移到了while内,所以你的号码没有下降(相比之下,在循环中这样做了。)

答案 1 :(得分:1)

另一种方法是:

List<File> files;  // replace with whatever type files is
var retryCount = 0;

while ((files = DownloadFiles()) == null && retryCount < 3)
{
    retryCount++; 
    Console.WriteLine("Retrying {0} time", retryCount);
}

答案 2 :(得分:0)

您没有重复您的代码,您已经在方法中封装了下载逻辑,并且您正在循环使用此方法。

不好的事情是内联DownloadFiles方法或展开while循环。

答案 3 :(得分:0)

??? files; //type returned by the function
var retryCount = 0;

do 
{
    files = DownloadFiles();

    if (retryCount > 0)
        Console.WriteLine("Retrying {0} time", retryCount);       
} while (files == null && retryCount++ < 3)

答案 4 :(得分:0)

for循环可能看起来更整洁:

var files = DownloadFiles();

for (int retryCount = 0; files == null && retryCount < 3; retryCount++)
{
    Console.WriteLine("Retrying {0} time", retryCount);
    files = DownloadFiles();       
}

修改:另外: 我通常讨厌&#34;魔术数字&#34; - 没有上下文的常量,例如比较中的3,因为它使代码不易维护。如果您想让用户选择重试次数,则尤其如此。我通常会使用类似的东西:

const maxRetries = 3;

retryCount < maxRetries

在循环中,但这是辩论。