高校2年までは生徒会だ,写真部だと高校生らしい日々をエンジョイしすぎていたこうしろうだが,3年の夏になると,一気に受験に向けての勉強に時間を使い出した。夏休みはほぼ毎朝7時過ぎに自転車で学校に向かい,夜は19時半を過ぎたころに帰宅する。高校の学習室が閉まると,市の図書館にある学習室で暗くなるまで勉強をしていたらしい。
そんなに続けて勉強した経験のない父は「大丈夫か?」と思うのだが,慣れるとあまり苦にならないものらしい。もっとも,同じ高校に通っている幼馴染の友人と大学受験という共通のテーマを取り戻し,いろいろ話をしている時間が結構楽しいのかもしれない。
Eclipse+Visual Editorで作っているカメラ台帳も夏の終わりにはなんとか形になってきた。
メーカー名にNikonを選択してMySQLデータベースからレコードを取得,JTableに追加したところである。このように紹介すると一応それらしく見えるのだが,JTableをクリアしていないので,検索するたびに行数が増えるという明らかなバグがある。
検索するときに購入年,月を必ず指定しなければいけない面倒くささは「高校生が同じ月に何台もカメラを買えるのか?」と突っ込みたくなる。もちろん,まだアルファバージョンでもないので,これから直していくのだろうが,登録時には正規表現による入力値の検証も組み込んでほしい。
9月10日 私は隣でVisual C#2005をいじりながら,こうしろうがプログラムを作る様子を見ていた。
JTableに一覧を表示するところで悩んでいたようだ。どこかと言うとタイプという項目である。
MySQLデータベースにはテーブルを二つ作成してある。
ERダイヤグラムらしく書いてみた。ちょっとテーブル名がふさわしくない気がするが,モデルが一対多の多側で台帳に記載するカメラそのものを表している。メーカーはNikonやCanonだ。テーブルをjoinすればメーカー名は表示できる。しかし,デジカメやフィルムというタイプはテーブルにはしていなかったのである。
で,こうしろうがタイプ名を表示するために最初に書いたコードがひどい。
---------------------------------------------------------- if(rs.getInt("type_id") == 1){ data[cols++] = "デジカメ"; }else if(rs.getInt("type_id") == 2){ data[cols++] = "フィルム"; }else if(rs.getInt("type_id") == 3){ data[cols++] = "インスタント"; }else if(rs.getInt("type_id") == 4){ data[cols++] = "その他"; }else { data[cols++] = ""; } ----------------------------------------------------------Ifの嵐。疲れて思考能力が衰えているのか,せめてSwitch文ぐらい使ってほしかった。「疲れるとIFの嵐」,初級者にはありがちだ。
「連想配列使ってみれば」と言うとしばらくググって「HashTableけ?」と聞く。そうJavaだとHashTableとかHashMapが便利である。「Keyと値を持てるから,IDと名前しかないテーブルをそのまま表現できるよ」と答える。
---------------------------------------------------------- Hashtable genre_hash = new Hashtable(); genre_hash.put("1","デジカメ"); genre_hash.put("2","フィルム"); genre_hash.put("3","インスタント"); genre_hash.put("4","その他"); ----------------------------------------------------------こうしろうの書いたコードはまず,genre_hash(ジャンル・ハッシュ)を生成して,keyと値をputする。タイプなのかジャンルなのか「はっきりせい」という突っ込みもおいておこう。
---------------------------------------------------------- data[cols++] = genre_hash.get(Integer.toString(rs.getInt("type_id"))); ----------------------------------------------------------If文の嵐が1行になった。それは喜ばしいが,根がまじめなのかどうもまどろっこしい。type_idフィールドはint型なので文字型に変換してから,keyとして使っている。値が正しく表示されているから,これでもいいのだが,どうせなら次のほうが簡単だ。
---------------------------------------------------------- Hashtable genre_hash = new Hashtable(); genre_hash.put(1,"デジカメ"); genre_hash.put(2,"フィルム"); genre_hash.put(3,"インスタント"); genre_hash.put(4,"その他"); ----------------------------------------------------------Keyだから文字列でないといけないわけではない。数字にしてしまえば,取り出すコードは簡単になる。
---------------------------------------------------------- data[cols++] = genre_hash.get(rs.getInt("type_id")); ----------------------------------------------------------常にもっと楽な方法はないかと考えてほしい。
おっと,それなら普通の配列にして添字+1でタイプ名を取り出せばいいじゃんという突っ込みはご遠慮願いたい。