2018年1月21日日曜日

VB 機能追加とコード見通しの悪さ 考察

何かしらのプログラムを作って、その機能を拡張する事って多いと思います。
後々の拡張を前提に設計してあれば良いのですが ... 。
往々にして、こんな場合には、見通しの悪いコードになっている事が多いものです。
気を付けましょうね。


実は、msdn の ご質問に返信する形で、コードをちょこちょこっと、書きました。
そして書きながら思ったのです。
最初から書いていれば、こんな流れにはならないのだろうな! っと。


その投稿は 2回に渡ります。

https://social.msdn.microsoft.com/Forums/ja-JP/8e669e37-9bf6-4cc5-9f07-f5eaa32f0b5e#2d2f9e0e-87f4-4623-add5-7079ad2f4cb6

https://social.msdn.microsoft.com/Forums/ja-JP/15871804-18c2-48c7-99f8-53f10b59b5c6?forum=vbgeneralja


元々、ご質問者さんが参考になさったコードが在って、 それに機能追加を2回行った形です。
一応、動く事を確認して、上げたのですが ... 。

その時の感想が冒頭に書いた なんかスッキリしない のです。
別の書き方をしたいなぁ~ と思ったのが、正直な感想でした。

只、そうした書き方をすれば、ご質問者さんの混乱を招き兼ねない と思いましたので、
敢えて、この形にしました。
元のコードの 拡張路線 ですね。
大元の構成である、 OpenFileDialog から択一選択されたファイルを元に、
他のファイル群をも扱う形ですね。


今回の経験は、多かれ少なかれ、自分の書いたものでも起こり得る点に、慄いたのです。
あっ、 ぐちゃぐちゃにしている! と。
 (正確には、仕様変更に基づき、ロジックを変えたい欲求に駆られました。)
自分の他のコードに較べれば、今回のものは スパゲッティ度! は低いのですが ... 。
でも、 何か、違うのになぁ~ と 呟く私 がいます。



  重複しますが、そのコードを 引用(再掲) して置きます。

Public Class Form1
    Dim listPics As New List(Of String)
    Dim currentPicIndex As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Form デザイン追加指定
        Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
        Me.PictureBox1.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or AnchorStyles.Left Or AnchorStyles.Right
        Me.upButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right

        'コマンドライン引数処理
        Dim args() As String = GetCmdArgs()
        If args.Count > 0 Then
            listPics.Clear()
            listPics.AddRange(args)
            currentPicIndex = 0
            PictureBox1.Load(listPics(0))
            Dim t = ""      'for Debug Point
        End If
    End Sub

    Private Sub showButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles showButton.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            PictureBox1.Load(OpenFileDialog1.FileName)

            '変数にファイル群取得
            Dim path As String = IO.Path.GetDirectoryName(OpenFileDialog1.FileName)
            Dim files As String() = IO.Directory.GetFiles(path, "*.jpg")
            listPics.Clear()
            listPics.AddRange(files)
            currentPicIndex = listPics.IndexOf(OpenFileDialog1.FileName())
            Dim t = ""      'for Debug Point
        End If

    End Sub

    Private Sub upButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles upButton.Click
        '画像ナシなら何もしない
        If Me.PictureBox1.Image Is Nothing Then
            Exit Sub
        End If
        Dim t = ""      'for Debug Point

        '画像切り替え 戻る
        currentPicIndex = currentPicIndex - 1
        If currentPicIndex < 0 Then
            currentPicIndex = listPics.Count - 1
        End If

        PictureBox1.Load(listPics(currentPicIndex))

    End Sub

    Private Function GetCmdArgs() As String()
        Dim value() As String = Nothing
        Dim valueList As New List(Of String)
        Dim cmdArgs() As String = Environment.GetCommandLineArgs
        Dim cmdArgTxt As New System.Text.StringBuilder
        If cmdArgs.Count > 1 Then
            For i As Integer = 1 To cmdArgs.Count - 1   'First Is AppFile
                If IsMatchTarget(cmdArgs(i)) Then
                    valueList.Add(cmdArgs(i))
                End If
            Next
        End If
        value = valueList.ToArray
        Return value
    End Function

    Private Function IsMatchTarget(ByVal fileName As String) As Boolean
        Dim fileExt() As String = {".jpg", ".jpeg"}   'Set Lower Char.
        Dim value As Boolean = False

        'Check File Exists (For Mistyping)
        If Not IO.File.Exists(fileName) Then
            Return value
            Exit Function
        End If

        'Check File's Extension
        For i As Integer = 0 To fileExt.Count - 1
            If IO.Path.GetExtension(fileName).ToLower = fileExt(i) Then
                value = True
                Exit For
            End If
        Next

        'Check ... If You Need, Add Here
        'If Then
        '
        'End If
        Return value
    End Function

画面設計



0 件のコメント:

コメントを投稿