引数あれこれ

かつて、一次元配列のソートについて紹介したことがあった。
infoment.hatenablog.com
昨日こちらを眺めていて、「あれ?」と思うことがあったので書いてみる。
f:id:Infoment:20190514185237p:plain

配列ソートのコードを再掲してみる。こんな感じだ。
昇順・降順選択用の列挙型

Public Enum SortOrder
    myAscending
    myDescending
End Enum

配列ソート

Public Function SortSeq(seq As Variant, _
               Optional sort_type As SortOrder = myAscending) As Variant
    Dim aryList As Object
    Dim s As Variant
    Set aryList = CreateObject("System.Collections.ArrayList")
    
    For Each s In seq
        Call aryList.Add(s)
    Next
    
    Select Case sort_type
        Case myAscending
            ' 昇順でソート。
            Call aryList.Sort
        Case myDescending
            ' 昇順でソートののち、降順へ反転。
            Call aryList.Sort
            Call aryList.Reverse
    End Select
    
    SortSeq = aryList.ToArray    
End Function

その昔、私は引数について良く判っていなかった。だから、当時の私がこれを作成したら、恐らく

  1. 昇順ソート用
  2. 降順ソート用

の用途に合わせて決め打ちで作成し、さらにユーザー定義関数としての切り分けもしていなかったことだろう。

例)昇順

Sub サンプル()
    Dim aryList As Object
    Dim s As Variant

    ' 中略
    配列 = なにがしかのデータ範囲
    
    ' 昇順ソート
    Set aryList = CreateObject("System.Collections.ArrayList")
    For Each s In 配列
        Call aryList.Add(s)
    Next
    aryList.Sort
    
    配列 = aryList.ToArray

    ' 後略
End Sub

その後、引数で昇順や降順を選択できるようになるわけだが、このときはEnumの存在を知らないため、再現すればこのようになるだろう。

Public Function SortSeq(seq As Variant, _
               Optional sort_type As Long = 1) As Variant

区別できれば何でもよい訳で、例えばLong型で変数を準備し、

  • 1の場合:昇順
  • 2の場合:降順

のような使い分けをしたに違いない。しかし、1や2という数字に意味はなく、ルールを知らなければ知り得ないものになったことだろう。

そのうちにEnumの存在を知り、冒頭に掲載した内容に落ち着いた。しかし、久しぶりに過去の成果物を見ていて思った。指定が何でも良いなら、既存のメンバーを使えばよいのでは?

Public Function SortSeq(seq As Variant, _
               Optional sort_order As Excel.XlSortOrder = xlAscending) As Variant

これなら、Enumで独自のメンバーを設定する必要が無いし、既存のものであるため、第三者でも迷いなく理解できるなどの効果が期待できる。

Public Function SortSeq(seq As Variant, _
               Optional sort_order As Excel.XlSortOrder = xlAscending) As Variant
    Dim aryList As Object
    Dim s As Variant
    Set aryList = CreateObject("System.Collections.ArrayList")
    
    For Each s In seq
        Call aryList.Add(s)
    Next
    
    Select Case sort_order
        Case xlAscending
            ' 昇順でソート。
            Call aryList.Sort
        Case xlDescending
            ' 昇順でソートののち、降順へ反転。
            Call aryList.Sort
            Call aryList.Reverse
    End Select
    
    SortSeq = aryList.ToArray
End Function

知っている人にとっては、「どうってことない話」かも知れない。しかし、

Optional sort_order As Excel.XlSortOrder = xlAscending

って記述(が出来るようになったこと)は、ノンプログラマーの自分にとってかなり「お洒落」な感じがして嬉しいというか、気に入っている。

所詮は、自己満足かもしれませんが。

参考まで。