Angepinnt [Sammelthread] Code-Korrektur

  • VB.NET

Es gibt 123 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Ja, stimmt, hab ich total übersehen. Ich hatte i bei einem vorherigen Versuch in Gebrauch und vergessen, die Zeilen rauszunehmen.
    Ich hatte aber noch an die innere If-Schleife gedacht, da sie noch 11 mal durch läuft, wenn das erste Item in der CLB ein Treffer war. Kann man das dann irgendwie abbrechen und das nächte Item im Array zur Überprüfung geben?

    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „rory“ ()

    rory schrieb:

    und das nächte Item im Array zur Überprüfung geben
    Das sieht mir sehr nach Daten-Kuddelmuddel aus.
    Wie heißen deine Checkbox-Items und wie sieht der ungesplittete Text aus?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    CheckBox-Items: HZ, TZ, SO, AB, TI, RS, VS, DP, MU, ZU, PA
    Der ungsplittete Text sieht dann z.B. so aus: HZ;AB;MU;ZU;PA;

    Mit Exit For, wie @petaod und @us4711 vorgeschlagen haben, funktioniert die Sache schon mal auch.
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren
    @rory Jou.
    Das Replace kannst Du auch noch weglassen, dies funktioniert:

    VB.NET-Quellcode

    1. Dim txt = "HZ;AB;MU;ZU;PA;"
    2. Dim split = txt.Split(New Char() {";"c}, StringSplitOptions.RemoveEmptyEntries)
    3. For Each elem As String In split
    4. For x As Integer = 0 To clbBewerbungsart.Items.Count - 1
    5. If clbBewerbungsart.Items(x).ToString = elem Then
    6. clbBewerbungsart.SetItemChecked(x, True)
    7. End If
    8. Next
    9. Next
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Visual Basic-Quellcode

    1. Dim txt = "HZ;AB;MU;ZU;PA;"
    2. Dim split = txt.Split(New Char() {";"c}, StringSplitOptions.RemoveEmptyEntries)
    3. For Each elem As String In split
    4. For x As Integer = 0 To clbBewerbungsart.Items.Count - 1
    5. If clbBewerbungsart.Items(x).ToString() = elem Then
    6. clbBewerbungsart.SetItemChecked(x, True)
    7. Exit For
    8. End If
    9. Next
    10. Next

    (solang es keine Items doppelt gibt)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hey, habe mal das Code Smell Tool Codacy über meinen Code laufen lassen und dabei den Smell angezeigt bekommen, verstehe allerdings nicht was es da zu verbessern gibt:


    Signatur des Konstruktors ist folgende:

    C#-Quellcode

    1. ​public LexingRule (LexingState[] ls, String pattern, Func<string, Match, Token> action)

    8-) faxe1008 8-)
    naja, die ausdrückliche Deklaration unterbindet das Type-Inferring, und macht den Code umständlicher gegenüber Type-Änderungen.
    Und der Code zeigt, dass die Flexiblität anonymer Methoden nicht vollständig bekannt sind.

    Gibs zu: Dasde drauf gestoßen wurdest hat dich bisserl schlauer gemacht, odr?
    Moin !

    Ich habe folgende Aufgabenstellung:
    Es soll einen String in, im Idialfall vorhandenen, Pfad und auch eventuelle Argumente teilen.
    Im String können Anführungszeichen, Leerzeichen und Systemvariablen vorkommen.
    z.B.:

    Quellcode

    1. "%ProgramFiles%\Dummy\Dummy Exe\Dummy.exe"
    2. "C:\Program Files\Dummy\Dummy Exe\Dummy.exe"
    3. "C:\Program Files\Dummy\Dummy Exe\Dummy.exe" -arg -arg2"
    4. C:\Program Files\Dummy\Dummy Exe\Dummy.exe -arg"


    VB.NET-Quellcode

    1. Private Function GetPathAndArgument(ByVal _string As String) As PathAndArgument
    2. Dim originalString As String = _string
    3. _string = _string.Replace("""", "")
    4. If _string.StartsWith("%") Then
    5. Dim environmentVariable As String = _string.Substring(0, _string.IndexOf("%", 1) + 1)
    6. _string = _string.Replace(environmentVariable,
    7. Environment.ExpandEnvironmentVariables(environmentVariable))
    8. End If
    9. Dim splitted() As String = _string.Split(" "c)
    10. Dim splittedLastIndex As Integer = splitted.Length - 1
    11. Dim buildPath, buildArguments As New StringBuilder
    12. Dim path As String = String.Empty
    13. Dim argumentsStartIndex As Integer = 1
    14. Dim fileOrDirectoryExist As Boolean = False
    15. For i As Integer = 0 To splittedLastIndex
    16. buildPath.Append(splitted(i) & " ")
    17. path = buildPath.ToString.TrimEnd
    18. If File.Exists(path) OrElse Directory.Exists(path) Then
    19. argumentsStartIndex += i
    20. fileOrDirectoryExist = True
    21. Exit For
    22. End If
    23. Next
    24. For i As Integer = argumentsStartIndex To splittedLastIndex
    25. buildArguments.Append(splitted(i) & " ")
    26. Next
    27. If fileOrDirectoryExist Then
    28. Return New PathAndArgument(path, buildArguments.ToString.Trim)
    29. Else
    30. Throw New FileOrDirectoryNotFoundException(originalString)
    31. End If
    32. End Function

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Public Class Form1
    4. Private TestString1 As String = """%ProgramFiles%\Dummy\Dummy Exe\Dummy.exe"""
    5. Private TestString2 As String = """C:\Program Files\Dummy\Dummy Exe\Dummy.exe"""
    6. Private TestString3 As String = """C:\Program Files\Dummy\Dummy Exe\Dummy.exe"" -arg -arg2"
    7. Private TestString4 As String = "C:\Program Files\Dummy\Dummy Exe\Dummy.exe -arg"
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. Start(TestString1)
    10. End Sub
    11. Private Sub Start(ByVal _string As String)
    12. Try
    13. Dim pathAndArgument As PathAndArgument = GetPathAndArgument(_string)
    14. Console.WriteLine($"{pathAndArgument.Path} {pathAndArgument.Argument}")
    15. Dim pathFileInfo As New FileInfo(pathAndArgument.Path)
    16. StartProcess(pathFileInfo.DirectoryName, pathFileInfo.FullName, pathAndArgument.Argument)
    17. Catch ex As FileOrDirectoryNotFoundException
    18. Console.WriteLine($"No File/Directory-path found in ""{ex.Message}"".")
    19. End Try
    20. End Sub
    21. Private Sub StartProcess(ByVal _workingDirectory As String,
    22. ByVal _fileName As String,
    23. ByVal _arguments As String)
    24. Dim process As New Process
    25. With process
    26. Dim startInfo As New ProcessStartInfo
    27. With startInfo
    28. .WorkingDirectory = _workingDirectory
    29. .FileName = _fileName
    30. .Arguments = _arguments
    31. End With
    32. .StartInfo = startInfo
    33. .Start()
    34. End With
    35. End Sub
    36. ''' <exception cref="FileOrDirectoryNotFoundException"></exception>
    37. Private Function GetPathAndArgument(ByVal _string As String) As PathAndArgument
    38. Dim originalString As String = _string
    39. _string = _string.Replace("""", "")
    40. If _string.StartsWith("%") Then
    41. Dim environmentVariable As String = _string.Substring(0, _string.IndexOf("%", 1) + 1)
    42. _string = _string.Replace(environmentVariable,
    43. Environment.ExpandEnvironmentVariables(environmentVariable))
    44. End If
    45. Dim splitted() As String = _string.Split(" "c)
    46. Dim splittedLastIndex As Integer = splitted.Length - 1
    47. Dim buildPath, buildArguments As New StringBuilder
    48. Dim path As String = String.Empty
    49. Dim argumentsStartIndex As Integer = 1
    50. Dim fileOrDirectoryExist As Boolean = False
    51. For i As Integer = 0 To splittedLastIndex
    52. buildPath.Append(splitted(i) & " ")
    53. path = buildPath.ToString.TrimEnd
    54. If File.Exists(path) OrElse Directory.Exists(path) Then
    55. argumentsStartIndex += i
    56. fileOrDirectoryExist = True
    57. Exit For
    58. End If
    59. Next
    60. For i As Integer = argumentsStartIndex To splittedLastIndex
    61. buildArguments.Append(splitted(i) & " ")
    62. Next
    63. If fileOrDirectoryExist Then
    64. Return New PathAndArgument(path, buildArguments.ToString.Trim)
    65. Else
    66. Throw New FileOrDirectoryNotFoundException(originalString)
    67. End If
    68. End Function
    69. Private Class PathAndArgument
    70. Public Property Path As String
    71. Public Property Argument As String
    72. Sub New(ByVal _path As String, ByVal _argument As String)
    73. Path = _path
    74. Argument = _argument
    75. End Sub
    76. End Class
    77. End Class
    78. <Serializable>
    79. Friend Class FileOrDirectoryNotFoundException
    80. Inherits Exception
    81. Public Sub New()
    82. End Sub
    83. Public Sub New(message As String)
    84. MyBase.New(message)
    85. End Sub
    86. End Class



    Nun frage ich mich natürlich, was noch besser gemacht werden kann, oder ob eventuell ein anderer Ansatz (von RegEx habe ich keine Ahnung) besser ist. ?(

    Sekundäranliegen:
    Ich versuche code so zu schreiben, daß er möglichst ohne Kommentare gut lesbar ist.
    Wie nahe komme ich dem Versuch ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FormFollowsFunction“ ()

    @FormFollowsFunction Such mal nach "Pfad zerlegen", Du solltest Systemfunktionen nutzen, denn wahrscheinlich schaffst Du es nicht, alle Unmöglichkeiten aufzulisten.
    Pfad zerlegen
    social.msdn.microsoft.com/Foru…zerlegen?forum=windows7de
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    FormFollowsFunction schrieb:

    Ich versuche code so zu schreiben, daß er möglichst ohne Kommentare gut lesbar ist.
    Wie nahe komme ich dem Versuch ?
    Nicht sonderlich - aber das liegt im Auge des Betrachters. Wie ich es machen würde, wenn ich die Aufgabe hätte: Wenn der Code sicher funktioniert - Stichwort Unit Tests - wäre es doch z.B. sinnvoll, wenn sich die PathAndArgument-Klasse selber um die CommandLine kümmert. Daher wäre z.B. der erste Schritt, dass die Funktion GetPathAndArgument in die genannte Klasse verschoben wird. Und am besten gleich umbenannt wird in Parse. Denn das Ding wandelt einen String in die Members der Klasse(ninstanz) um. Nächster Schritt wäre dann, dass die Methode Parse selber nur (z.B.) folgende andere Methoden aufruft (Stichwort IOSP): ParsePath und ParseArguments. Denn das ist eine Kleinigkeit in Deiner bisherigen Namensgebung: die Funktion heißt GetPathAndArgument. Aber sie scheint ja auch mehrere Argumente herauszuextrahieren, wenn ich mir Deine Beispiele anschaue. Und dann werden die Funktionen ggf. noch feiner gemacht, also weiter zerrissen. Und sobald Du mehrere Funktionen hast, die jeweils nur wirklich eine einzige Aufgabe haben (die nicht lautet: "Mach alles ;) !"), wird durch passende Namensgebung jener Funktionen ein Kommentieren des Codes überflüssig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Funktioniert das denn?
    Mir scheint, TestString1 wird failen, wenn ich einen Ordner namens
    C:\Program Files\Dummy\Dummy
    auf Platte habe.

    Die PathAndArgument-Klasse erübrigt sich, wenn man die neumodischen ValueTuples einsetzt:

    VB.NET-Quellcode

    1. Private Sub Start(_string As String)
    2. Dim pathAndArgument = GetPathAndArgument(_string)
    3. Dim pathFileInfo As New FileInfo(pathAndArgument.Path)
    4. StartProcess(pathFileInfo.DirectoryName, pathFileInfo.FullName, pathAndArgument.Argument)
    5. End Sub
    6. Private Function GetPathAndArgument(_string As String) As (Path As String, Argument As String)
    7. '...
    8. Return ("Hihahu.exe", "-arg1 -arg2")
    9. End Sub

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    RodFromGermany schrieb:

    ... Such mal nach "Pfad zerlegen" ...

    Ich will den Pfad gar nicht zerlegen, sondern extrahieren.
    Ich weiß jetzt nicht, worauf du hinaus willst. :huh:

    @VaporiZed
    Ich werde darüber mal etwas senieren.
    PathAndArgument soll aber rein als Datenkontainer fungieren und spähter in einer List(Of PathAndArgument) landen.
    Sooo oversized finde ich die Methode jetzt nicht.
    Mal schauen.

    [edit]

    ErfinderDesRades schrieb:

    Funktioniert das denn?
    Mir scheint, TestString1 wird failen, wenn ich einen Ordner namens
    C:\Program Files\Dummy\Dummy
    auf Platte habe. ...

    Scheint leider nicht nur so, danke für den Hinweis.
    Tuple könnte ich wirklich anstatt der Class verwenden, werde ich mal ausprobieren.
    [/edit]

    Habe ...

    VB.NET-Quellcode

    1. If _string.StartsWith("%") Then
    2. Dim environmentVariable As String = _string.Substring(0, _string.IndexOf("%", 1) + 1)
    3. _string = _string.Replace(environmentVariable,
    4. Environment.ExpandEnvironmentVariables(environmentVariable))
    5. End If

    ... gegen ...

    VB.NET-Quellcode

    1. Dim environmentVariable As String = Regex.Match(_string, "\%[^\]\r\n]+%").Value
    2. If Not environmentVariable = "" Then
    3. _string = _string.Replace(environmentVariable,
    4. Environment.ExpandEnvironmentVariables(environmentVariable))
    5. End If

    ... ausgetausch, um danach festzustellen, daß ...

    VB.NET-Quellcode

    1. _string = Environment.ExpandEnvironmentVariables(_string)

    ... vollkommen ausreicht. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FormFollowsFunction“ ()

    Nun, die Verwendung einer Klasse (hier PathAndArgument) inkl. Methoden und der Verzicht auf ebendiese macht m.E. den Unterschied zwischen prozeduraler Programmierung und objektorientierter Programmierung (inkl. SRP) aus. Eine Entscheidung, der man sich immer wieder bewusst sein sollte. Aber das nur am Rande.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    FormFollowsFunction schrieb:

    Ich weiß jetzt nicht, worauf du hinaus willst.
    Den Pfad in alle seine Bestandteile zerlegen, also { Laufwerk und Verzeichnis }, { Dateiname mit Extension }, { Aufrufparameter }.
    Dann extrahierst Du Deine Bedstandteile: { Laufwerk und Verzeichnis }, { Dateiname mit Extension }.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Habe die Methode neu geschrieben, jetzt müßte sie einigermaßen sicher funktionieren und sie ist auch wesentlich kleiner geworden.
    Der String wird jetzt einfach von hinten durlaufen(String.Substring()), bis File.Exists() bzw. Directory.Exist() True ergibt.
    Damit habe ich dann den Index, an dem der Pfad endet und die Argumente beginnen.

    VB.NET-Quellcode

    1. ''' <exception cref="FileOrDirectoryNotFoundException"></exception>
    2. Private Function ExtractPathAndArgument(ByVal _string As String) As PathAndArgument
    3. Dim originalString As String = _string
    4. _string = Environment.ExpandEnvironmentVariables(_string.Replace("""", ""))
    5. Dim path As String = String.Empty
    6. Dim arguments As String = String.Empty
    7. For i As Integer = _string.Length To 0 Step -1
    8. Dim subString As String = _string.Substring(0, i)
    9. If File.Exists(subString) OrElse Directory.Exists(subString) Then
    10. path = subString.Trim
    11. arguments = _string.Remove(0, i).Trim
    12. Return New PathAndArgument(path, arguments)
    13. End If
    14. Next
    15. Throw New FileOrDirectoryNotFoundException(originalString)
    16. End Function


    @RodFromGermany
    Dafür muß ich den Pfad aber erstmal haben.

    Ich bin jetzt erstmal zufrieden, werde aber bei Zeiten, versuchen das Ganze mit RegEx umzusetzen.
    Ich danke euch und erkläre das hier für erledigt.

    FormFollowsFunction schrieb:

    Dafür muß ich den Pfad aber erstmal haben.
    Was soll das?
    In Deinen Beispielen ist überall ein Pfad vorhanden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!