受託開発担当のRyuです。

コーディング中には些細な悩みが絶えません。
今回はそんな些細な悩みの一つを考えてみようと思います。

A

void func(int[] array) {
	if (array == null) {
		break;
	}
	
	array = calc(array);
	insert(array);
}

int[] calc(int[] array) {
	for (int i = 0; i < array.length; i++) {
		// なんらかの加工処理
		array[i] = array[i] + 1;
	}
	return array;
}

void insert(int[] array) {
	for (int i = 0; i < array.length; i++) {
		// 登録処理
		...
	}
}

B

void func(int[] array) {
	array = calc(array);
	insert(array);
}

int[] calc(int[] array) {
	if (array == null) {
		break;
	}
	
	for (int i = 0; i < array.length; i++) {
		// なんらかの加工処理
		array[i] = array[i] + 1;
	}
	return array;
}

void insert(int[] array) {
	if (array == null) {
		break;
	}
	
	for (int i = 0; i < array.length; i++) {
		// 登録処理
		...
	}
}

さて、いきなり似たようなコードを2つ出しましたがこの2種類のコードが今回の些細な悩み事です。

if (array == null) {
	break;
}

この句を一体何処に書けばよいのか私は常に迷い続けています。
Aのほうは重複部分が無くコンパクトに纏まっているように見えます。
ですがこちらは今後なんらかの事情で派生クラスでoverrideによる関数書き換えが必要になった(例えばcalc関数がarray=nullを許容する修正など)場合、呼び出し元のfuncクラスも書き換えなければなりません。
Bのほうはコードの重複がありますが、同クラス内での関数の再利用には便利そうです。
calc、insert関数共に呼ぶ回数が増えれば増えるほど、毎回nullチェックが必要なAに比べて記述量が減ります。

良く使用する関数ならB、そうでないならAを選ぶのが無難なのでしょうがコーディング中に判断がしにくいことも多々あります。
またこれにnullチェックのみならず要素数0チェックを入れるかどうかも判断の難しいところです。

些細な悩みは常に絶えませんが小さなことを小さなことと放って置かずに、丁寧に処理することで良いコードになるといいなと思います。