2011-01-15 4 views
1

Dies funktioniert (Visual Basic .NET) aber scheint komisch lange mit allen LINQ to Object-Methoden und in-place-Dimensionierung.Wann ist eine lange Schlange einfach zu lang?

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 

Ich liebe, dass es alles auf einer Linie ist und ich denke, dass es sogar logisch für mich liest. Aber mein Bauchgefühl sagt mir, dass die Lesbarkeit für die nächste arme Seele, die meinen Code interpretieren muss, nicht existent ist. Oder ist es? Wie entscheidest du dich? Lohnt es sich, diese Zeile in mehrere andere Dimensionierungs- und Zuweisungsanweisungen aufzuteilen? Wie würden Sie diese bestimmte Linie als Beispiel brechen?

Ich bin neu in .NET, aber ich habe Code seit über 10 Jahren geschrieben. Bis heute habe ich meine maximale Zeilenlänge im Code basierend auf der typischen Auflösung bestimmt, die ich beim Erstellen des Codes verwende. Dies kann nicht der beste Weg, um zu entscheiden, ...

Antwort

6

ich in der Regel Trennlinien auf eine neue LINQ-Erweiterungsmethode, ich sieht Reiniger:

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

Ja, jetzt, wo VB können Ihnen Zeilenfortsetzungszeichen in den meisten Fällen elide, einen selten hat eine Entschuldigung für so lange Schlangen. – Gabe

+1

@Gabe: Ich wünschte, ich könnte Ihren Kommentar nur für Ihre Verwendung des Wortes "Elide" upvote.:) – EdGruberman

+0

Ausgezeichnete Idee, es sieht einfach aus, liest intuitiv und vermeidet die Schaffung zusätzlicher "temporärer" Variablen. Ich fühle mich albern, ich dachte nicht daran, das selbst zu tun. – EdGruberman

1

Wie BrokenGlass sagte ich auf der LINQ brechen Erweiterungen:

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 

bei Ihrem nächsten Punkt zu erweitern, wie maximale Leitungslänge zu bestimmen: ich gehe von zwei Möglichkeiten. Wenn der Code, den ich schreibe, intern ist, oder ich weiß, wer es ist, dann setze ich eine maximale Zeilenlänge von 120 Zeichen. Wenn der Code, den ich schreibe, global werden könnte, wo ich den Status eines anderen Programmiercomputers nicht kenne, dann verwende ich eine maximale Zeilenlänge von 80 Zeichen.

+0

Ich mag die Idee einer bestimmten Zeichenanzahl. Wo sind Sie auf 120 und 80 gekommen? Beeinflussen die Voreinstellungen für Schriftgröße und Auflösung diese Faktoren nicht so sehr, dass sie schwer vorherzusagen sind? – EdGruberman

+1

Die ursprünglichen VT100-Terminals hatten eine feste Zeichengröße und eine 80 Zeichen breite Anzeige - als solche war das Maximum von 80 Zeichen eine Art Standard. Sie können es verwenden und müssen sich keine Sorgen darüber machen, dass Zeilen zu lang sind, wo immer Sie Ihren Code verwenden. Für die 120 Zeichen, die immer häufiger als Widescreen-Monitore verwendet werden, beginnt die alte 80-Zeichen-Grenze zu ersetzen. Die Leute benutzen 120, weil es mehr als genug Platz ist, und auch wenn Ihr Code diese Grenze überschreitet, ist es ein guter Hinweis, dass Sie es umgestalten sollten :). Für die Schriftgröße/Auflösung ist das wirklich Sache des Benutzers. – TyrantWave

1

Um es zu einer allgemeineren Ebene zu nehmen:

Ich halte (eine Zeile) Code korrekt formatiert, wenn es „einfach auf das Auge“ ist.

In Ihrem Beispiel muss ich zu viel scrollen, also würde ich es in mehr Zeilen aufteilen, mehr oder weniger ähnlich wie es BrokenGlass tat.

Es ist natürlich sehr subjektiv, aber im Allgemeinen bevorzuge ich Code nur mit meinen Augen zu lesen, nicht mit der Tastatur und/oder Maus.

+0

Ich stimme diesem Konzept zu. Ich denke, die offene Frage ist dann: Ist es möglich, den subjektiven Aufruf in einen technischen zu verwandeln? Manchmal verbringe ich zu viel Zeit damit, über die Codeformatierung nachzudenken, und nicht genug Zeit, die ich wegen der subjektiven Natur von allem denke. Manchmal mache ich sogar mehrere Überarbeitungen des gleichen Codes, bevor ich ihn jemand anderen anschauen lasse, damit er so lesbar wie möglich ist. Wenn es jedoch eine "Best Practice" -Regel gäbe, die ich leicht und offensichtlich anwenden könnte, scheint es, als sollte sie mir die gesamte Revisionszeit ersparen. Vielleicht ist das nur die Natur des Codes? – EdGruberman

3

Ehrlich gesagt, ich hasse es, diese Art von Code zu sehen ... und das nicht nur, weil es VB;)

Warum nicht Sie es in mehrere Aussagen geteilt? Es macht alles einfacher zu lesen, und es ist auch einfacher zu debuggen, weil Sie Zwischenvariablen betrachten können.

Hier ist, wie ich es schreiben würde:

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 

IMHO, sobald Sie mehr als 2 Sekunden zu denken brauchen eine einzige Zeile Code zu verstehen, kann man bedenkt, es ist zu lang ...

+0

es kommt darauf an ... aus einem funktionalen Hintergrund gewöhnt man sich an lange Sequenzen von Funktionen, sogar erwarten Sie – BrokenGlass

+0

Was ich nicht an dieser Lösung gefällt ist, dass Sie am Ende eine Menge von "temporären" Variablen erstellen. Nicht, dass es wirklich von irgendeinem technischen Niveau aus wichtig wäre, aber es scheint mir einfach wie zusätzliches Gepäck zu sein. Ich stimme zu, dass es die Lesbarkeit erhöht. Die Lösung von BrokenGlass, die gesamte Anordnung der Methodentrenner einfach zu durchbrechen, ist intelligent. Ich sehe, dass Sie das hier auch tun, aber ich bin immer noch kein Fan der zusätzlichen Variablen, die Ihr Ansatz beinhaltet. – EdGruberman

+1

Ich bevorzuge temporäre Variablen über den Ausdruck in mehrere Zeilen zu brechen. Wenn die Variablennamen gut gewählt sind, dokumentieren sie die Bedeutung von Teilausdrücken und lassen auch Teilausdrücke debuggen. Die Performance ist wahrscheinlich die gleiche wie die JIT wahrscheinlich temporäre Variablen einführen muss. –

1

Ja, es gibt keinen schlimmeren Bug als den, den man nicht sehen kann, Code, der rechts vom Bildschirmrand liegt. Ich hatte einige echte Tricks, bevor ich das selbst entdeckte und eine steinerne harte Regel darüber machte.

Wenn Sie nicht VB haben 10 noch, dann können Sie Speicherplatz verwenden + unterstreichen die Linie zu brechen:

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