メモ
- スケジュール学習機能の追加は保留。Googleカレンダーで他のスケジュールと一緒に管理した方が全体の学習ボリュームを把握できるので
動員クラス
System・String・Scanner・Integer・Connection・DriverManager・Statement・PreparedStatement・ResultSet・ArrayList・HashMap・Iterator・Exception・Collections・LocalDateTime・Thread
自作クラス
Host
- String table;
- List<Map<String, String>> correct
- prepareGame()
- askBunchs(String tb)
- play(String f1, String f2, String tb, String bunch)
- retry(List<Map<String, String>> extra)
- iterate(String tb, int above)
- question(String type, int size, Iterator<Map<String, String>> itr, List<Map<String, String>> extra)
DAO
- String URL
- String USER
- String PASSWD
- getCats()
- getBunchs(String tb)
- getCards(String f1, String f2, String tb, String bunch)
- recordDates(String tb, String bunch)
- recordMark(String tb, List<Map<String, String>> list, boolean incorrect)
- listMarked(String tb)
- get MarkedCards(String tb, int above)
学んだこと/感じたこと
- 仕様によると ResultSet は値指定よりもインデックス指定の方が効率的。getInt(1);
- 無理に、Map<Integer, Map<String, String>> としなくても +連結で数字を入れても良い
- Mapのキーは、同じだと上書きされる
- DB直接操作する場合はトランザクション利用か、アプリの方の編集機能を通して操作する
- そうしないと、ふとした瞬間にデータ400件が一瞬で消える可能性が0にはならない
- まず、メインメソッド内でやりたい事の脚本をじっくり述語的に練り上げてから始めても良い
- メインを綺麗にまとめようとしたら結局、やりたい事のシンプルな脚本みたいになった
- 脚本のように書くと非常に分かりやすい。そもそも、それがプログラミング(=脚本)だから当然か
- static にするかどうかの判断基準はメソッドスコープを越えるローカル変数を使いたいかどうか
- フィールドとはそのクラス内で使い回したい汎用的なローカル変数、インスタンス変数の事
- ローカル変数を利用するには new でインスタンス変数化の後、this指定して利用する
- このようにすればスコープの外で欲しい値が取り出せる。言語設計で分割強制してる感じか
- 同じ Iterator を複数回ほど利用するときは next と previous を使ってデータを取得する
- 後になってからの変数名の変更はとても面倒なので、一番最初で「永久に決まるもの」とする
- DBでは必要最低限のデータセットVIEWをアプリ用バッファとして作成。データはそこから取得
- SQL文を作成するとき、変数でパラメータを指定している場合は「'」で括る
- エラーがないのに変更が反映されない場合は、該当ソースのコンパイルも忘れない
- toString で節目節目の流れを確認しながら進めていけばエラーの原因は特定できる
- ロジックを1文ずつしっかり読み、流れ全体を完全に理解していればエラーは必ず直せる
- 「break」1つが1時間の問題の解決策だったりする
- ListArrayからはindex指定だけでなく、要素指定でもremoveできる
- ListIterator は、要素を追加できるけど、追加できる場所が「直前」だけなので微妙
- for ですでに回しに入っている要素リストに新しく要素を追加することはできなさそう
- なので、別のコレクションをもう1つ用意してそちらで再度回すことができる
- Git が必要。大きな改善を試みる時ファイルコピーは厳しい。気軽にフォークして試したい
- Git が必要。「DBカテゴリフィールド修正.ver」と「Iterator使わない.ver」が欲しい
- Iteratorで自動的に順次で取り出す方法と、逐一リストからremoveする方法がある
- newを使うのはインスタンスにフィールドを持たせたい時。それまではstaticで十分
- PreparedStatement の「?」はフィールド名ではなくパラメータを指定するもの
- フィールド名を変数で指定したい場合は「+」を使って SQL文を連結させる
- PreparedStatement と通常SQL文を組み合わせて実行
- List<Map<String, String>> とするには Mapを毎回作ってListにaddする
- List型に対する Collections.shuffle による要素シャッフル
- Iteratorによる入れ子構造の要素の取り出し。それぞれの型の指定がポイント
- モニターがもう1台あると便利そう