先輩「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文を出力してくれると便利だなと思い、
VBAでSQL文をファイルに出力するコードを書いてみた。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」に下記内容が出力される。
出力内容が見にくいし、美しくないコードで悲しいが・・・。
まぁコレから使いやすいように手を加えていこうと思う。