パラメータ一覧に書くべきものとは？

# プログラミングはもはや一般教養？
>Steve Jobs — computer science is a liberal art, it's something everyone should know how to use, at least — said the true pioneer of smartphones ,the worlds most addictive media ever to be invented.(世界一中毒性の高いメディアであるスマホの真のパイオニアであるスティーブ・ジョブズがプログラミングはもはや一般教養であるべきだと言ってる。当たり前にみんな知っているものであるべきだと。)

Steve Jobsがこの発言をする動画をXで見つけて感銘を受けるとともに正直、きびし〜って思った。これ、（自分の勝手な解釈になるが）工学の学士や資格を持ってなくてもプログラミングしてもいいってことなのではないかと思った。

一応、一般 教養学部（リベラル・アーツではなく、アーツ&サイエンス）の学士を持っている。自分で言ってなんだか新興宗教みたいな胡散臭さがあるなと感じてしまって、恥ずかしい。

なので、”責任感”を持って教養の範囲でだれにでも理解してもらえるように「パラメータ一覧に書くべきものとは？」についてまとめようと思う。

    あくまで個人的な見解であることご了承ください。

# 本題

さて、前稿では可読性を高めるためにパラメータを冒頭に書くといいと言った気がする。ファイル名や何ども登場する定型的なもの（ログメッセージなど）のみでいいと思っていた。しかし、その理由までは深く考えてなかった。本稿ではこれに考察を加えて見ようと思う。

# 考察
機能要件に「何々をどうする」とあったら、目的語と動詞の最小単位に分けられる。この目的語にあたるものをパラメターだと考えたらいい。

前項の「ファイルを検索する」という機能要件は下のように分解する。
>「ファイルを検索する」
→「開始終了メッセージをログに書きこむ」
→「ファイルの中身の一行ずつを最終行まで読み込む」
→「ファイルがあるかどうかをログに書き込む」

![動詞-目的語_図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679069/bcdb319e-a39d-923b-1793-c7616c5307a0.png)

```wakariyasui.bat
REM ;/ 
REM ;/ ファイルを検索する
REM ;/ 
REM ;/ #パラメータ一覧#
REM ;/ ファイル一覧のファイル名
REM ;/ ログファイル名

    set FileList=file_list.txt
    set LogFile=sample_batch.log

REM ;/ 開始ログ
REM ;/ ファイルがある場合、
REM ;/ ファイルが見つかったことをログに書きこむ
REM ;/

    echo %~n0 タスクの開始 :        %DATE%_%TIME%>%LogFile%
    
    if exist %FileList% (
        echo %TIME% :        ファイルがあった %FileList% >>%LogFile%
    ) else (
        echo %TIME% :        ファイルがなかった %FileList% >>%LogFile%
    )


```
パラメターが上の例文の目的語にあたるものだとしたら、必然的にファイルがそれになる。

定型的なことだったらなんでもパラメータに含めてしまえばいいと思われる人が出てきてもおかしくないと思う。例えば、「ファイルがないことをログに書きこむ。また、そのファイル名も含める」際にエラーメッセージとして「”このファイル名”のファイルがありません」を書く処理が必要になる。しかし、これを冒頭に持ってくるきてしまうと一見、なんのプログラムかはわかりにくくなってしまうと思う。下のように書いてもプログラムの挙動になんの支障もない。
```muzukashii.bat
REM ;/ 
REM ;/ ファイルを検索する
REM ;/
REM ;/ 開始ログ
REM ;/ 
    set start_log=タスクを開始する
    set finish_log=タスクを終了する
    set time_stamp= %date%_%time%
    set LogFile=sample_batch.log
    
REM ;/ 
REM ;/ ファイル一覧のファイル名
REM ;/
REM ;/ ファイルがある場合、
REM ;/ ファイルが見つかったことをログに書きこむ
REM ;/
    set FileList=file_list.txt
    set msg_no_file=ファイルがありませんでした
    set msg_yes_file=ファイルがありました

    echo %~n0 %start_log% :        %time_stamp%>%LogFile%
    
    if exist %FileList% (
        echo %time% :        %msg_yes_file% %FileList% >>%LogFile%
    ) else (
        echo %time% :        %msg_no_file% %FileList% >>%LogFile%
    )


```

