谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

定義的プログラミング

定義的プログラミングっていう言葉を思いついたから、メモしとく。
イメージ的にはこんなん。


Before: 普通の処理コード

public Dto process(Map<String, String> input) {
	Dto dto = new Dto();
	dto.userName = input.get("ユーザ名");
	dto.password = input.get("パスワード");

	ValidateUtils.checkRequired(dto.userName);
	ValidateUtils.checkLength(dto.userName, 0, 24);
	ValidateUtils.checkRequired(dto.password);
	ValidateUtils.checkLength(dto.password, 8, 24);
	ValidateUtils.checkAlphanumericSymbol(dto.password);


After: 定義的プログラミング

static {
  define("ユーザ名", "userName", REQUIRED, ALPHANUMERIC);
  define("パスワード", "password", NOT_REQUIRED, ALPHANUMERIC_SYMBOL);
}

public static void define(String columnName, String propertyName, FieldType... types) {
	nameMap.put(columnName, propertyName);
	typeMap.put(columnName, types);
}

public T process(Map<String, String> input, Class<T> clazz) {
	// がんばる感じのコード
}


仕様書に載っている表をそのままコードに落とすようなイメージなので
バグが減らせるし、仕様変更にも対応しやすい。
状態遷移のような、複雑な処理ほど効果的だと思う。


自分で実装する時はよくこんな感じにするのだけど、
なかなか後輩には伝えにくかった。
名前をつけておけば伝えやすくなるかなと思って、メモしといた。