新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。もう新人じゃないかも…

学習記録:データモデリング(2)

[Java] Javaの学習

内容:8章 データモデリング

再利用可能なデータ制約
  • モデル内のデータメンバには、何らかの制約を設ける必要
    • クレジットカードの利率に-5.45などを入力されては困る
    • 利率の設定メソッドにチェックコードを追加する
public void setRate(final Float rate) {
    if ((rate.floatValue() > 1.0f) ||
        (rate.floatValue() < 0.0f)) {
        throw new IllegalArgumentException();
    }
    this.rate = rate;
}
  • 上の例は洗練されていない
    • 再利用ができない、GUIの入力フィールドに制約値を表示したいときは??
  • そこで、制約オブジェクトを作成
制約オブジェクトの作成
  • ConstraintException
    • 検証が失敗した際に発行する実行時例外
    • RuntimeExceptionの拡張、ConstraintExceptionType型の変数exceptionTypeを持つ
    • ConstraintExceptionType:定数クラス(Constraintクラスの拡張)で例外のタイプを表す
    • Constraint:抽象クラス。nameとコンストラクタとgetName()メソッドを持つ
  • 基本型制約クラス
    • int型制約クラス:IntConstraint
    • maxValueとminValueを持ち、getterとvalidate()を持つ
    • 基本型はオブジェクトではないので、全基本型について個別に制約クラスが必要
public class IntConstraint extends Constraint {
	private int minValue;
	private int maxValue;

	protected IntConstraint(final String name, final int minValue,
			final int maxValue) {
		super(name);
		this.minValue = minValue;
		this.maxValue = maxValue;
	}

	public int getMinValue() {
		return this.minValue;
	}

	public int getMaxValue() {
		return this.maxValue;
	}

	public void validate(final int value) {
		if (minValue > value) {
			throw new ConstraintException(
					ConstraintExceptionType.VALUE_BELOW_MINIMUM);
		}
		if (maxValue < value) {
			throw new ConstraintException(
					ConstraintExceptionType.VALUE_ABOVE_MAXIMUM);
		}
	}
}
  • オブジェクト制約クラス:ObjectConstraint
    • Class型のdataTypeとboolean型のoptionalを持つ
    • optionalがtrueなら、null値を認める
package hcj.datamodel.constrains;

public class ObjectConstraint extends Constraint {
	private static final String ERR_PRIMITIVE = "dataTypeは基本型にできません";
	private Class dataType;
	private boolean optional;

		public ObjectConstraint(final String name, final boolean optional,
			final Class dataType) {
		super(name);
		if (dataType.isPrimitive()) {
			throw new IllegalArgumentException(ERR_PRIMITIVE);
		}

		this.optional = optional;
		this.dataType = dataType;
	}

	public Class getDataType() {
		return dataType;
	}

	public boolean isOptional() {
		return optional;
	}

	public void validate(final Object obj) {
		if (obj == null) {
			if (!optional) {
				throw new ConstraintException(
						ConstraintExceptionType.NULL_NOT_ALLOWED);
			}
		} else if (!dataType.isAssignableFrom(obj.getClass())) {
			throw new ConstraintException(
					ConstraintExceptionType.INVALID_DATA_TYPE);
		}
	}
}
  • 数値オブジェクト制約:NumericConstraint
    • ObjectConstraintクラスを拡張
    • minValue/maxValueはNumber型、compareToで比較
永続性