バリデーションを関数の中に持たせるべきなのかどうか
April 30, 2022
個人的には結構悩むポイントだったりするので。
/**
* 関数の中にバリデーションを持たせる場合
*/
doJob();
function doJob(data) {
if (!validateData(data)) {
// handle invalid data.
} else {
// do job.
}
}
/**
* 関数を呼び出す側でバリデーションを行う場合
*/
if (validateData(data)) {
doJob(data);
}
function doJob(data) {
// do job.
}
機能的な面でのそれぞれの利点と欠点は以下が考えられます。
- 関数の中にバリデーションを持たせる場合
- 利点:その関数が複数箇所で呼ばれる場合に、呼び出す側で何回もバリデーションを書く必要がない。
- 欠点:その関数が、ある処理の中で複数回呼び出される(ループ処理など)時に、ループの1回目だけバリデーションすれば良いケースであっても毎回実行されることになりパフォーマンスが落ちる。
- 関数を呼び出す側でバリデーションを行う場合
- 利点欠点:上記の逆
調べてみると似たような質問がたくさんあります。
- is it better to test if a function is needed inside or outside of it? - Stack Overflow
- Should validation be inside or outside function? - Software Engineering Stack Exchange
- Determining if a function should execute from outside of it, or inside of it? - Software Engineering Stack Exchange
結局はその関数がどういう使われ方を意図しているのかという責務で判断しましょうということですね。
どうしても決めきれない場合、個人的には関数を呼び出す側でバリデーションを行う形をとる場合が多いです。