0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

現場に出て学んだこと 1

Posted at

目次

・フラグ管理
・外部結合の仕様

現場歴

2021/10/25 〜 現在 (2022/05/21)
 業務内容:テスト業務/コード改修/開発

本文

フラグ管理

if文を用いる条件分岐によって処理を変えることはよくあるが、[boolean型]のフラグを1つ追加することにより制御がより簡単になる。

フラグ制御なし

flg.java
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 "不合格";
		}
	}
}

フラグ制御あり

flg.java
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]になっても問題ない。

join.sql
SELECT
  △△テーブル.Aカラム
  , △△テーブル.Bカラム
  , ××テーブル.Cカラム
FROM
  △△テーブル
  LEFT OUTER JOIN ××テーブル
  ON △△テーブル.hoge = ××テーブル.hoge
WHERE
  設計書に従い、両テーブルに対する条件を記述

DBの状況から[NULL]の状態の「Bカラム」が出力されるはずが、上記のようなSQL文ではどうしても予想通りの結果は得られなかった。

原因の結論から言うと、△△テーブルの条件は結合条件に記述しなければならなかったためである。

結合元の出力条件を結合条件に記述しなかった場合「結合したあとのテーブル結果から、[WHERE句]で両方のテーブルにて指定した条件でふるいをかけられている状態」で、結合元の出力条件を結合条件に記述した場合は「結合したあとのテーブル結果から、結合先の出力条件を[WHERE句]で指定している状態」である。

正しくは以下のようなSQLになる。

join.sql
SELECT
  △△テーブル.Aカラム
  , △△テーブル.Bカラム
  , ××テーブル.Cカラム
FROM
  △△テーブル
  LEFT OUTER JOIN ××テーブル
  ON △△テーブル.hoge = ××テーブル.hoge
  AND △△テーブル の出力条件
WHERE
  ××テーブル の出力条件

参考文献

内部結合と外部結合の違い

SQL JOINの結合条件とWHEREの条件の違いと使い分け

参考になりました。
ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?