10月24日(火)1、2コマ目
今日、やったこと
[評価用課題]オークションサイト(.Net版)
今日のホワイトボード
採点して気づいた点を書きました。
1.無駄な変数
2回以上アクセスしないデータのために変数を作らない
以下の変数flgは代入後、1回しか使っていない。
修正版は以下。
2.冗長な処理
同じような処理があちこちにある。
修正版は以下。
3.OracleDataReaderからデータを取り出す
これはまずい。実行時エラーになる可能性がある。
SQL実行直後のOracleDataReaderは検索結果の0行目を参照している。
参照先を1行目に移動するにはRead()を実行する必要がある。
検索結果が0行の場合、Read()はfalseを返すだけでエラーにはならない。
修正版は以下。
検索結果の行数とOracleDataReaderのRead()
〇検索結果が常に0行または1行だけ
1回だけ移動すればいいので、
if(reader.Read())
で1回だけ移動すればOK。
〇検索結果が複数行の可能性がある場合
検索結果の1行目から最終行まで移動する必要があるので、
while(reader.Read())
で検索結果の最初から最後まで移動すること。
この場合、検索結果は複数行になるので、結果の格納先はリストにするべき。
〇検索結果は常に1行1列
SQL実行にExecuteQuery()ではなく、ExecuteScalar()を使うほうが便利。
ExecuteScalar()は検索結果を返すのでDataReaderを使って検索結果を取り出す必要がない。ただし、戻り値はobject型。キャストする必要がある。また、検索結果が無い場合はnullを返す。
〇bool型はtrueかfalseだけ
bool型を返すメソッドの戻り値で条件分岐をする場合、以下のelse if()は不要。
ifの条件式がfalseの場合は自動的にelseブロックにくる。
〇変数名、メソッド名の接頭語について
変数名やメソッド名に下表の接頭語をつけるケースがある。
名前にあった役割どおりに実装すること。
| 接頭語 | 例 | 役割 |
|---|---|---|
| is+形容詞 | isEmpty() | 形容詞か否かをチェック。 isEmpty()なら空白(empty)か否かをチェック。空白(empty)ならtrueを返す。空白以外ならfalseを返す。 |
| has+名詞 | hasUpperCase() | 名詞を含むか否かチェック。 hasUpperCase()なら大文字(UpperCase)を含むか否かをチェック。大文字(UpperCase)を含むならtrueを返す。大文字を含まないならfalseを返す。 |
| has+過去分詞 | hasSaved() | 過去分詞を実行済みかチェック。 hasSaved()なら保存済み(saved)か否かをチェック。保存済み(saved)ならtrueを返す。保存していないならfalseを返す。 |
| can+動詞 | canRemove() | 動詞が実行可能かチェック。 canRemove()なら削除(remove)が可能か否かをチェック。削除(remove)実行可能ならtrueを返す。削除ができないないならfalseを返す。 |
特に論理を逆転させないこと。
canBid()なら入札(Bid)可能ならtrueを返す。
以上、採点して気づいた点です。
とくに「1.無駄な変数」はかなり痛い。 また「3.OracleDataReaderからデータを取り出す」は実行時エラーになる可能性があるので、危険。