実際のプログラミング言語は、`動詞-目的語`の機能を最小単位に分断された処理を論理だてる必要がある。条件分岐、再起的な表現が処理の間を点と点を線で繋ぐようなイメージ。さらには、様々な`動詞-目的語`の機能を階層に分けられズラーッと一連のオペレーションとして構成されているものもある。一番下の階層の微細な事柄について冒頭に書いてしまうと、なんだかよくわからなくなるというのが結論。

あと、変数名が思いつかなくなり詰まってしまうという壁にぶつかる。

# さらなる研究
この動詞と目的語を意識して区別するためにパラメータには目的語を書いたらいいことがわかった。この原則はデータ型がリテラルだけではないプログラミング言語を使い始める際や、さらにクラス（前述した階層）を使い始めた際にも役に立つと思う。例えば、こうした微細な事柄についての処理で誤作動が起こった際にどこで間違えたのか一目瞭然でそれを見つけることができる。
```main.ps1
# 敢えてクラスを使い複数のバッチをキックするロジックを実装した
function main {

    param ( 
        [bool]$isSuspend
    )

    # 参照するパラメータ
    $reffVal=[xml](Get-Content -Encoding UTF8 "$PSScriptRoot\refference.xml")

# main :Start from here

    if ($true -eq $isSuspend){
        return '200'
    }

    class main { 
        [string[]]$reffName=@( 
            "subtask_1.ps1"
            ,"subtask_2.ps1"
            ,"subtask_2.ps1"
        )

        [hashtable]$retCode

        [string]$retVal

        main (){
            $this.retCode=@{}
            $this.retVal
        }

        # サブタスクが同じ配下にある前提
        [void]GetReturnCode([string]$reffName){
            $this.retVal=""
            $reffPath = Join-Path $PSScriptRoot $reffName
            . $reffPath
            $funcName= $reffName[0..8] -join ''
            $this.retVal= & $funcName
            $this.retCode[$reffName]=$this.retVal
        }
    }

    $Main = [main]::new()

# main : Return from here

    try { 
        for ($i=0; $i -lt $Main.reffName.Count; $i++){
            $reffName = $Main.reffName[$i]
            $Main.GetReturnCode($reffName)
            if ('100' -ne $Main.retCode[$reffName]){
                $Message = ${get-date -format "yyyy/MM/dd HH:mm:ss"} `
                    +" : "+"`t"+"$reffName でエラーが起きました"
                break 
            }
        }
    }catch{
        return '99999'
    }

    if("" -ne $Message){
        Add-Content -Path $reffVal.logPath.InnerText -Value $Message
        return $Main.retCode[$reffName]
    }
    $retVal=$Main.retVal
    return $retVal
}
```

# 追記
スティーブジョブズ信仰者ならBashやオープンソースを使ったらどうなのかというツッコミをいれたいところも山々かもしれない。

しかし、自分はまだ仕事では使えない。

MicrosoftでもC#やPowershell、Typescriptなどオープンソースを真似して開発している。なので、レガシーシステムを.Netに移行する需要がありそうだと聞いたこともあり、誰でも手軽に始められるPowershellでもいいからとにかく使ってみようと思った。

生まれてはじめて遊んだゲームがMicrosoftフライトシミュレータだったのでそこまで嫌いではない。

だけど、エクセルをTypescriptに書き換えるために知らぬ間にアプデして仕様変更するのはやめてほしい。最近だと勝手にスクロールロックがデフォになった。

あと、vbsのマルウェアが多すぎることもあったのか。
2023年10月にvbsを非推奨にするという発表があった。※2


# 参考

“Steve Jobs: “Computer Science Is a Liberal Art.”” NPR.org, www.npr.org/2011/10/06/141115121/steve-jobs-computer-science-is-a-liberal-art.

※2 マイクロソフトよりvbs非推奨の発表があった
https://learn.microsoft.com/en-us/partner-center/announcements/2023-october