这适用于(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年以上的代码。到目前为止,我根据创建代码时采用的典型分辨率确定了代码中的最大行长度。这不是决定......的最佳方式。
答案 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