先輩「if文使うなんてダセープログラム書くんじゃねーよ!」

さて、4年前ぐらいにタイトルで書いたようなことを先輩に言われた訳ですが、その時はそのまま流してしまいました。
俺はSEって言ってもインフラ系でプログラムをあんまり書きません。
そんな訳で当時は何となくだけど、if文はコストがかかる(実行速度が遅くなる?)から出来るだけ使うなよ、って意味で解釈しました。
でも内心、if文使わなかったらどうやって条件分岐するんだよ!って思っていました。

最近、折角この業界にいるんだから、プログラムぐらいサラッと書ける方が
カッコイイなと思ってプログラムを書いて遊んでいた所、if文を使わない条件分岐の方法を知りました。目からウロコです。

どうやるかって言うと、「多重配列を使えばいいんです!」
はい。リピートアフタミー。
「多重配列を使えばいいんです!」

具体的にどうするかは、下に書きます。例としてジャンケンをするプログラムをPHPで書きました。
まずは、if文を使ったジャンケンプログラム。ちょっとif文を使い過ぎで大げさですがw

<?php
$my_hand = gou;
$you_hand = cho;

if ($my_hand == "gou"){
    if ($you_hand == "cho"){
        $result = "win";
    }elseif ($you_hand == "par"){
        $result = "lost";
    }else{
        $result = "darw";
    }
}elseif ($my_hand == "cho"){
    if ($you_hand == "cho"){
        $result = "darw";
    }elseif ($you_hand == "par"){
        $result = "win";
    }else{
        $result = "lost";
    }
}else{
    if ($you_hand == "cho"){
        $result = "lost";
    }elseif ($you_hand == "par"){
        $result = "darw";
    }else{
        $result = "win";
    }
}
print $result;
?>

次は、多重配列を使ったジャンケンプログラム。

<?php
$my_hand = par;
$you_hand = cho;

$janken = array('gou' => array( 'cho' => 'win', 'par' => 'lost', 'gou' => 'darw'),
                'cho' => array( 'cho' => 'darw', 'par' => 'win', 'gou' => 'lost'),
                'par' => array( 'cho' => 'lost', 'par' => 'darw', 'gou' => 'win')
                );

$result = $janken[$my_hand][$you_hand];

print $result;
?>

おおー。これを知った時はちょっと感動しました!プログラミングおもしれー。
アルゴリズムやデータ構造の勉強してみよっかな〜。

Excelのテーブル定義書からVBAを使ってSQL文を出力する(MySQL用)

Excelで作ったテーブル定義書から、サクっとcreate table文を出力してくれると便利だなと思い、
VBASQL文をファイルに出力するコードを書いてみた。MySQL用ね。

まずは、こんな感じの表を用意する。



下記コードを記入する。

Sub WriteFile()
    Dim TB_name As String      'テーブル名称(英語)
    Dim a(1000) As String      '項目名称(英語)
    Dim b(1000) As String      'データ型
    Dim c(1000) As String      'Size
    Dim d(1000) As String      'Null
    Dim strFileName As String  '出力ファイル
    Dim intFileNo As Integer
    
    TB_name = ActiveSheet.Cells(2, 3).Value
    strFileName = "C:\tmp\create_" & TB_name & ".sql"
    intFileNo = FreeFile
    
    '項目数を確認
    j = 3
    Do
        j = j + 1
        If IsEmpty(ActiveSheet.Cells(j, 3).Value) Then Exit Do
    Loop
    
    'ファイル出力
    Open strFileName For Output As #intFileNo
    Print #intFileNo, "create table "; TB_name; " ("
    
    '項目1からn-1まで出力(n=最終行)
    For i = 4 To j - 2
        a(i) = ActiveSheet.Cells(i, 3).Value
        b(i) = ActiveSheet.Cells(i, 4).Value
        c(i) = ActiveSheet.Cells(i, 5).Value
        d(i) = ActiveSheet.Cells(i, 6).Value
                
        If c(i) = "" Then
        Else
            c(i) = "(" & c(i) & ")"
        End If
                        
        If d(i) = "N" Then
            d(i) = "NOT NULL"
        End If
        
        b(i) = b(i) & c(i)
        
        Print #intFileNo, a(i); " "; b(i); " "; d(i); ","
        
    Next
    
    '項目最終行出力(n=最終行)
    a(i) = ActiveSheet.Cells(j - 1, 3).Value
    b(i) = ActiveSheet.Cells(j - 1, 4).Value
    c(i) = ActiveSheet.Cells(j - 1, 5).Value
    d(i) = ActiveSheet.Cells(j - 1, 6).Value
        
    If c(i) = "" Then
    Else
        c(i) = "(" & c(i) & ")"
    End If

    If d(i) = "N" Then
        d(i) = "NOT NULL"
    End If
    
    b(i) = b(i) & c(i)
    
    Print #intFileNo, a(i); " "; b(i); " "; d(i);
    Print #intFileNo, vbNewLine; ") type=InnoDB;"

    Close intFileNo
End Sub

実行すると「C:\tmp\create_TB_TEST.sql」に下記内容が出力される。



出力内容が見にくいし、美しくないコードで悲しいが・・・。
まぁコレから使いやすいように手を加えていこうと思う。