目次
・フラグ管理
・外部結合の仕様
現場歴
2021/10/25 〜 現在 (2022/05/21)
業務内容:テスト業務/コード改修/開発
本文
フラグ管理
if文を用いる条件分岐によって処理を変えることはよくあるが、[boolean型]のフラグを1つ追加することにより制御がより簡単になる。
フラグ制御なし
ublic class Main {
/**
* 点数によって処理が変化するMainクラス.
*
* @param nayuta
*/
public static void main(String[] args) {
int score = 60;
Main main = new Main();
// 国語のテスト
String Lresult = main.languageResult(score);
System.out.println(Lresult);
// 数学のテスト
String Mresult = main.mathResult(score);
System.out.println(Mresult);
// 理科のテスト
String Sresult = main.scienceResult(score);
System.out.println(Sresult);
// 英語のテスト
String Eresult = main.englishResult(score);
System.out.println(Eresult);
// 社会のテスト
String result = main.socialStudiesResult(score);
System.out.println(result);
}
public String languageResult(int score) {
if(score >= 60) {
return "合格";
} else {
return "不合格";
}
}
public String mathResult(int score) {
if(score >= 60) {
return "合格";
} else {
return "不合格";
}
}
public String scienceResult(int score) {
if(score >= 60) {
return "合格";
} else {
return "不合格";
}
}
public String englishResult(int score) {
if(score >= 60) {
return "合格";
} else {
return "不合格";
}
}
public String socialStudiesResult(int score) {
if(score >= 60) {
return "合格";
} else {
return "不合格";
}
}
}
フラグ制御あり
public class Main {
/**
* 点数によって処理が変化するMainクラス.
*
* @param nayuta
*/
public static void main(String[] args) {
int score = 60;
Main main = new Main();
boolean passFlg = main.pathResult(score);
// 国語のテスト
String Lresult = main.languageResult(passFlg);
System.out.println(Lresult);
// 数学のテスト
String Mresult = main.mathResult(passFlg);
System.out.println(Mresult);
// 理科のテスト
String Sresult = main.scienceResult(passFlg);
System.out.println(Sresult);
// 英語のテスト
String Eresult = main.englishResult(passFlg);
System.out.println(Eresult);
// 社会のテスト
String result = main.socialStudiesResult(passFlg);
System.out.println(result);
}
public boolean pathResult(int score) {
boolean flg = false;
if(score >= 60) {
flg = true;
return flg;
} else {
flg = false;
return flg;
}
}
public String languageResult(boolean passFlg) {
if(passFlg) {
return "合格";
} else {
return "不合格";
}
}
public String mathResult(boolean passFlg) {
if(passFlg) {
return "合格";
} else {
return "不合格";
}
}
public String scienceResult(boolean passFlg) {
if(passFlg) {
return "合格";
} else {
return "不合格";
}
}
public String englishResult(boolean passFlg) {
if(passFlg) {
return "合格";
} else {
return "不合格";
}
}
public String socialStudiesResult(boolean passFlg) {
if(passFlg) {
return "合格";
} else {
return "不合格";
}
}
}
上手なコードの例が出てこなかったが、メリットはフラグ制御によって「変数による条件結果」が1つにまとまる点である。デバック実行時のコードの流れがよく分かるため、運用・保守も行いやすい。更に、if文の制御をフラグでおこなうため [if文(冗長なコード)] ということにはならない。
また、「とある条件の時だけデータを削除する」というような間違いが起きてはならない処理の場合、もともとのフラグを[false]にしておき「とある条件を満たした時だけ」[true]に変更するようにしておけば誤処理が発生し辛い。
外部結合の仕様
まずは外部結合と内部結合の違いについてだが、内部結合と外部結合の違い
に書かれている説明がわかりやすいため引用させていただく。
内部結合:両方のテーブルに存在するデータを抽出する結合
外部結合:基準となるテーブルに存在すれば抽出する結合
もっと簡単に言えば、内部結合の場合は「カラムが1つでも[NULL]になると駄目」だが、外部結合は「カラムが[NULL]になっても問題ない」ということ。
現場にて以下のような指示を受けた。
・△△テーブルから「Aカラム」「Bカラム」、××テーブルから「Cカラム」を出力するSQL文を作成すること
・「Bカラム」は[NULL]になっても問題ない。
SELECT
△△テーブル.Aカラム
, △△テーブル.Bカラム
, ××テーブル.Cカラム
FROM
△△テーブル
LEFT OUTER JOIN ××テーブル
ON △△テーブル.hoge = ××テーブル.hoge
WHERE
設計書に従い、両テーブルに対する条件を記述
DBの状況から[NULL]の状態の「Bカラム」が出力されるはずが、上記のようなSQL文ではどうしても予想通りの結果は得られなかった。
原因の結論から言うと、△△テーブルの条件は結合条件に記述しなければならなかったためである。
結合元の出力条件を結合条件に記述しなかった場合「結合したあとのテーブル結果から、[WHERE句]で両方のテーブルにて指定した条件でふるいをかけられている状態」で、結合元の出力条件を結合条件に記述した場合は「結合したあとのテーブル結果から、結合先の出力条件を[WHERE句]で指定している状態」である。
正しくは以下のようなSQLになる。
SELECT
△△テーブル.Aカラム
, △△テーブル.Bカラム
, ××テーブル.Cカラム
FROM
△△テーブル
LEFT OUTER JOIN ××テーブル
ON △△テーブル.hoge = ××テーブル.hoge
AND △△テーブル の出力条件
WHERE
××テーブル の出力条件
参考文献
内部結合と外部結合の違い
SQL JOINの結合条件とWHEREの条件の違いと使い分け
参考になりました。
ありがとうございました。