什么是长线太长?

时间:2011-01-15 22:57:42

标签: .net vb.net linq linq-to-objects

这适用于(Visual Basic .NET),但是对于所有LINQ to Object方法和就地标注来说似乎很滑稽。

For Each PNGFile As System.IO.FileInfo In New System.IO.DirectoryInfo(Server.MapPath(".\Archive")).GetFileSystemInfos("*.png", System.IO.SearchOption.AllDirectories).OrderByDescending(Function(f) f.LastWriteTimeUTC).Skip(PageSize * Page).Take(PageSize)
    'Do stuff with PNGFile
Next

我喜欢这一切都在一条线上,我认为它甚至可以为我自己进行逻辑阅读。但我的直觉告诉我,对于下一个不得不解释我的代码的可怜的灵魂来说,这是不可能的。或者是吗?你是如何决定的?将此行拆分为多个其他标注和赋值语句是否值得?你会如何打破这个特定的阵容呢?

我是.NET的新手,但我已经编写了10年以上的代码。到目前为止,我根据创建代码时采用的典型分辨率确定了代码中的最大行长度。这不是决定......的最佳方式。

5 个答案:

答案 0 :(得分:6)

我通常在新的LINQ扩展方法上拆分行,对我来说看起来更干净:

For Each PNGFile As System.IO.FileInfo In New  System.IO.DirectoryInfo(Server.MapPath(".\Archive"))
   .GetFileSystemInfos("*.png",System.IO.SearchOption.AllDirectories)
   .OrderByDescending(Function(f) f.LastWriteTimeUTC)
   .Skip(PageSize * Page)
   .Take(PageSize)
      'Do stuff with PNGFile
Next

答案 1 :(得分:3)

老实说,我真的很讨厌看到这种代码......而不仅仅是因为它是VB;)

你为什么不把它分成几个陈述?它使一切都更容易阅读,并且它也更容易调试,因为你可以查看中间变量。

以下是我的写作方式:

Dim archivePath As String = Server.MapPath(".\Archive")
Dim archiveDir As New System.IO.DirectoryInfo(archivePath)
Dim allFiles = achiveDir.GetFileSystemInfos("*.png", System.IO.SearchOption.AllDirectories)
Dim filesToDisplay = allFiles.OrderBy(Function(f) f.LastWriteTimeUTC)
                             .Skip(PageSize * Page)
                             .Take(PageSize)

For Each PNGFile As System.IO.FileInfo in filesToDisplay
    'Do stuff with PNGFile
Next
恕我直言,一旦你需要超过2秒的时间来理解一行代码,你可以认为它太长了......

答案 2 :(得分:1)

正如BrokenGlass所说,我会打破LINQ扩展:

  For Each PNGFile As System.IO.FileInfo In New  System.IO.DirectoryInfo(Server.MapPath(".\Archive"))
   .GetFileSystemInfos("*.png",System.IO.SearchOption.AllDirectories)
   .OrderByDescending(Function(f) f.LastWriteTimeUTC)
   .Skip(PageSize * Page)
   .Take(PageSize)
      'Do stuff with PNGFile
Next

要扩展您的下一个点,如何确定最大行长度:我选择了两个选项。如果我正在编写的代码是内部代码,或者我知道它将要发生什么,那么我将最大行长度设置为120个字符。如果我写的代码可以全局,我不知道另一个程序员计算机的状态,那么我使用的最大行长度为80个字符。

答案 3 :(得分:1)

将其提升到更一般的水平:

我认为(一行)代码格式正确,当它“容易上眼”时。

在你的例子中,我必须滚动太多,所以我会将它分成更多的行,或多或少类似于BrokenGlass的行为。

当然这是非常主观的,但总的来说,我更喜欢只使用我的眼睛来阅读代码,而不是使用键盘和/或鼠标。

答案 4 :(得分:1)

是的,没有比你看不到的更糟糕的错误,代码就在屏幕边缘的右边。我之前有一些真正的doozies,然后自己发现并制定了一个关于它的Stone Cold Hard Rule。

如果你还没有VB 10,那么你可以使用空格+下划线来打破这一行:

    For Each PNGFile As System.IO.FileInfo _
        In New System.IO.DirectoryInfo("mumble") _
           .GetFileSystemInfos("*.foo")
        '' etcetera
    Next