2011-01-15 2 views
1

Это работает (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 лет. На сегодняшний день я определил максимальную длину строки в коде на основе типичного разрешения, которое я использую при создании кода. Это не может быть лучшим способом решить ...

ответ

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 
+2

Да, теперь, VB позволяет игнорировать линии продолжения символов в большинстве случаев, один редко имеет оправдание для таких длинных линий. – Gabe

+1

@Gabe: Я хочу, чтобы я мог поддержать ваш комментарий только для вашего использования слова «elide».:) – EdGruberman

+0

Отличная идея, она выглядит просто, читает интуитивно и позволяет создавать дополнительные «временные» переменные. Я чувствую себя глупо, что сам не думал об этом. – EdGruberman

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 символов.

+0

Мне нравится идея определенного количества символов. Откуда у вас 120 и 80? Не влияет ли размер шрифта и параметры разрешения на эти факторы до такой степени, что их слишком сложно предсказать? – EdGruberman

+1

Оригинальные терминалы VT100 имели фиксированный размер символа и дисплей шириной 80 символов - как таковой, максимум 80 символов был своего рода стандартом. Вы можете использовать его и не беспокоиться о том, что линии слишком длинны, где бы вы ни использовали ваш код. Для 120 символов, поскольку широкоэкранные мониторы становятся все более распространенными, он начинает заменять старый предел 80 символов. Люди используют 120, потому что это более чем достаточно места, а также, если ваш код преодолеет этот предел, это хороший признак, что вы должны его реорганизовать :). Для размера шрифта/разрешения это действительно зависит от пользователя. – TyrantWave

1

Чтобы принять его на более общем уровне:

Я считаю (строка) код отформатирован, когда это «легко на глаз».

В вашем примере мне нужно прокрутить слишком много, поэтому я разделил бы его на несколько строк, более или менее похожих на то, как это сделал BrokenGlass.

Это очень субъективно, но в целом я предпочитаю читать код, используя только мои глаза, а не используя клавиатуру и/или мышь.

+0

Я согласен с этой концепцией. Я думаю, что выдающийся вопрос заключается в следующем: возможно ли включить субъективный вызов в технический? Иногда я провожу слишком много времени, думая о форматировании кода, и не хватает времени на кодирование, я думаю, из-за субъективной природы всего этого. Я даже иногда делаю несколько изменений одного и того же кода, прежде чем я позволю кому-то еще посмотреть на него, чтобы он был максимально читабельным. Если, однако, существует правило «лучшей практики», которое я мог бы использовать легко и явно, похоже, что это должно спасти меня за все время пересмотра. Может быть, это только характер кода? – EdGruberman

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 секунд, чтобы понять строку кода, вы можете считать, что это слишком долго ...

+0

это зависит ... исходя из функционального фона, вы привыкаете к длинным последовательностям функций, даже ожидаете его – BrokenGlass

+0

Что мне не нравится в этом решении, так это то, что вы создаете множество «временных» переменных. Не то, чтобы это действительно имело значение с любого технического уровня, но для меня это просто лишний багаж. Я согласен, что это повышает читаемость. Но решение BrokenGlass просто разбивать всю линейку на разделители методов является разумным. Я вижу, что вы тоже это делаете, но я все еще не поклонник дополнительных переменных, к которым относится ваш подход. – EdGruberman

+1

Я на самом деле предпочитаю временные переменные, чтобы разбить выражение на несколько строк. Если имена переменных хорошо выбраны, они документируют значение подвыражений, а также позволяют отлаживать подвыражения. Производительность, вероятно, такая же, как JIT, вероятно, придется вводить временные переменные в любом случае. –

1

Да, нет худшей ошибки, кроме той, которую вы не видите, кода, который находится справа от края экрана. У меня были какие-то настоящие doozies, прежде чем я узнал об этом и сделаю Stone Hard Hard Rule об этом.

Если вы не VB 10 еще, то вы можете использовать пространство + подчеркивания, чтобы разорвать строку:

For Each PNGFile As System.IO.FileInfo _ 
     In New System.IO.DirectoryInfo("mumble") _ 
      .GetFileSystemInfos("*.foo") 
     '' etcetera 
    Next 
Смежные вопросы